danger 8.4.2 → 9.2.0
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 +4 -4
- data/LICENSE +1 -1
- data/README.md +1 -1
- data/bin/danger +1 -1
- data/lib/danger/ci_source/appcircle.rb +83 -0
- data/lib/danger/ci_source/appveyor.rb +1 -0
- data/lib/danger/ci_source/azure_pipelines.rb +20 -5
- data/lib/danger/ci_source/bamboo.rb +1 -1
- data/lib/danger/ci_source/bitbucket_pipelines.rb +1 -2
- data/lib/danger/ci_source/bitrise.rb +10 -10
- data/lib/danger/ci_source/buildkite.rb +1 -1
- data/lib/danger/ci_source/circle.rb +1 -1
- data/lib/danger/ci_source/circle_api.rb +2 -2
- data/lib/danger/ci_source/code_build.rb +20 -6
- data/lib/danger/ci_source/codefresh.rb +7 -13
- data/lib/danger/ci_source/concourse.rb +4 -5
- data/lib/danger/ci_source/dotci.rb +4 -6
- data/lib/danger/ci_source/github_actions.rb +6 -6
- data/lib/danger/ci_source/gitlab_ci.rb +13 -19
- data/lib/danger/ci_source/jenkins.rb +22 -23
- data/lib/danger/ci_source/local_git_repo.rb +36 -38
- data/lib/danger/ci_source/local_only_git_repo.rb +5 -8
- data/lib/danger/ci_source/support/find_repo_info_from_url.rb +11 -10
- data/lib/danger/ci_source/support/pull_request_finder.rb +47 -43
- data/lib/danger/ci_source/teamcity.rb +1 -1
- data/lib/danger/ci_source/xcode_cloud.rb +7 -7
- data/lib/danger/commands/init.rb +1 -1
- data/lib/danger/commands/local.rb +1 -1
- data/lib/danger/commands/local_helpers/http_cache.rb +2 -0
- data/lib/danger/commands/local_helpers/local_setup.rb +2 -0
- data/lib/danger/commands/local_helpers/pry_setup.rb +1 -0
- data/lib/danger/commands/plugins/plugin_json.rb +1 -3
- data/lib/danger/commands/plugins/plugin_lint.rb +0 -2
- data/lib/danger/commands/plugins/plugin_readme.rb +2 -5
- data/lib/danger/commands/pr.rb +2 -1
- data/lib/danger/commands/runner.rb +1 -1
- data/lib/danger/commands/staging.rb +7 -7
- data/lib/danger/commands/systems.rb +4 -6
- data/lib/danger/comment_generators/gitlab_inline.md.erb +1 -1
- data/lib/danger/comment_generators/vsts_inline.md.erb +17 -0
- data/lib/danger/core_ext/file_list.rb +2 -2
- data/lib/danger/danger_core/dangerfile.rb +19 -16
- data/lib/danger/danger_core/environment_manager.rb +2 -1
- data/lib/danger/danger_core/executor.rb +10 -11
- data/lib/danger/danger_core/message_aggregator.rb +1 -0
- data/lib/danger/danger_core/messages/base.rb +1 -0
- data/lib/danger/danger_core/messages/markdown.rb +3 -4
- data/lib/danger/danger_core/messages/violation.rb +1 -2
- data/lib/danger/danger_core/plugins/dangerfile_bitbucket_cloud_plugin.rb +1 -3
- data/lib/danger/danger_core/plugins/dangerfile_bitbucket_server_plugin.rb +4 -4
- data/lib/danger/danger_core/plugins/dangerfile_danger_plugin.rb +9 -3
- data/lib/danger/danger_core/plugins/dangerfile_git_plugin.rb +4 -3
- data/lib/danger/danger_core/plugins/dangerfile_github_plugin.rb +3 -1
- data/lib/danger/danger_core/plugins/dangerfile_gitlab_plugin.rb +3 -1
- data/lib/danger/danger_core/plugins/dangerfile_local_only_plugin.rb +4 -3
- data/lib/danger/danger_core/plugins/dangerfile_messaging_plugin.rb +3 -1
- data/lib/danger/danger_core/plugins/dangerfile_vsts_plugin.rb +3 -3
- data/lib/danger/danger_core/standard_error.rb +2 -3
- data/lib/danger/helpers/array_subclass.rb +2 -2
- data/lib/danger/helpers/comments_helper.rb +8 -7
- data/lib/danger/helpers/comments_parsing_helper.rb +3 -2
- data/lib/danger/helpers/emoji_mapper.rb +1 -1
- data/lib/danger/plugin_support/plugin.rb +0 -1
- data/lib/danger/plugin_support/plugin_linter.rb +1 -0
- data/lib/danger/request_sources/bitbucket_cloud.rb +3 -6
- data/lib/danger/request_sources/bitbucket_cloud_api.rb +5 -7
- data/lib/danger/request_sources/bitbucket_server.rb +47 -11
- data/lib/danger/request_sources/bitbucket_server_api.rb +17 -14
- data/lib/danger/request_sources/code_insights_api.rb +9 -14
- data/lib/danger/request_sources/github/github.rb +30 -38
- data/lib/danger/request_sources/github/github_review.rb +3 -2
- data/lib/danger/request_sources/github/github_review_resolver.rb +0 -2
- data/lib/danger/request_sources/github/github_review_unsupported.rb +0 -2
- data/lib/danger/request_sources/gitlab.rb +53 -75
- data/lib/danger/request_sources/local_only.rb +1 -4
- data/lib/danger/request_sources/request_source.rb +20 -8
- data/lib/danger/request_sources/support/get_ignored_violation.rb +1 -1
- data/lib/danger/request_sources/vsts.rb +175 -15
- data/lib/danger/request_sources/vsts_api.rb +41 -7
- data/lib/danger/scm_source/git_repo.rb +2 -1
- data/lib/danger/version.rb +1 -1
- data/lib/danger.rb +1 -0
- metadata +39 -37
- data/lib/danger/ci_source/vsts.rb +0 -73
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
# For more info see: https://github.com/schacon/ruby-git
|
|
2
4
|
|
|
3
5
|
require "git"
|
|
@@ -33,12 +35,17 @@ module Danger
|
|
|
33
35
|
end
|
|
34
36
|
|
|
35
37
|
def supported_request_sources
|
|
36
|
-
@supported_request_sources ||= [
|
|
38
|
+
@supported_request_sources ||= [
|
|
39
|
+
Danger::RequestSources::GitHub,
|
|
40
|
+
Danger::RequestSources::BitbucketServer,
|
|
41
|
+
Danger::RequestSources::BitbucketCloud,
|
|
42
|
+
Danger::RequestSources::VSTS
|
|
43
|
+
]
|
|
37
44
|
end
|
|
38
45
|
|
|
39
46
|
def initialize(env = {})
|
|
40
|
-
@
|
|
41
|
-
|
|
47
|
+
@remote_info = find_remote_info(env)
|
|
48
|
+
@found_pull_request = find_pull_request(env)
|
|
42
49
|
self.repo_slug = remote_info.slug
|
|
43
50
|
raise_error_for_missing_remote if remote_info.kind_of?(NoRepoInfo)
|
|
44
51
|
|
|
@@ -55,7 +62,7 @@ module Danger
|
|
|
55
62
|
|
|
56
63
|
private
|
|
57
64
|
|
|
58
|
-
attr_reader :
|
|
65
|
+
attr_reader :remote_info, :found_pull_request
|
|
59
66
|
|
|
60
67
|
def raise_error_for_missing_remote
|
|
61
68
|
raise missing_remote_error_message
|
|
@@ -66,45 +73,36 @@ module Danger
|
|
|
66
73
|
"And the repository must host on GitHub.com or GitHub Enterprise."
|
|
67
74
|
end
|
|
68
75
|
|
|
69
|
-
def
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
).call
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
remote_info || NoRepoInfo.new
|
|
83
|
-
end
|
|
76
|
+
def find_remote_info(env)
|
|
77
|
+
if given_pull_request_url?(env)
|
|
78
|
+
FindRepoInfoFromURL.new(env["LOCAL_GIT_PR_URL"]).call
|
|
79
|
+
else
|
|
80
|
+
FindRepoInfoFromLogs.new(
|
|
81
|
+
env["DANGER_GITHUB_HOST"] || "github.com",
|
|
82
|
+
run_git("remote show origin -n")
|
|
83
|
+
).call
|
|
84
|
+
end || NoRepoInfo.new
|
|
84
85
|
end
|
|
85
86
|
|
|
86
|
-
def
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
git_logs: run_git("log --oneline -1000000".freeze)
|
|
102
|
-
).call
|
|
103
|
-
end
|
|
87
|
+
def find_pull_request(env)
|
|
88
|
+
if given_pull_request_url?(env)
|
|
89
|
+
PullRequestFinder.new(
|
|
90
|
+
remote_info.id,
|
|
91
|
+
remote_info.slug,
|
|
92
|
+
remote: true,
|
|
93
|
+
remote_url: env["LOCAL_GIT_PR_URL"]
|
|
94
|
+
).call(env: env)
|
|
95
|
+
else
|
|
96
|
+
PullRequestFinder.new(
|
|
97
|
+
env.fetch("LOCAL_GIT_PR_ID") { "" },
|
|
98
|
+
remote_info.slug,
|
|
99
|
+
remote: false,
|
|
100
|
+
git_logs: run_git("log --oneline -1000000")
|
|
101
|
+
).call(env: env)
|
|
104
102
|
end
|
|
105
103
|
end
|
|
106
104
|
|
|
107
|
-
def given_pull_request_url?
|
|
105
|
+
def given_pull_request_url?(env)
|
|
108
106
|
env["LOCAL_GIT_PR_URL"] && !env["LOCAL_GIT_PR_URL"].empty?
|
|
109
107
|
end
|
|
110
108
|
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require "git"
|
|
2
4
|
require "danger/request_sources/local_only"
|
|
3
5
|
|
|
@@ -9,8 +11,9 @@ module Danger
|
|
|
9
11
|
#
|
|
10
12
|
class LocalOnlyGitRepo < CI
|
|
11
13
|
attr_accessor :base_commit, :head_commit
|
|
12
|
-
|
|
13
|
-
|
|
14
|
+
|
|
15
|
+
HEAD_VAR = "DANGER_LOCAL_HEAD"
|
|
16
|
+
BASE_VAR = "DANGER_LOCAL_BASE"
|
|
14
17
|
|
|
15
18
|
def self.validates_as_ci?(env)
|
|
16
19
|
env.key? "DANGER_USE_LOCAL_ONLY_GIT"
|
|
@@ -33,15 +36,9 @@ module Danger
|
|
|
33
36
|
end
|
|
34
37
|
|
|
35
38
|
def initialize(env = {})
|
|
36
|
-
@env = env
|
|
37
|
-
|
|
38
39
|
# expects --base/--head specified OR origin/master to be base and HEAD head
|
|
39
40
|
self.base_commit = env[BASE_VAR] || run_git("rev-parse --abbrev-ref origin/master")
|
|
40
41
|
self.head_commit = env[HEAD_VAR] || run_git("rev-parse --abbrev-ref HEAD")
|
|
41
42
|
end
|
|
42
|
-
|
|
43
|
-
private
|
|
44
|
-
|
|
45
|
-
attr_reader :env
|
|
46
43
|
end
|
|
47
44
|
end
|
|
@@ -4,19 +4,20 @@ module Danger
|
|
|
4
4
|
class FindRepoInfoFromURL
|
|
5
5
|
REGEXP = %r{
|
|
6
6
|
://[^/]+/
|
|
7
|
-
(
|
|
8
|
-
(
|
|
7
|
+
(([^/]+/){1,2}_git/)?
|
|
8
|
+
(?<slug>[^/]+(/[^/]+){0,2})
|
|
9
|
+
(/(pull|pullrequest|merge_requests|pull-requests)/)
|
|
9
10
|
(?<id>\d+)
|
|
10
|
-
}x
|
|
11
|
-
|
|
11
|
+
}x.freeze
|
|
12
|
+
|
|
12
13
|
# Regex used to extract info from Bitbucket server URLs, as they use a quite different format
|
|
13
14
|
REGEXPBB = %r{
|
|
14
|
-
(?:[
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
}x
|
|
15
|
+
(?:[/:])projects
|
|
16
|
+
/([^/.]+)
|
|
17
|
+
/repos/([^/.]+)
|
|
18
|
+
/pull-requests
|
|
19
|
+
/(\d+)
|
|
20
|
+
}x.freeze
|
|
20
21
|
|
|
21
22
|
def initialize(url)
|
|
22
23
|
@url = url
|
|
@@ -1,67 +1,65 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require "danger/ci_source/support/local_pull_request"
|
|
2
4
|
require "danger/ci_source/support/remote_pull_request"
|
|
3
5
|
require "danger/ci_source/support/no_pull_request"
|
|
4
6
|
|
|
5
7
|
module Danger
|
|
6
8
|
class PullRequestFinder
|
|
7
|
-
def initialize(specific_pull_request_id, repo_slug = nil, remote: false, git_logs: "", remote_url: ""
|
|
9
|
+
def initialize(specific_pull_request_id, repo_slug = nil, remote: false, git_logs: "", remote_url: "")
|
|
8
10
|
@specific_pull_request_id = specific_pull_request_id
|
|
9
11
|
@git_logs = git_logs
|
|
10
12
|
@repo_slug = repo_slug
|
|
11
13
|
@remote = to_boolean(remote)
|
|
12
14
|
@remote_url = remote_url
|
|
13
|
-
@env = env
|
|
14
15
|
end
|
|
15
16
|
|
|
16
|
-
def call
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
def call(env: nil)
|
|
18
|
+
find_pull_request(env).tap do |pull_request|
|
|
19
|
+
raise_pull_request_not_found!(pull_request) unless pull_request.valid?
|
|
20
|
+
end
|
|
20
21
|
end
|
|
21
22
|
|
|
22
23
|
private
|
|
23
24
|
|
|
24
|
-
attr_reader :specific_pull_request_id, :git_logs, :repo_slug, :remote, :remote_url
|
|
25
|
+
attr_reader :specific_pull_request_id, :git_logs, :repo_slug, :remote, :remote_url
|
|
25
26
|
|
|
26
27
|
def to_boolean(maybe_string)
|
|
27
28
|
["true", "1", "yes", "y", true].include?(maybe_string)
|
|
28
29
|
end
|
|
29
30
|
|
|
30
|
-
def
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
raise "No recent Pull Requests found for this repo, danger requires at least one Pull Request for the local mode.".freeze
|
|
36
|
-
end
|
|
31
|
+
def raise_pull_request_not_found!(_pull_request)
|
|
32
|
+
if specific_pull_request_id.empty?
|
|
33
|
+
raise "No recent Pull Requests found for this repo, danger requires at least one Pull Request for the local mode."
|
|
34
|
+
else
|
|
35
|
+
raise "Could not find the Pull Request (#{specific_pull_request_id}) inside the git history for this repo."
|
|
37
36
|
end
|
|
38
37
|
end
|
|
39
38
|
|
|
40
39
|
# @return [String] Log line of most recent merged Pull Request
|
|
41
|
-
def
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
end
|
|
40
|
+
def find_pull_request(env)
|
|
41
|
+
return if pull_request_ref.empty?
|
|
42
|
+
|
|
43
|
+
if both_present?
|
|
44
|
+
LocalPullRequest.new(pick_the_most_recent_one_from_two_matches)
|
|
45
|
+
elsif only_merged_pull_request_present?
|
|
46
|
+
LocalPullRequest.new(most_recent_merged_pull_request)
|
|
47
|
+
elsif only_squash_and_merged_pull_request_present?
|
|
48
|
+
LocalPullRequest.new(most_recent_squash_and_merged_pull_request)
|
|
49
|
+
elsif remote
|
|
50
|
+
remote_pull_request = find_remote_pull_request(env)
|
|
51
|
+
remote_pull_request ? generate_remote_pull_request(remote_pull_request) : NoPullRequest.new
|
|
52
|
+
else
|
|
53
|
+
NoPullRequest.new
|
|
56
54
|
end
|
|
57
55
|
end
|
|
58
56
|
|
|
59
57
|
# @return [String] "#42"
|
|
60
58
|
def pull_request_ref
|
|
61
|
-
!specific_pull_request_id.empty? ? "##{specific_pull_request_id}" : "#\\d+"
|
|
59
|
+
!specific_pull_request_id.empty? ? "##{specific_pull_request_id}" : "#\\d+"
|
|
62
60
|
end
|
|
63
61
|
|
|
64
|
-
def generate_remote_pull_request
|
|
62
|
+
def generate_remote_pull_request(remote_pull_request)
|
|
65
63
|
scm_provider = find_scm_provider(remote_url)
|
|
66
64
|
|
|
67
65
|
case scm_provider
|
|
@@ -83,15 +81,19 @@ module Danger
|
|
|
83
81
|
remote_pull_request.head.sha,
|
|
84
82
|
remote_pull_request.base.sha
|
|
85
83
|
)
|
|
84
|
+
when :vsts
|
|
85
|
+
RemotePullRequest.new(
|
|
86
|
+
remote_pull_request[:pullRequestId].to_s,
|
|
87
|
+
remote_pull_request[:lastMergeSourceCommit][:commitId],
|
|
88
|
+
remote_pull_request[:lastMergeTargetCommit][:commitId]
|
|
89
|
+
)
|
|
86
90
|
else
|
|
87
91
|
raise "SCM provider not supported: #{scm_provider}"
|
|
88
92
|
end
|
|
89
93
|
end
|
|
90
94
|
|
|
91
|
-
def
|
|
92
|
-
|
|
93
|
-
client.pull_request(repo_slug, specific_pull_request_id)
|
|
94
|
-
end
|
|
95
|
+
def find_remote_pull_request(env)
|
|
96
|
+
client(env).pull_request(repo_slug, specific_pull_request_id)
|
|
95
97
|
end
|
|
96
98
|
|
|
97
99
|
def both_present?
|
|
@@ -100,16 +102,12 @@ module Danger
|
|
|
100
102
|
|
|
101
103
|
# @return [String] Log line of format: "Merge pull request #42"
|
|
102
104
|
def most_recent_merged_pull_request
|
|
103
|
-
@most_recent_merged_pull_request ||=
|
|
104
|
-
git_logs.lines.grep(/Merge pull request #{pull_request_ref} from/)[0]
|
|
105
|
-
end
|
|
105
|
+
@most_recent_merged_pull_request ||= git_logs.lines.grep(/Merge pull request #{pull_request_ref} from/)[0]
|
|
106
106
|
end
|
|
107
107
|
|
|
108
108
|
# @return [String] Log line of format: "description (#42)"
|
|
109
109
|
def most_recent_squash_and_merged_pull_request
|
|
110
|
-
@most_recent_squash_and_merged_pull_request ||=
|
|
111
|
-
git_logs.lines.grep(/\(#{pull_request_ref}\)/)[0]
|
|
112
|
-
end
|
|
110
|
+
@most_recent_squash_and_merged_pull_request ||= git_logs.lines.grep(/\(#{pull_request_ref}\)/)[0]
|
|
113
111
|
end
|
|
114
112
|
|
|
115
113
|
def pick_the_most_recent_one_from_two_matches
|
|
@@ -135,7 +133,7 @@ module Danger
|
|
|
135
133
|
!most_recent_squash_and_merged_pull_request.nil? && !most_recent_squash_and_merged_pull_request.empty?
|
|
136
134
|
end
|
|
137
135
|
|
|
138
|
-
def client
|
|
136
|
+
def client(env)
|
|
139
137
|
scm_provider = find_scm_provider(remote_url)
|
|
140
138
|
|
|
141
139
|
case scm_provider
|
|
@@ -148,6 +146,10 @@ module Danger
|
|
|
148
146
|
require "danger/request_sources/bitbucket_server_api"
|
|
149
147
|
project, slug = repo_slug.split("/")
|
|
150
148
|
RequestSources::BitbucketServerAPI.new(project, slug, specific_pull_request_id, env)
|
|
149
|
+
|
|
150
|
+
when :vsts
|
|
151
|
+
require "danger/request_sources/vsts_api"
|
|
152
|
+
RequestSources::VSTSAPI.new(repo_slug, specific_pull_request_id, env)
|
|
151
153
|
|
|
152
154
|
when :github
|
|
153
155
|
require "octokit"
|
|
@@ -168,7 +170,7 @@ module Danger
|
|
|
168
170
|
def api_url
|
|
169
171
|
ENV.fetch("DANGER_GITHUB_API_HOST") do
|
|
170
172
|
ENV.fetch("DANGER_GITHUB_API_BASE_URL") do
|
|
171
|
-
"https://api.github.com/"
|
|
173
|
+
"https://api.github.com/"
|
|
172
174
|
end
|
|
173
175
|
end
|
|
174
176
|
end
|
|
@@ -178,6 +180,8 @@ module Danger
|
|
|
178
180
|
:bitbucket_cloud
|
|
179
181
|
elsif remote_url =~ %r{/pull-requests/}
|
|
180
182
|
:bitbucket_server
|
|
183
|
+
elsif remote_url =~ /\.visualstudio\.com/i || remote_url =~ /dev\.azure\.com/i
|
|
184
|
+
:vsts
|
|
181
185
|
else
|
|
182
186
|
:github
|
|
183
187
|
end
|
|
@@ -155,7 +155,7 @@ module Danger
|
|
|
155
155
|
repo_slug = env["BITBUCKET_REPO_SLUG"]
|
|
156
156
|
begin
|
|
157
157
|
Danger::RequestSources::BitbucketCloudAPI.new(repo_slug, nil, branch_name, env).pull_request_id
|
|
158
|
-
rescue
|
|
158
|
+
rescue StandardError
|
|
159
159
|
raise "Failed to find a pull request for branch \"#{branch_name}\" on Bitbucket."
|
|
160
160
|
end
|
|
161
161
|
end
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
module Danger
|
|
2
2
|
# ### CI Setup
|
|
3
3
|
#
|
|
4
|
-
# In order to work with Xcode Cloud and Danger, you will need to add `bundle exec danger` to
|
|
4
|
+
# In order to work with Xcode Cloud and Danger, you will need to add `bundle exec danger` to
|
|
5
5
|
# the `ci_scripts/ci_post_xcodebuild.sh` (Xcode Cloud's expected filename for a post-action build script).
|
|
6
6
|
# More details and documentation on Xcode Cloud configuration can be found [here](https://developer.apple.com/documentation/xcode/writing-custom-build-scripts).
|
|
7
|
-
#
|
|
7
|
+
#
|
|
8
8
|
# ### Token Setup
|
|
9
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
|
|
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
12
|
# both `DANGER_GITHUB_API_HOST` and `DANGER_GITHUB_HOST`.
|
|
13
|
-
#
|
|
13
|
+
#
|
|
14
14
|
class XcodeCloud < CI
|
|
15
15
|
def self.validates_as_ci?(env)
|
|
16
16
|
env.key? "CI_XCODEBUILD_ACTION"
|
|
@@ -23,8 +23,8 @@ module Danger
|
|
|
23
23
|
def supported_request_sources
|
|
24
24
|
@supported_request_sources ||= [
|
|
25
25
|
Danger::RequestSources::GitHub,
|
|
26
|
-
Danger::RequestSources::GitLab,
|
|
27
|
-
Danger::RequestSources::BitbucketCloud,
|
|
26
|
+
Danger::RequestSources::GitLab,
|
|
27
|
+
Danger::RequestSources::BitbucketCloud,
|
|
28
28
|
Danger::RequestSources::BitbucketServer
|
|
29
29
|
]
|
|
30
30
|
end
|
data/lib/danger/commands/init.rb
CHANGED
|
@@ -145,7 +145,7 @@ module Danger
|
|
|
145
145
|
def current_repo_slug
|
|
146
146
|
git = GitRepo.new
|
|
147
147
|
|
|
148
|
-
author_repo_regexp = %r{(?:[
|
|
148
|
+
author_repo_regexp = %r{(?:[/:])([^/]+/[^/]+)(?:.git)?$}
|
|
149
149
|
last_git_regexp = /.git$/
|
|
150
150
|
|
|
151
151
|
matches = git.origins.match(author_repo_regexp)
|
|
@@ -66,7 +66,7 @@ module Danger
|
|
|
66
66
|
|
|
67
67
|
private
|
|
68
68
|
|
|
69
|
-
#
|
|
69
|
+
# this method is a duplicate of Commands::PR#configure_octokit
|
|
70
70
|
# - worth a refactor sometime?
|
|
71
71
|
def configure_octokit(cache_dir)
|
|
72
72
|
# setup caching for Github calls to hitting the API rate limit too quickly
|
|
@@ -3,6 +3,7 @@ require "pstore"
|
|
|
3
3
|
module Danger
|
|
4
4
|
class HTTPCache
|
|
5
5
|
attr_reader :expires_in
|
|
6
|
+
|
|
6
7
|
def initialize(cache_file = nil, options = {})
|
|
7
8
|
File.delete(cache_file) if options[:clear_cache]
|
|
8
9
|
@store = PStore.new(cache_file)
|
|
@@ -14,6 +15,7 @@ module Danger
|
|
|
14
15
|
entry = @store[key]
|
|
15
16
|
return nil unless entry
|
|
16
17
|
return entry[:value] unless entry_has_expired(entry, @expires_in)
|
|
18
|
+
|
|
17
19
|
@store.delete key
|
|
18
20
|
return nil
|
|
19
21
|
end
|
|
@@ -22,6 +22,8 @@ module Danger
|
|
|
22
22
|
|
|
23
23
|
if gh.instance_of? Danger::RequestSources::BitbucketServer
|
|
24
24
|
cork.puts "Running your Dangerfile against this PR - #{gh.host}/projects/#{source.repo_slug.split('/').first}/repos/#{source.repo_slug.split('/').last}/pull-requests/#{source.pull_request_id}"
|
|
25
|
+
elsif gh.instance_of? Danger::RequestSources::VSTS
|
|
26
|
+
cork.puts "Running your Dangerfile against this PR - #{gh.client.pr_api_endpoint}"
|
|
25
27
|
else
|
|
26
28
|
cork.puts "Running your Dangerfile against this PR - https://#{gh.host}/#{source.repo_slug}/pull/#{source.pull_request_id}"
|
|
27
29
|
end
|
|
@@ -3,7 +3,7 @@ require "danger/plugin_support/plugin_file_resolver"
|
|
|
3
3
|
|
|
4
4
|
module Danger
|
|
5
5
|
class PluginJSON < CLAide::Command::Plugins
|
|
6
|
-
self.summary = "
|
|
6
|
+
self.summary = "Lint plugins from files, gems or the current folder. Outputs JSON array representation of Plugins on success."
|
|
7
7
|
self.command = "json"
|
|
8
8
|
|
|
9
9
|
attr_accessor :cork
|
|
@@ -15,8 +15,6 @@ module Danger
|
|
|
15
15
|
super
|
|
16
16
|
end
|
|
17
17
|
|
|
18
|
-
self.summary = "Lint plugins from files, gems or the current folder. Outputs JSON array representation of Plugins on success."
|
|
19
|
-
|
|
20
18
|
self.description = <<-DESC
|
|
21
19
|
Converts a collection of file paths of Danger plugins into a JSON format.
|
|
22
20
|
DESC
|
|
@@ -17,8 +17,6 @@ module Danger
|
|
|
17
17
|
super
|
|
18
18
|
end
|
|
19
19
|
|
|
20
|
-
self.summary = "Lint plugins from files, gems or the current folder. Outputs JSON array representation of Plugins on success."
|
|
21
|
-
|
|
22
20
|
self.description = <<-DESC
|
|
23
21
|
Converts a collection of file paths of Danger plugins into a JSON format.
|
|
24
22
|
Note: Before 1.0, it will also parse the represented JSON to validate whether https://danger.systems would
|
|
@@ -8,7 +8,7 @@ module Danger
|
|
|
8
8
|
self.summary = "Generates a README from a set of plugins"
|
|
9
9
|
self.command = "readme"
|
|
10
10
|
|
|
11
|
-
attr_accessor :cork, :json
|
|
11
|
+
attr_accessor :cork, :json, :markdown
|
|
12
12
|
|
|
13
13
|
def initialize(argv)
|
|
14
14
|
@refs = argv.arguments! unless argv.arguments.empty?
|
|
@@ -17,8 +17,6 @@ module Danger
|
|
|
17
17
|
super
|
|
18
18
|
end
|
|
19
19
|
|
|
20
|
-
self.summary = "Lint plugins from files, gems or the current folder. Outputs JSON array representation of Plugins on success."
|
|
21
|
-
|
|
22
20
|
self.description = <<-DESC
|
|
23
21
|
Converts a collection of file paths of Danger plugins into a format usable in a README.
|
|
24
22
|
This is useful for Danger itself, but also for any plugins wanting to showcase their API.
|
|
@@ -28,7 +26,6 @@ module Danger
|
|
|
28
26
|
CLAide::Argument.new("Paths, Gems or Nothing", false, true)
|
|
29
27
|
]
|
|
30
28
|
|
|
31
|
-
attr_accessor :json, :markdown
|
|
32
29
|
def run
|
|
33
30
|
file_resolver = PluginFileResolver.new(@refs)
|
|
34
31
|
data = file_resolver.resolve
|
|
@@ -39,7 +36,7 @@ module Danger
|
|
|
39
36
|
self.json = JSON.parse(parser.to_json_string)
|
|
40
37
|
|
|
41
38
|
template = File.join(Danger.gem_path, "lib/danger/plugin_support/templates/readme_table.html.erb")
|
|
42
|
-
cork.puts ERB.new(File.read(template),
|
|
39
|
+
cork.puts ERB.new(File.read(template), trim_mode: "-").result(binding)
|
|
43
40
|
end
|
|
44
41
|
end
|
|
45
42
|
end
|
data/lib/danger/commands/pr.rb
CHANGED
|
@@ -9,7 +9,7 @@ module Danger
|
|
|
9
9
|
|
|
10
10
|
def self.options
|
|
11
11
|
[
|
|
12
|
-
|
|
12
|
+
["--pry", "Drop into a Pry shell after evaluating the Dangerfile."]
|
|
13
13
|
]
|
|
14
14
|
end
|
|
15
15
|
|
|
@@ -41,12 +41,12 @@ module Danger
|
|
|
41
41
|
dm = Dangerfile.new(env, cork)
|
|
42
42
|
|
|
43
43
|
dm.run(
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
44
|
+
Danger::EnvironmentManager.danger_base_branch,
|
|
45
|
+
Danger::EnvironmentManager.danger_head_branch,
|
|
46
|
+
@dangerfile_path,
|
|
47
|
+
nil,
|
|
48
|
+
nil,
|
|
49
|
+
nil
|
|
50
50
|
)
|
|
51
51
|
end
|
|
52
52
|
end
|
|
@@ -16,12 +16,10 @@ module Danger
|
|
|
16
16
|
require "yard"
|
|
17
17
|
# Pull out all the Danger::CI subclasses docs
|
|
18
18
|
registry = YARD::Registry.load(ci_source_paths, true)
|
|
19
|
-
ci_sources =
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
.reject { |source| source.name == :LocalGitRepo }
|
|
24
|
-
end
|
|
19
|
+
ci_sources = registry.all(:class)
|
|
20
|
+
.select { |klass| klass.inheritance_tree.map(&:name).include? :CI }
|
|
21
|
+
.reject { |source| source.name == :CI }
|
|
22
|
+
.reject { |source| source.name == :LocalGitRepo }
|
|
25
23
|
|
|
26
24
|
# Fail if anything is added and not documented
|
|
27
25
|
cis_without_docs = ci_sources.select { |source| source.base_docstring.empty? }
|
|
@@ -17,5 +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
|
-
<%# Add the generated_by_ as a html
|
|
20
|
+
<%# Add the generated_by_ as a html comment to identify comments from danger. %>
|
|
21
21
|
<!-- "generated_by_<%= @danger_id %>" -->
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<%- @tables.each do |table| -%>
|
|
2
|
+
<%- if table[:content].any? || table[:resolved].any? -%>
|
|
3
|
+
| | |
|
|
4
|
+
|---|---|
|
|
5
|
+
<%- table[:content].each do |violation| -%>
|
|
6
|
+
| <%= @emoji_mapper.map(table[:emoji]) %> | <%= "~~" if table[:resolved] %><%= violation.message %><%= "~~" if table[:resolved] %> |
|
|
7
|
+
<%- end -%>
|
|
8
|
+
|
|
9
|
+
<%- end -%>
|
|
10
|
+
<%- end -%>
|
|
11
|
+
|
|
12
|
+
<%- @markdowns.each do |current| -%>
|
|
13
|
+
<%= current %>
|
|
14
|
+
<%# the previous line has to be aligned far to the left, otherwise markdown can break easily %>
|
|
15
|
+
<%- end -%>
|
|
16
|
+
|
|
17
|
+
Generated by :no_entry_sign: [Danger](https://danger.systems/ "generated_by_<%= @danger_id %>")
|
|
@@ -8,8 +8,8 @@ module Danger
|
|
|
8
8
|
# e.g. "**/something.*" for any file called something with any extension
|
|
9
9
|
def include?(pattern)
|
|
10
10
|
self.each do |current|
|
|
11
|
-
|
|
12
|
-
return true
|
|
11
|
+
if !current.nil? && (File.fnmatch(pattern, current, File::FNM_EXTGLOB) || pattern == current)
|
|
12
|
+
return true
|
|
13
13
|
end
|
|
14
14
|
end
|
|
15
15
|
return false
|