danger 8.2.3 → 8.4.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cd811a6fad28534b9e0b28ccbed30d0694e4ab3408ad22852a8897a56c55f2ed
4
- data.tar.gz: 747e7a6ff6fce272eb7b732ced8f6358602159725e5490a3ce783f7ce06dcc83
3
+ metadata.gz: 423862c4ae06fbd90dbc52ae126b171c3af53da1867f6051db5e1e00cd1cb09e
4
+ data.tar.gz: 45d13ff59705d33a756f8a221ef597f8c29f534511a9cd310241d2730b118e59
5
5
  SHA512:
6
- metadata.gz: 54612a3b0e7999fce7289a884febff1548edbfa92af9947a8c8cc4bbef5fa69451ac88b493bc2ba0125e23ef96f7a46846a7a3b1e7adb8ac4d8f98aafa0065ce
7
- data.tar.gz: 6612a1c511c7fe579c2734f6b4c8b15955dc2a2dd196a4a0277a901d61307b58c2abdd7f000867c1f212d2db065b39c8dfcd9f83c774154b1089a37395f45096
6
+ metadata.gz: 3a1e23473e3012edb47a6860ca50a4e0e12512ade5c2796b79720c71ba049c034060893505a5264df3ee36439ae702dffe1cc9472da4e6357d2cef7ba81e24b8
7
+ data.tar.gz: 4e186a0412277f4d3add84821f39529900c9faec5439ccd62329bc24e6a753c19feafe68208f9ff3b7fe8b12e64ba8b31379b7af5273f24dfa230ec804f12648
@@ -19,7 +19,11 @@ module Danger
19
19
  #
20
20
  class AzurePipelines < CI
21
21
  def self.validates_as_ci?(env)
22
- env.key?("AGENT_ID") && env["BUILD_REPOSITORY_PROVIDER"] != "TfsGit"
22
+ # AGENT_ID is being used by AppCenter as well, so checking here to make sure AppCenter CI doesn't get a false positive for AzurePipelines
23
+ # Anyone working with AzurePipelines could provide a better/truly unique env key to avoid checking for AppCenter
24
+ !Danger::Appcenter::validates_as_ci?(env) &&
25
+ env.key?("AGENT_ID") &&
26
+ env["BUILD_REPOSITORY_PROVIDER"] != "TfsGit"
23
27
  end
24
28
 
25
29
  def self.validates_as_pr?(env)
@@ -45,7 +45,7 @@ module Danger
45
45
  end
46
46
 
47
47
  def supported_request_sources
48
- @supported_request_sources ||= [Danger::RequestSources::GitHub, Danger::RequestSources::GitLab]
48
+ @supported_request_sources ||= [Danger::RequestSources::GitHub, Danger::RequestSources::GitLab, Danger::RequestSources::BitbucketServer]
49
49
  end
50
50
  end
51
51
  end
@@ -0,0 +1,58 @@
1
+ # https://docs.codemagic.io/building/environment-variables/
2
+
3
+ module Danger
4
+ # ### CI Setup
5
+ #
6
+ # Add a script step to your workflow:
7
+ #
8
+ # ```
9
+ # - name: Running Danger
10
+ # script: |
11
+ # bundle install
12
+ # bundle exec danger
13
+ # ```
14
+ #
15
+ # ### Token Setup
16
+ #
17
+ # Add the following environment variables to your workflow's environment configuration.
18
+ # https://docs.codemagic.io/getting-started/yaml/
19
+ #
20
+ # #### GitHub
21
+ # Add the `DANGER_GITHUB_API_TOKEN` to your build user's ENV.
22
+ #
23
+ # #### GitLab
24
+ # Add the `DANGER_GITLAB_API_TOKEN` to your build user's ENV.
25
+ #
26
+ # #### Bitbucket Cloud
27
+ # Add the `DANGER_BITBUCKETSERVER_USERNAME`, `DANGER_BITBUCKETSERVER_PASSWORD`
28
+ # to your build user's ENV.
29
+ #
30
+ # #### Bitbucket server
31
+ # Add the `DANGER_BITBUCKETSERVER_USERNAME`, `DANGER_BITBUCKETSERVER_PASSWORD`
32
+ # and `DANGER_BITBUCKETSERVER_HOST` to your build user's ENV.
33
+ #
34
+ class Codemagic < CI
35
+ def self.validates_as_ci?(env)
36
+ env.key? "FCI_PROJECT_ID"
37
+ end
38
+
39
+ def self.validates_as_pr?(env)
40
+ return !env["FCI_PULL_REQUEST_NUMBER"].to_s.empty?
41
+ end
42
+
43
+ def supported_request_sources
44
+ @supported_request_sources ||= [
45
+ Danger::RequestSources::GitHub,
46
+ Danger::RequestSources::GitLab,
47
+ Danger::RequestSources::BitbucketServer,
48
+ Danger::RequestSources::BitbucketCloud
49
+ ]
50
+ end
51
+
52
+ def initialize(env)
53
+ self.pull_request_id = env["FCI_PULL_REQUEST_NUMBER"]
54
+ self.repo_slug = env["FCI_REPO_SLUG"]
55
+ self.repo_url = GitRepo.new.origins # Codemagic doesn't provide a repo url env variable for n
56
+ end
57
+ end
58
+ end
@@ -133,7 +133,7 @@ module Danger
133
133
  matches = change_url.match(%r{(.+)\/pull\/[0-9]+})
134
134
  matches[1] unless matches.nil?
135
135
  when %r{\/merge_requests\/} # GitLab
136
- matches = change_url.match(%r{(.+)\/merge_requests\/[0-9]+})
136
+ matches = change_url.match(%r{(.+?)(\/-)?\/merge_requests\/[0-9]+})
137
137
  matches[1] unless matches.nil?
138
138
  when %r{\/pull-requests\/} # Bitbucket
139
139
  matches = change_url.match(%r{(.+)\/pull-requests\/[0-9]+})
@@ -137,7 +137,7 @@ module Danger
137
137
 
138
138
  def client
139
139
  scm_provider = find_scm_provider(remote_url)
140
-
140
+
141
141
  case scm_provider
142
142
  when :bitbucket_cloud
143
143
  require "danger/request_sources/bitbucket_cloud_api"
@@ -151,8 +151,15 @@ module Danger
151
151
 
152
152
  when :github
153
153
  require "octokit"
154
- Octokit::Client.new(access_token: ENV["DANGER_GITHUB_API_TOKEN"], api_endpoint: api_url)
155
-
154
+ access_token = ENV["DANGER_GITHUB_API_TOKEN"]
155
+ bearer_token = ENV["DANGER_GITHUB_BEARER_TOKEN"]
156
+ if bearer_token && !bearer_token.empty?
157
+ Octokit::Client.new(bearer_token: bearer_token, api_endpoint: api_url)
158
+ elsif access_token && !access_token.empty?
159
+ Octokit::Client.new(access_token: access_token, api_endpoint: api_url)
160
+ else
161
+ raise "No API token given, please provide one using `DANGER_GITHUB_API_TOKEN` or `DANGER_GITHUB_BEARER_TOKEN`"
162
+ end
156
163
  else
157
164
  raise "SCM provider not supported: #{scm_provider}"
158
165
  end
@@ -0,0 +1,38 @@
1
+ module Danger
2
+ # ### CI Setup
3
+ #
4
+ # In order to work with Xcode Cloud and Danger, you will need to add `bundle exec danger` to
5
+ # the `ci_scripts/ci_post_xcodebuild.sh` (Xcode Cloud's expected filename for a post-action build script).
6
+ # More details and documentation on Xcode Cloud configuration can be found [here](https://developer.apple.com/documentation/xcode/writing-custom-build-scripts).
7
+ #
8
+ # ### Token Setup
9
+ #
10
+ # You will need to add the `DANGER_GITHUB_API_TOKEN` to your build environment.
11
+ # If running on GitHub Enterprise, make sure you also set the expected values for
12
+ # both `DANGER_GITHUB_API_HOST` and `DANGER_GITHUB_HOST`.
13
+ #
14
+ class XcodeCloud < CI
15
+ def self.validates_as_ci?(env)
16
+ env.key? "CI_XCODEBUILD_ACTION"
17
+ end
18
+
19
+ def self.validates_as_pr?(env)
20
+ env.key? "CI_PULL_REQUEST_NUMBER"
21
+ end
22
+
23
+ def supported_request_sources
24
+ @supported_request_sources ||= [
25
+ Danger::RequestSources::GitHub,
26
+ Danger::RequestSources::GitLab,
27
+ Danger::RequestSources::BitbucketCloud,
28
+ Danger::RequestSources::BitbucketServer
29
+ ]
30
+ end
31
+
32
+ def initialize(env)
33
+ self.repo_slug = env["CI_PULL_REQUEST_SOURCE_REPO"]
34
+ self.pull_request_id = env["CI_PULL_REQUEST_NUMBER"]
35
+ self.repo_url = env["CI_PULL_REQUEST_HTML_URL"]
36
+ end
37
+ end
38
+ end
@@ -17,10 +17,5 @@
17
17
  <%= current %>
18
18
  <%# the previous line has to be aligned far to the left, otherwise markdown can break easily %>
19
19
  <%- end -%>
20
- <%# We need to add the generated_by_ to identify comments from danger. But with inlines %>
21
- <%# it might be a little annoying, so we set on the table, but if we have markdown we add the footer anyway %>
22
- <%- if @markdowns.count > 0 -%>
23
- <p align="right" data-meta="generated_by_<%= @danger_id %>">
24
- Generated by :no_entry_sign: <a href="http://danger.systems/">Danger</a>
25
- </p>
26
- <%- end -%>
20
+ <%# Add the generated_by_ as a html coment to identify comments from danger. %>
21
+ <!-- "generated_by_<%= @danger_id %>" -->
@@ -143,6 +143,14 @@ module Danger
143
143
  @github.issue_json["labels"].map { |l| l[:name] }
144
144
  end
145
145
 
146
+ # @!group PR Metadata
147
+ # Whether the PR is a Draft.
148
+ # @return [Boolean]
149
+ #
150
+ def pr_draft?
151
+ pr_json["mergeable_state"] == "draft"
152
+ end
153
+
146
154
  # @!group PR Commit Metadata
147
155
  # The branch to which the PR is going to be merged into.
148
156
  # @return [String]
@@ -131,6 +131,22 @@ module Danger
131
131
  @gitlab.mr_diff
132
132
  end
133
133
 
134
+ # @!group MR Changes
135
+ # The array of changes
136
+ # @return [Array<Gitlab::ObjectifiedHash>]
137
+ #
138
+ def mr_changes
139
+ @gitlab.mr_changes.changes
140
+ end
141
+
142
+ # @!group MR Closes issues
143
+ # The array of issues that this MR closes
144
+ # @return [Array<Gitlab::ObjectifiedHash>]
145
+ #
146
+ def mr_closes_issues
147
+ @gitlab.mr_closes_issues
148
+ end
149
+
134
150
  # @!group MR Commit Metadata
135
151
  # The branch to which the MR is going to be merged into
136
152
  # @deprecated Please use {#branch_for_base} instead
@@ -148,7 +148,7 @@ module Danger
148
148
  def generate_description(warnings: nil, errors: nil, template: "github")
149
149
  emoji_mapper = EmojiMapper.new(template)
150
150
  if errors.empty? && warnings.empty?
151
- return "All green. #{random_compliment}"
151
+ return ENV['DANGER_SUCCESS_MESSAGE'] || "All green. #{random_compliment}"
152
152
  else
153
153
  message = "#{emoji_mapper.map('warning')} "
154
154
  message += "#{'Error'.danger_pluralize(errors.count)}. " unless errors.empty?
@@ -10,7 +10,7 @@ module Danger
10
10
  "bitbucket_server" => {
11
11
  "no_entry_sign" => ":no_entry_sign:",
12
12
  "warning" => ":warning:",
13
- "book" => ":book:",
13
+ "book" => ":blue_book:",
14
14
  "white_check_mark" => ":white_check_mark:"
15
15
  }
16
16
  }.freeze
@@ -20,10 +20,12 @@ module Danger
20
20
  end
21
21
 
22
22
  def self.optional_env_vars
23
- ["DANGER_BITBUCKETSERVER_CODE_INSIGHTS_REPORT_KEY",
24
- "DANGER_BITBUCKETSERVER_CODE_INSIGHTS_REPORT_TITLE",
25
- "DANGER_BITBUCKETSERVER_CODE_INSIGHTS_REPORT_DESCRIPTION",
26
- "DANGER_BITBUCKETSERVER_CODE_INSIGHTS_REPORT_LOGO_URL"
23
+ [
24
+ "DANGER_BITBUCKETSERVER_CODE_INSIGHTS_REPORT_KEY",
25
+ "DANGER_BITBUCKETSERVER_CODE_INSIGHTS_REPORT_TITLE",
26
+ "DANGER_BITBUCKETSERVER_CODE_INSIGHTS_REPORT_DESCRIPTION",
27
+ "DANGER_BITBUCKETSERVER_CODE_INSIGHTS_REPORT_LOGO_URL",
28
+ "DANGER_BITBUCKETSERVER_VERIFY_SSL"
27
29
  ]
28
30
  end
29
31
 
@@ -110,17 +112,20 @@ module Danger
110
112
  markdowns = main_violations[:markdowns] || []
111
113
  end
112
114
 
113
- comment = generate_description(warnings: warnings,
114
- errors: errors)
115
- comment += "\n\n"
116
- comment += generate_comment(warnings: warnings,
117
- errors: errors,
118
- messages: messages,
119
- markdowns: markdowns,
120
- previous_violations: {},
121
- danger_id: danger_id,
122
- template: "bitbucket_server")
123
- @api.post_comment(comment)
115
+ has_comments = (warnings.count > 0 || errors.count > 0 || messages.count > 0 || markdowns.count > 0)
116
+ if has_comments
117
+ comment = generate_description(warnings: warnings,
118
+ errors: errors)
119
+ comment += "\n\n"
120
+ comment += generate_comment(warnings: warnings,
121
+ errors: errors,
122
+ messages: messages,
123
+ markdowns: markdowns,
124
+ previous_violations: {},
125
+ danger_id: danger_id,
126
+ template: "bitbucket_server")
127
+ @api.post_comment(comment)
128
+ end
124
129
  end
125
130
 
126
131
  def delete_old_comments(danger_id: "danger")
@@ -1,16 +1,18 @@
1
1
  # coding: utf-8
2
2
 
3
+ require "openssl"
3
4
  require "danger/helpers/comments_helper"
4
5
 
5
6
  module Danger
6
7
  module RequestSources
7
8
  class BitbucketServerAPI
8
- attr_accessor :host, :pr_api_endpoint, :key, :project
9
+ attr_accessor :host, :verify_ssl, :pr_api_endpoint, :key, :project
9
10
 
10
11
  def initialize(project, slug, pull_request_id, environment)
11
12
  @username = environment["DANGER_BITBUCKETSERVER_USERNAME"]
12
13
  @password = environment["DANGER_BITBUCKETSERVER_PASSWORD"]
13
14
  self.host = environment["DANGER_BITBUCKETSERVER_HOST"]
15
+ self.verify_ssl = environment["DANGER_BITBUCKETSERVER_VERIFY_SSL"] == "false" ? false : true
14
16
  if self.host && !(self.host.include? "http://") && !(self.host.include? "https://")
15
17
  self.host = "https://" + self.host
16
18
  end
@@ -57,7 +59,7 @@ module Danger
57
59
  body = { text: text }.to_json
58
60
  post(uri, body)
59
61
  end
60
-
62
+
61
63
  def update_pr_build_status(status, changeset, build_job_link, description)
62
64
  uri = URI("#{self.host}/rest/build-status/1.0/commits/#{changeset}")
63
65
  body = build_status_body(status, build_job_link, description)
@@ -73,7 +75,7 @@ module Danger
73
75
  def fetch_json(uri)
74
76
  req = Net::HTTP::Get.new(uri.request_uri, { "Content-Type" => "application/json" })
75
77
  req.basic_auth @username, @password
76
- res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: use_ssl) do |http|
78
+ res = http(uri).start do |http|
77
79
  http.request(req)
78
80
  end
79
81
  JSON.parse(res.body, symbolize_names: true)
@@ -84,7 +86,7 @@ module Danger
84
86
  req.basic_auth @username, @password
85
87
  req.body = body
86
88
 
87
- res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: use_ssl) do |http|
89
+ res = http(uri).start do |http|
88
90
  http.request(req)
89
91
  end
90
92
 
@@ -99,11 +101,18 @@ module Danger
99
101
  def delete(uri)
100
102
  req = Net::HTTP::Delete.new(uri.request_uri, { "Content-Type" => "application/json" })
101
103
  req.basic_auth @username, @password
102
- Net::HTTP.start(uri.hostname, uri.port, use_ssl: use_ssl) do |http|
104
+ http(uri).start do |http|
103
105
  http.request(req)
104
106
  end
105
107
  end
106
-
108
+
109
+ def http(uri)
110
+ http = Net::HTTP.new(uri.hostname, uri.port)
111
+ http.use_ssl = use_ssl
112
+ http.verify_mode = verify_ssl ? OpenSSL::SSL::VERIFY_PEER : OpenSSL::SSL::VERIFY_NONE
113
+ http
114
+ end
115
+
107
116
  def build_status_body(status, build_job_link, description)
108
117
  body = Hash.new
109
118
  body["state"] = status
@@ -17,7 +17,7 @@ module Danger
17
17
  attr_accessor :pr_json, :issue_json, :support_tokenless_auth, :dismiss_out_of_range_messages
18
18
 
19
19
  def self.env_vars
20
- ["DANGER_GITHUB_API_TOKEN"]
20
+ ["DANGER_GITHUB_API_TOKEN", "DANGER_GITHUB_BEARER_TOKEN"]
21
21
  end
22
22
 
23
23
  def self.optional_env_vars
@@ -30,7 +30,8 @@ module Danger
30
30
  self.support_tokenless_auth = false
31
31
  self.dismiss_out_of_range_messages = false
32
32
 
33
- @token = @environment["DANGER_GITHUB_API_TOKEN"]
33
+ @access_token = @environment["DANGER_GITHUB_API_TOKEN"]
34
+ @bearer_token = @environment["DANGER_GITHUB_BEARER_TOKEN"]
34
35
  end
35
36
 
36
37
  def get_pr_from_branch(repo_name, branch_name, owner)
@@ -45,7 +46,7 @@ module Danger
45
46
  end
46
47
 
47
48
  def validates_as_api_source?
48
- (@token && !@token.empty?) || self.environment["DANGER_USE_LOCAL_GIT"]
49
+ valid_bearer_token? || valid_access_token? || self.environment["DANGER_USE_LOCAL_GIT"]
49
50
  end
50
51
 
51
52
  def scm
@@ -72,12 +73,16 @@ module Danger
72
73
  end
73
74
 
74
75
  def client
75
- raise "No API token given, please provide one using `DANGER_GITHUB_API_TOKEN`" if !@token && !support_tokenless_auth
76
+ raise "No API token given, please provide one using `DANGER_GITHUB_API_TOKEN` or `DANGER_GITHUB_BEARER_TOKEN`" if !valid_access_token? && !valid_bearer_token? && !support_tokenless_auth
76
77
  @client ||= begin
77
78
  Octokit.configure do |config|
78
79
  config.connection_options[:ssl] = { verify: verify_ssl }
79
80
  end
80
- Octokit::Client.new(access_token: @token, auto_paginate: true, api_endpoint: api_url)
81
+ if valid_bearer_token?
82
+ Octokit::Client.new(bearer_token: @bearer_token, auto_paginate: true, api_endpoint: api_url)
83
+ elsif valid_access_token?
84
+ Octokit::Client.new(access_token: @access_token, auto_paginate: true, api_endpoint: api_url)
85
+ end
81
86
  end
82
87
  end
83
88
 
@@ -493,6 +498,14 @@ module Danger
493
498
 
494
499
  private
495
500
 
501
+ def valid_access_token?
502
+ @access_token && !@access_token.empty?
503
+ end
504
+
505
+ def valid_bearer_token?
506
+ @bearer_token && !@bearer_token.empty?
507
+ end
508
+
496
509
  def regular_violations_group(warnings: [], errors: [], messages: [], markdowns: [])
497
510
  {
498
511
  warnings: warnings.reject(&:inline?),
@@ -130,6 +130,12 @@ module Danger
130
130
  end
131
131
  end
132
132
 
133
+ def mr_closes_issues
134
+ @mr_closes_issues ||= begin
135
+ client.merge_request_closes_issues(ci_source.repo_slug, ci_source.pull_request_id)
136
+ end
137
+ end
138
+
133
139
  def setup_danger_branches
134
140
  # we can use a GitLab specific feature here:
135
141
  base_branch = self.mr_json.source_branch
@@ -298,6 +304,10 @@ module Danger
298
304
  end
299
305
  end
300
306
 
307
+ def markdown_link_to_message(message, _)
308
+ "#{message.file}#L#{message.line}: "
309
+ end
310
+
301
311
  # @return [String] The organisation name, is nil if it can't be detected
302
312
  def organisation
303
313
  nil # TODO: Implement this
@@ -1,4 +1,4 @@
1
1
  module Danger
2
- VERSION = "8.2.3".freeze
2
+ VERSION = "8.4.2".freeze
3
3
  DESCRIPTION = "Like Unit Tests, but for your Team Culture.".freeze
4
4
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: danger
3
3
  version: !ruby/object:Gem::Version
4
- version: 8.2.3
4
+ version: 8.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Orta Therox
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2021-03-10 00:00:00.000000000 Z
12
+ date: 2021-11-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: claide
@@ -219,6 +219,7 @@ files:
219
219
  - lib/danger/ci_source/cirrus.rb
220
220
  - lib/danger/ci_source/code_build.rb
221
221
  - lib/danger/ci_source/codefresh.rb
222
+ - lib/danger/ci_source/codemagic.rb
222
223
  - lib/danger/ci_source/codeship.rb
223
224
  - lib/danger/ci_source/concourse.rb
224
225
  - lib/danger/ci_source/dotci.rb
@@ -243,6 +244,7 @@ files:
243
244
  - lib/danger/ci_source/teamcity.rb
244
245
  - lib/danger/ci_source/travis.rb
245
246
  - lib/danger/ci_source/vsts.rb
247
+ - lib/danger/ci_source/xcode_cloud.rb
246
248
  - lib/danger/ci_source/xcode_server.rb
247
249
  - lib/danger/clients/rubygems_client.rb
248
250
  - lib/danger/commands/dangerfile/gem.rb