danger 9.5.0 → 9.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 67fd79bdc597c9e9f26f590ad3ca50c045cbd9a543225ac53d66ba174ba20ff5
4
- data.tar.gz: 1ba194d96a1eb7a0b430270e2d129df3de3989e904833bba703e672f27973c91
3
+ metadata.gz: 17279e83964586e1eef46c40740b9c0fb839ea85a3c3d367a898c9b664767eca
4
+ data.tar.gz: 6afc0eb2cb97f22d988bf56cb0fe48063aa5eab060471cff2d95c0bc8435b3da
5
5
  SHA512:
6
- metadata.gz: 4cd4fdc164a74ffd74b20cf9cbe1b0472d515f848ea6e0da9cfad60587d1aef1c09fe0bda83bbfa6d666fba51213f1c6613774597b9c1624b43facae2ff57200
7
- data.tar.gz: f35871a565daf2296a1493ced5b9536d2b0aa385ac8acdfeff0301f247628424ba645c2c51b7ac2d2026307d07c7ae4da11ef6239a889175a85be21c0807ec6b
6
+ metadata.gz: ee7544abd31b5bd6320efdc79668169d0c5bfc0aa873b2d971bdfb043ab08bd3e05149ddc714cbcd98257c7bd0c815e4899afd573c33ff5d815626fdf01c1c01
7
+ data.tar.gz: fbe7c247fee1a41cb6e212141896f7282547f91f8ad0b59f36ae18bab2e32783e1b3ff22db1231e30e6bb5d3feaa98aea67099f114eaa9a45e30dc2478d562b0
@@ -38,7 +38,8 @@ module Danger
38
38
  Danger::RequestSources::GitHub,
39
39
  Danger::RequestSources::BitbucketServer,
40
40
  Danger::RequestSources::BitbucketCloud,
41
- Danger::RequestSources::VSTS
41
+ Danger::RequestSources::VSTS,
42
+ Danger::RequestSources::GitLab
42
43
  ]
43
44
  end
44
45
 
@@ -74,7 +75,8 @@ module Danger
74
75
 
75
76
  def find_remote_info(env)
76
77
  if given_pull_request_url?(env)
77
- FindRepoInfoFromURL.new(env["LOCAL_GIT_PR_URL"]).call
78
+ pr_url = env["LOCAL_GIT_PR_URL"] || env["LOCAL_GIT_MR_URL"]
79
+ FindRepoInfoFromURL.new(pr_url).call
78
80
  else
79
81
  FindRepoInfoFromLogs.new(
80
82
  env["DANGER_GITHUB_HOST"] || "github.com",
@@ -85,15 +87,16 @@ module Danger
85
87
 
86
88
  def find_pull_request(env)
87
89
  if given_pull_request_url?(env)
90
+ remote_url = env["LOCAL_GIT_PR_URL"] || env["LOCAL_GIT_MR_URL"]
88
91
  PullRequestFinder.new(
89
92
  remote_info.id,
90
93
  remote_info.slug,
91
94
  remote: true,
92
- remote_url: env["LOCAL_GIT_PR_URL"]
95
+ remote_url: remote_url
93
96
  ).call(env: env)
94
97
  else
95
98
  PullRequestFinder.new(
96
- env.fetch("LOCAL_GIT_PR_ID") { "" },
99
+ env.fetch("LOCAL_GIT_PR_ID") { env.fetch("LOCAL_GIT_MR_ID") { "" } },
97
100
  remote_info.slug,
98
101
  remote: false,
99
102
  git_logs: run_git("log --oneline -1000000")
@@ -102,7 +105,8 @@ module Danger
102
105
  end
103
106
 
104
107
  def given_pull_request_url?(env)
105
- env["LOCAL_GIT_PR_URL"] && !env["LOCAL_GIT_PR_URL"].empty?
108
+ (env["LOCAL_GIT_PR_URL"] && !env["LOCAL_GIT_PR_URL"].empty?) ||
109
+ (env["LOCAL_GIT_MR_URL"] && !env["LOCAL_GIT_MR_URL"].empty?)
106
110
  end
107
111
 
108
112
  def sha
@@ -31,7 +31,9 @@ module Danger
31
31
  else
32
32
  matched = url.match(REGEXP)
33
33
  if matched
34
- RepoInfo.new(matched[:slug], matched[:id])
34
+ # Clean up the slug to remove any trailing dashes or slashes that might be part of the GitLab URL format
35
+ clean_slug = matched[:slug].gsub(%r{[-/]+$}, "")
36
+ RepoInfo.new(clean_slug, matched[:id])
35
37
  end
36
38
  end
37
39
  end
@@ -81,6 +81,12 @@ module Danger
81
81
  remote_pull_request.head.sha,
82
82
  remote_pull_request.base.sha
83
83
  )
84
+ when :gitlab
85
+ RemotePullRequest.new(
86
+ remote_pull_request.iid.to_s,
87
+ remote_pull_request.diff_refs.head_sha,
88
+ remote_pull_request.diff_refs.base_sha
89
+ )
84
90
  when :vsts
85
91
  RemotePullRequest.new(
86
92
  remote_pull_request[:pullRequestId].to_s,
@@ -93,7 +99,13 @@ module Danger
93
99
  end
94
100
 
95
101
  def find_remote_pull_request(env)
96
- client(env).pull_request(repo_slug, specific_pull_request_id)
102
+ scm_provider = find_scm_provider(remote_url)
103
+
104
+ if scm_provider == :gitlab
105
+ client(env).merge_request(repo_slug, specific_pull_request_id)
106
+ else
107
+ client(env).pull_request(repo_slug, specific_pull_request_id)
108
+ end
97
109
  end
98
110
 
99
111
  def both_present?
@@ -138,35 +150,61 @@ module Danger
138
150
 
139
151
  case scm_provider
140
152
  when :bitbucket_cloud
141
- require "danger/request_sources/bitbucket_cloud_api"
142
- branch_name = ENV["DANGER_BITBUCKET_TARGET_BRANCH"] # Optional env variable (specifying the target branch) to help find the PR.
143
- RequestSources::BitbucketCloudAPI.new(repo_slug, specific_pull_request_id, branch_name, env)
144
-
153
+ bitbucket_cloud_client(env)
145
154
  when :bitbucket_server
146
- require "danger/request_sources/bitbucket_server_api"
147
- project, slug = repo_slug.split("/")
148
- RequestSources::BitbucketServerAPI.new(project, slug, specific_pull_request_id, env)
149
-
155
+ bitbucket_server_client(env)
150
156
  when :vsts
151
- require "danger/request_sources/vsts_api"
152
- RequestSources::VSTSAPI.new(repo_slug, specific_pull_request_id, env)
153
-
157
+ vsts_client(env)
158
+ when :gitlab
159
+ gitlab_client(env)
154
160
  when :github
155
- require "octokit"
156
- access_token = ENV["DANGER_GITHUB_API_TOKEN"]
157
- bearer_token = ENV["DANGER_GITHUB_BEARER_TOKEN"]
158
- if bearer_token && !bearer_token.empty?
159
- Octokit::Client.new(bearer_token: bearer_token, api_endpoint: api_url)
160
- elsif access_token && !access_token.empty?
161
- Octokit::Client.new(access_token: access_token, api_endpoint: api_url)
162
- else
163
- raise "No API token given, please provide one using `DANGER_GITHUB_API_TOKEN` or `DANGER_GITHUB_BEARER_TOKEN`"
164
- end
161
+ github_client(env)
165
162
  else
166
163
  raise "SCM provider not supported: #{scm_provider}"
167
164
  end
168
165
  end
169
166
 
167
+ def bitbucket_cloud_client(env)
168
+ require "danger/request_sources/bitbucket_cloud_api"
169
+ branch_name = ENV["DANGER_BITBUCKET_TARGET_BRANCH"] # Optional env variable (specifying the target branch) to help find the PR.
170
+ RequestSources::BitbucketCloudAPI.new(repo_slug, specific_pull_request_id, branch_name, env)
171
+ end
172
+
173
+ def bitbucket_server_client(env)
174
+ require "danger/request_sources/bitbucket_server_api"
175
+ project, slug = repo_slug.split("/")
176
+ RequestSources::BitbucketServerAPI.new(project, slug, specific_pull_request_id, env)
177
+ end
178
+
179
+ def vsts_client(env)
180
+ require "danger/request_sources/vsts_api"
181
+ RequestSources::VSTSAPI.new(repo_slug, specific_pull_request_id, env)
182
+ end
183
+
184
+ def gitlab_client(env)
185
+ require "gitlab"
186
+ token = env&.fetch("DANGER_GITLAB_API_TOKEN", nil) || ENV["DANGER_GITLAB_API_TOKEN"]
187
+ if token && !token.empty?
188
+ endpoint = env&.fetch("DANGER_GITLAB_API_BASE_URL", nil) || env&.fetch("CI_API_V4_URL", nil) || ENV["DANGER_GITLAB_API_BASE_URL"] || ENV.fetch("CI_API_V4_URL", "https://gitlab.com/api/v4")
189
+ Gitlab.client(endpoint: endpoint, private_token: token)
190
+ else
191
+ raise "No API token given, please provide one using `DANGER_GITLAB_API_TOKEN`"
192
+ end
193
+ end
194
+
195
+ def github_client(env)
196
+ require "octokit"
197
+ access_token = env&.fetch("DANGER_GITHUB_API_TOKEN", nil) || ENV["DANGER_GITHUB_API_TOKEN"]
198
+ bearer_token = env&.fetch("DANGER_GITHUB_BEARER_TOKEN", nil) || ENV["DANGER_GITHUB_BEARER_TOKEN"]
199
+ if bearer_token && !bearer_token.empty?
200
+ Octokit::Client.new(bearer_token: bearer_token, api_endpoint: api_url)
201
+ elsif access_token && !access_token.empty?
202
+ Octokit::Client.new(access_token: access_token, api_endpoint: api_url)
203
+ else
204
+ raise "No API token given, please provide one using `DANGER_GITHUB_API_TOKEN` or `DANGER_GITHUB_BEARER_TOKEN`"
205
+ end
206
+ end
207
+
170
208
  def api_url
171
209
  ENV.fetch("DANGER_GITHUB_API_HOST") do
172
210
  ENV.fetch("DANGER_GITHUB_API_BASE_URL") do
@@ -182,6 +220,8 @@ module Danger
182
220
  :bitbucket_server
183
221
  elsif remote_url =~ /\.visualstudio\.com/i || remote_url =~ /dev\.azure\.com/i
184
222
  :vsts
223
+ elsif remote_url =~ /gitlab\.com/ || remote_url =~ %r{-/merge_requests/}
224
+ :gitlab
185
225
  else
186
226
  :github
187
227
  end
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "danger/commands/local_helpers/http_cache"
4
+ require "danger/commands/local_helpers/pry_setup"
5
+ require "faraday/http_cache"
6
+ require "fileutils"
7
+ require "gitlab"
8
+ require "tmpdir"
9
+
10
+ module Danger
11
+ class MR < Runner
12
+ self.summary = "Run the Dangerfile locally against GitLab Merge Requests. Does not post to the MR. Usage: danger mr <URL>"
13
+ self.command = "mr"
14
+
15
+ def self.options
16
+ [
17
+ ["--clear-http-cache", "Clear the local http cache before running Danger locally."],
18
+ ["--pry", "Drop into a Pry shell after evaluating the Dangerfile."],
19
+ ["--dangerfile=<path/to/dangerfile>", "The location of your Dangerfile"]
20
+ ]
21
+ end
22
+
23
+ def initialize(argv)
24
+ show_help = true if argv.arguments == ["-h"]
25
+
26
+ @mr_url = argv.shift_argument
27
+ @clear_http_cache = argv.flag?("clear-http-cache", false)
28
+ dangerfile = argv.option("dangerfile", "Dangerfile")
29
+
30
+ # Currently CLAide doesn't support short option like -h https://github.com/CocoaPods/CLAide/pull/60
31
+ # when user pass in -h, mimic the behavior of passing in --help.
32
+ argv = CLAide::ARGV.new ["--help"] if show_help
33
+
34
+ super
35
+
36
+ @dangerfile_path = dangerfile if File.exist?(dangerfile)
37
+
38
+ if argv.flag?("pry", false)
39
+ @dangerfile_path = PrySetup.new(cork).setup_pry(@dangerfile_path, MR.command)
40
+ end
41
+ end
42
+
43
+ def validate!
44
+ super
45
+ unless @dangerfile_path
46
+ help! "Could not find a Dangerfile."
47
+ end
48
+ unless @mr_url
49
+ help! "Could not find a merge-request. Usage: danger mr <URL>"
50
+ end
51
+ end
52
+
53
+ def run
54
+ ENV["DANGER_USE_LOCAL_GIT"] = "YES"
55
+ ENV["LOCAL_GIT_MR_URL"] = @mr_url if @mr_url
56
+
57
+ configure_gitlab(ENV["DANGER_TMPDIR"] || Dir.tmpdir)
58
+
59
+ env = EnvironmentManager.new(ENV, cork)
60
+ dm = Dangerfile.new(env, cork)
61
+
62
+ LocalSetup.new(dm, cork).setup(verbose: verbose) do
63
+ dm.run(
64
+ Danger::EnvironmentManager.danger_base_branch,
65
+ Danger::EnvironmentManager.danger_head_branch,
66
+ @dangerfile_path,
67
+ nil,
68
+ nil,
69
+ nil,
70
+ false
71
+ )
72
+ end
73
+ end
74
+
75
+ private
76
+
77
+ def configure_gitlab(cache_dir)
78
+ # setup caching for GitLab calls to avoid hitting the API rate limit too quickly
79
+ cache_file = File.join(cache_dir, "danger_local_gitlab_cache")
80
+ HTTPCache.new(cache_file, clear_cache: @clear_http_cache)
81
+
82
+ # Configure GitLab client
83
+ Gitlab.configure do |config|
84
+ config.endpoint = ENV["DANGER_GITLAB_API_BASE_URL"] || ENV.fetch("CI_API_V4_URL", "https://gitlab.com/api/v4")
85
+ config.private_token = ENV["DANGER_GITLAB_API_TOKEN"]
86
+ end
87
+ end
88
+ end
89
+ end
@@ -6,6 +6,7 @@ module Danger
6
6
  require "danger/commands/staging"
7
7
  require "danger/commands/systems"
8
8
  require "danger/commands/pr"
9
+ require "danger/commands/mr"
9
10
 
10
11
  # manually set claide plugins as a subcommand
11
12
  require "claide_plugin"
@@ -329,7 +329,7 @@ module Danger
329
329
  is_markdown_content = kind == :markdown
330
330
  emoji = { warning: "warning", error: "no_entry_sign", message: "book" }[kind]
331
331
 
332
- messages.reject do |m|
332
+ messages.reject do |m| # rubocop:todo Metrics/BlockLength
333
333
  next false unless m.file && m.line
334
334
 
335
335
  position = find_position_in_diff diff_lines, m, kind
@@ -395,7 +395,7 @@ module Danger
395
395
  is_markdown_content = kind == :markdown
396
396
  emoji = { warning: "warning", error: "no_entry_sign", message: "book" }[kind]
397
397
 
398
- messages.reject do |m|
398
+ messages.reject do |m| # rubocop:todo Metrics/BlockLength
399
399
  next false unless m.file && m.line
400
400
  # Reject if it's out of range and in dismiss mode
401
401
  next true if dismiss_out_of_range_messages_for(kind) && is_out_of_range(mr_changes.changes, m)
@@ -185,7 +185,7 @@ module Danger
185
185
  is_markdown_content = kind == :markdown
186
186
  emoji = { warning: "warning", error: "no_entry_sign", message: "book" }[kind]
187
187
 
188
- messages.reject do |m|
188
+ messages.reject do |m| # rubocop:todo Metrics/BlockLength
189
189
  next false unless m.file && m.line
190
190
 
191
191
  # Once we know we're gonna submit it, we format it
@@ -144,13 +144,16 @@ module Danger
144
144
  return unless from_is_ref || to_is_ref
145
145
 
146
146
  depth = 0
147
- (3..6).any? do |factor|
147
+ (3..6).each do |factor|
148
148
  depth += Math.exp(factor).to_i
149
149
 
150
150
  git_fetch_branch_to_depth(from, depth) if from_is_ref
151
151
  git_fetch_branch_to_depth(to, depth) if to_is_ref
152
- possible_merge_base(repo, from, to)
152
+ merge_base = possible_merge_base(repo, from, to)
153
+ return merge_base if merge_base
153
154
  end
155
+
156
+ nil
154
157
  end
155
158
 
156
159
  def possible_merge_base(repo, from, to)
@@ -1,4 +1,4 @@
1
1
  module Danger
2
- VERSION = "9.5.0".freeze
2
+ VERSION = "9.5.2".freeze
3
3
  DESCRIPTION = "Like Unit Tests, but for your Team Culture.".freeze
4
4
  end
metadata CHANGED
@@ -1,16 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: danger
3
3
  version: !ruby/object:Gem::Version
4
- version: 9.5.0
4
+ version: 9.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Orta Therox
8
8
  - Juanito Fatas
9
- autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2024-08-03 00:00:00.000000000 Z
11
+ date: 2025-07-03 00:00:00.000000000 Z
13
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: base64
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.2'
14
27
  - !ruby/object:Gem::Dependency
15
28
  name: claide
16
29
  requirement: !ruby/object:Gem::Requirement
@@ -43,16 +56,22 @@ dependencies:
43
56
  name: colored2
44
57
  requirement: !ruby/object:Gem::Requirement
45
58
  requirements:
46
- - - "~>"
59
+ - - ">="
47
60
  - !ruby/object:Gem::Version
48
61
  version: '3.1'
62
+ - - "<"
63
+ - !ruby/object:Gem::Version
64
+ version: '5'
49
65
  type: :runtime
50
66
  prerelease: false
51
67
  version_requirements: !ruby/object:Gem::Requirement
52
68
  requirements:
53
- - - "~>"
69
+ - - ">="
54
70
  - !ruby/object:Gem::Version
55
71
  version: '3.1'
72
+ - - "<"
73
+ - !ruby/object:Gem::Version
74
+ version: '5'
56
75
  - !ruby/object:Gem::Dependency
57
76
  name: cork
58
77
  requirement: !ruby/object:Gem::Requirement
@@ -105,30 +124,42 @@ dependencies:
105
124
  name: git
106
125
  requirement: !ruby/object:Gem::Requirement
107
126
  requirements:
108
- - - "~>"
127
+ - - ">="
109
128
  - !ruby/object:Gem::Version
110
129
  version: '1.13'
130
+ - - "<"
131
+ - !ruby/object:Gem::Version
132
+ version: '3.0'
111
133
  type: :runtime
112
134
  prerelease: false
113
135
  version_requirements: !ruby/object:Gem::Requirement
114
136
  requirements:
115
- - - "~>"
137
+ - - ">="
116
138
  - !ruby/object:Gem::Version
117
139
  version: '1.13'
140
+ - - "<"
141
+ - !ruby/object:Gem::Version
142
+ version: '3.0'
118
143
  - !ruby/object:Gem::Dependency
119
144
  name: kramdown
120
145
  requirement: !ruby/object:Gem::Requirement
121
146
  requirements:
122
- - - "~>"
147
+ - - ">="
148
+ - !ruby/object:Gem::Version
149
+ version: 2.5.1
150
+ - - "<"
123
151
  - !ruby/object:Gem::Version
124
- version: '2.3'
152
+ version: '3.0'
125
153
  type: :runtime
126
154
  prerelease: false
127
155
  version_requirements: !ruby/object:Gem::Requirement
128
156
  requirements:
129
- - - "~>"
157
+ - - ">="
130
158
  - !ruby/object:Gem::Version
131
- version: '2.3'
159
+ version: 2.5.1
160
+ - - "<"
161
+ - !ruby/object:Gem::Version
162
+ version: '3.0'
132
163
  - !ruby/object:Gem::Dependency
133
164
  name: kramdown-parser-gfm
134
165
  requirement: !ruby/object:Gem::Requirement
@@ -157,6 +188,20 @@ dependencies:
157
188
  - - ">="
158
189
  - !ruby/object:Gem::Version
159
190
  version: '4.0'
191
+ - !ruby/object:Gem::Dependency
192
+ name: pstore
193
+ requirement: !ruby/object:Gem::Requirement
194
+ requirements:
195
+ - - "~>"
196
+ - !ruby/object:Gem::Version
197
+ version: '0.1'
198
+ type: :runtime
199
+ prerelease: false
200
+ version_requirements: !ruby/object:Gem::Requirement
201
+ requirements:
202
+ - - "~>"
203
+ - !ruby/object:Gem::Version
204
+ version: '0.1'
160
205
  - !ruby/object:Gem::Dependency
161
206
  name: terminal-table
162
207
  requirement: !ruby/object:Gem::Requirement
@@ -166,7 +211,7 @@ dependencies:
166
211
  version: '1'
167
212
  - - "<"
168
213
  - !ruby/object:Gem::Version
169
- version: '4'
214
+ version: '5'
170
215
  type: :runtime
171
216
  prerelease: false
172
217
  version_requirements: !ruby/object:Gem::Requirement
@@ -176,7 +221,7 @@ dependencies:
176
221
  version: '1'
177
222
  - - "<"
178
223
  - !ruby/object:Gem::Version
179
- version: '4'
224
+ version: '5'
180
225
  description: Stop Saying 'You Forgot To…' in Code Review
181
226
  email:
182
227
  - orta.therox@gmail.com
@@ -243,6 +288,7 @@ files:
243
288
  - lib/danger/commands/local_helpers/http_cache.rb
244
289
  - lib/danger/commands/local_helpers/local_setup.rb
245
290
  - lib/danger/commands/local_helpers/pry_setup.rb
291
+ - lib/danger/commands/mr.rb
246
292
  - lib/danger/commands/plugins/plugin_json.rb
247
293
  - lib/danger/commands/plugins/plugin_lint.rb
248
294
  - lib/danger/commands/plugins/plugin_readme.rb
@@ -315,7 +361,6 @@ homepage: https://github.com/danger/danger
315
361
  licenses:
316
362
  - MIT
317
363
  metadata: {}
318
- post_install_message:
319
364
  rdoc_options: []
320
365
  require_paths:
321
366
  - lib
@@ -330,8 +375,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
330
375
  - !ruby/object:Gem::Version
331
376
  version: '0'
332
377
  requirements: []
333
- rubygems_version: 3.5.14
334
- signing_key:
378
+ rubygems_version: 3.6.2
335
379
  specification_version: 4
336
380
  summary: Like Unit Tests, but for your Team Culture.
337
381
  test_files: []