danger 3.3.2 → 3.4.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/lib/danger/ci_source/local_git_repo.rb +1 -1
- data/lib/danger/ci_source/support/merged_pull_request_finder.rb +35 -6
- data/lib/danger/ci_source/teamcity.rb +1 -1
- data/lib/danger/commands/init.rb +1 -1
- data/lib/danger/commands/local.rb +9 -9
- data/lib/danger/commands/runner.rb +17 -10
- data/lib/danger/danger_core/dangerfile.rb +48 -0
- data/lib/danger/danger_core/environment_manager.rb +52 -3
- data/lib/danger/danger_core/executor.rb +43 -41
- data/lib/danger/danger_core/plugins/dangerfile_danger_plugin.rb +10 -0
- data/lib/danger/danger_core/plugins/dangerfile_git_plugin.rb +1 -1
- data/lib/danger/request_sources/bitbucket_cloud.rb +9 -0
- data/lib/danger/request_sources/bitbucket_server.rb +10 -0
- data/lib/danger/request_sources/github.rb +22 -9
- data/lib/danger/request_sources/gitlab.rb +11 -1
- data/lib/danger/request_sources/request_source.rb +18 -0
- data/lib/danger/scm_source/git_repo.rb +4 -4
- data/lib/danger/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 331ec016762064e8a92668e5b9b56521e5873f50
|
4
|
+
data.tar.gz: 69fb9998dbe05c5465301a4a0396a28ce4ebf1ca
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0abf5fed8d027d3368573054d82b87c4010bf806ef83d0d41f8b964d438e44fd35dd99f822de9ebc581c3d3d59ea6810145235a08b7ed7a20682f4ae35e80019
|
7
|
+
data.tar.gz: 2189b8616f4a18ee79d12863c5ce0db5dc803996635c5e14b6f56f66050b97207cb76198fc36cadad80399e4b3ed6c0901814f653972236d57ab4a5f37015583
|
@@ -17,20 +17,20 @@ module Danger
|
|
17
17
|
|
18
18
|
# @return [String] "#42"
|
19
19
|
def pull_request_ref
|
20
|
-
specific_pull_request_id ? "##{specific_pull_request_id}" : "".freeze
|
20
|
+
!specific_pull_request_id.empty? ? "##{specific_pull_request_id}" : "#\\d+".freeze
|
21
21
|
end
|
22
22
|
|
23
23
|
# @return [String] Log line of format: "Merge pull request #42"
|
24
24
|
def most_recent_merged_pull_request
|
25
25
|
@most_recent_merged_pull_request ||= begin
|
26
|
-
git_logs.lines.grep(/Merge pull request #{pull_request_ref}/)[0]
|
26
|
+
git_logs.lines.grep(/Merge pull request #{pull_request_ref} from/)[0]
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
30
|
# @return [String] Log line of format: "description (#42)"
|
31
31
|
def most_recent_squash_and_merged_pull_request
|
32
32
|
@most_recent_squash_and_merged_pull_request ||= begin
|
33
|
-
git_logs.lines.grep(
|
33
|
+
git_logs.lines.grep(/\(#{pull_request_ref}\)/)[0]
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
@@ -38,16 +38,45 @@ module Danger
|
|
38
38
|
def merged_pull_request
|
39
39
|
return if pull_request_ref.empty?
|
40
40
|
|
41
|
-
if
|
41
|
+
if both_present?
|
42
|
+
pick_the_most_recent_one_from_two_matches
|
43
|
+
elsif only_merged_pull_request_present?
|
42
44
|
most_recent_merged_pull_request
|
43
|
-
elsif
|
45
|
+
elsif only_squash_and_merged_pull_request_present?
|
44
46
|
most_recent_squash_and_merged_pull_request
|
45
47
|
end
|
46
48
|
end
|
47
49
|
|
50
|
+
def both_present?
|
51
|
+
most_recent_merged_pull_request && most_recent_squash_and_merged_pull_request
|
52
|
+
end
|
53
|
+
|
54
|
+
def only_merged_pull_request_present?
|
55
|
+
return false if most_recent_squash_and_merged_pull_request
|
56
|
+
|
57
|
+
!most_recent_merged_pull_request.nil? && !most_recent_merged_pull_request.empty?
|
58
|
+
end
|
59
|
+
|
60
|
+
def only_squash_and_merged_pull_request_present?
|
61
|
+
return false if most_recent_merged_pull_request
|
62
|
+
|
63
|
+
!most_recent_squash_and_merged_pull_request.nil? && !most_recent_squash_and_merged_pull_request.empty?
|
64
|
+
end
|
65
|
+
|
66
|
+
def pick_the_most_recent_one_from_two_matches
|
67
|
+
merged_index = git_logs.lines.index(most_recent_merged_pull_request)
|
68
|
+
squash_and_merged_index = git_logs.lines.index(most_recent_squash_and_merged_pull_request)
|
69
|
+
|
70
|
+
if merged_index > squash_and_merged_index # smaller index is more recent
|
71
|
+
most_recent_squash_and_merged_pull_request
|
72
|
+
else
|
73
|
+
most_recent_merged_pull_request
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
48
77
|
def check_if_any_merged_pull_request!
|
49
78
|
if merged_pull_request.to_s.empty?
|
50
|
-
if specific_pull_request_id
|
79
|
+
if !specific_pull_request_id.empty?
|
51
80
|
raise "Could not find the Pull Request (#{specific_pull_request_id}) inside the git history for this repo."
|
52
81
|
else
|
53
82
|
raise "No recent Pull Requests found for this repo, danger requires at least one Pull Request for the local mode.".freeze
|
@@ -32,7 +32,7 @@ module Danger
|
|
32
32
|
class TeamCity < CI
|
33
33
|
class << self
|
34
34
|
def validates_as_github_pr?(env)
|
35
|
-
["GITHUB_PULL_REQUEST_ID", "GITHUB_REPO_URL"
|
35
|
+
["GITHUB_PULL_REQUEST_ID", "GITHUB_REPO_URL"].all? { |x| env[x] && !env[x].empty? }
|
36
36
|
end
|
37
37
|
|
38
38
|
def validates_as_gitlab_pr?(env)
|
data/lib/danger/commands/init.rb
CHANGED
@@ -93,7 +93,7 @@ module Danger
|
|
93
93
|
ui.pause 1
|
94
94
|
|
95
95
|
if considered_an_oss_repo?
|
96
|
-
ui.say "#{@bot_name} does not need
|
96
|
+
ui.say "#{@bot_name} does not need privileged access to your repo or org. This is because Danger will only"
|
97
97
|
ui.say "be writing comments, and you do not need special access for that."
|
98
98
|
else
|
99
99
|
ui.say "#{@bot_name} will need access to your repo. Simply because the code is not available for the public"
|
@@ -9,6 +9,14 @@ module Danger
|
|
9
9
|
self.summary = "Run the Dangerfile locally."
|
10
10
|
self.command = "local"
|
11
11
|
|
12
|
+
def self.options
|
13
|
+
[
|
14
|
+
["--use-merged-pr=[#id]", "The ID of an already merged PR inside your history to use as a reference for the local run."],
|
15
|
+
["--clear-http-cache", "Clear the local http cache before running Danger locally."],
|
16
|
+
["--pry", "Drop into a Pry shell after evaluating the Dangerfile."]
|
17
|
+
]
|
18
|
+
end
|
19
|
+
|
12
20
|
def initialize(argv)
|
13
21
|
@pr_num = argv.option("use-merged-pr")
|
14
22
|
@clear_http_cache = argv.flag?("clear-http-cache", false)
|
@@ -39,14 +47,6 @@ module Danger
|
|
39
47
|
abort
|
40
48
|
end
|
41
49
|
|
42
|
-
def self.options
|
43
|
-
[
|
44
|
-
["--use-merged-pr=[#id]", "The ID of an already merged PR inside your history to use as a reference for the local run."],
|
45
|
-
["--clear-http-cache", "Clear the local http cache before running Danger locally."],
|
46
|
-
["--pry", "Drop into a Pry shell after evaluating the Dangerfile."]
|
47
|
-
].concat(super)
|
48
|
-
end
|
49
|
-
|
50
50
|
def validate!
|
51
51
|
super
|
52
52
|
unless @dangerfile_path
|
@@ -67,7 +67,7 @@ module Danger
|
|
67
67
|
builder.adapter Faraday.default_adapter
|
68
68
|
end
|
69
69
|
|
70
|
-
env = EnvironmentManager.new(ENV)
|
70
|
+
env = EnvironmentManager.new(ENV, cork)
|
71
71
|
dm = Dangerfile.new(env, cork)
|
72
72
|
dm.init_plugins
|
73
73
|
|
@@ -8,10 +8,12 @@ module Danger
|
|
8
8
|
require "claide_plugin"
|
9
9
|
@subcommands << CLAide::Command::Plugins
|
10
10
|
CLAide::Plugins.config =
|
11
|
-
CLAide::Plugins::Configuration.new(
|
12
|
-
|
13
|
-
|
14
|
-
|
11
|
+
CLAide::Plugins::Configuration.new(
|
12
|
+
"Danger",
|
13
|
+
"danger",
|
14
|
+
"https://raw.githubusercontent.com/danger/danger.systems/master/plugins-search-generated.json",
|
15
|
+
"https://github.com/danger/danger-plugin-template"
|
16
|
+
)
|
15
17
|
|
16
18
|
require "danger/commands/plugins/plugin_lint"
|
17
19
|
require "danger/commands/plugins/plugin_json"
|
@@ -27,9 +29,10 @@ module Danger
|
|
27
29
|
|
28
30
|
def initialize(argv)
|
29
31
|
dangerfile = argv.option("dangerfile", "Dangerfile")
|
30
|
-
@dangerfile_path = dangerfile if File.exist?
|
32
|
+
@dangerfile_path = dangerfile if File.exist?(dangerfile)
|
31
33
|
@base = argv.option("base")
|
32
34
|
@head = argv.option("head")
|
35
|
+
@fail_on_errors = argv.option("fail-on-errors", false)
|
33
36
|
@danger_id = argv.option("danger_id", "danger")
|
34
37
|
@cork = Cork::Board.new(silent: argv.option("silent", false),
|
35
38
|
verbose: argv.option("verbose", false))
|
@@ -39,7 +42,7 @@ module Danger
|
|
39
42
|
def validate!
|
40
43
|
super
|
41
44
|
if self.class == Runner && !@dangerfile_path
|
42
|
-
help!
|
45
|
+
help!("Could not find a Dangerfile.")
|
43
46
|
end
|
44
47
|
end
|
45
48
|
|
@@ -47,16 +50,20 @@ module Danger
|
|
47
50
|
[
|
48
51
|
["--base=[master|dev|stable]", "A branch/tag/commit to use as the base of the diff"],
|
49
52
|
["--head=[master|dev|stable]", "A branch/tag/commit to use as the head"],
|
53
|
+
["--fail-on-errors=<true|false>", "Should always fail the build process, defaults to false"],
|
50
54
|
["--dangerfile=<path/to/dangerfile>", "The location of your Dangerfile"],
|
51
55
|
["--danger_id=<id>", "The identifier of this Danger instance"]
|
52
56
|
].concat(super)
|
53
57
|
end
|
54
58
|
|
55
59
|
def run
|
56
|
-
Executor.new(ENV).run(
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
+
Executor.new(ENV).run(
|
61
|
+
base: @base,
|
62
|
+
head: @head,
|
63
|
+
dangerfile_path: @dangerfile_path,
|
64
|
+
danger_id: @danger_id,
|
65
|
+
fail_on_errors: @fail_on_errors
|
66
|
+
)
|
60
67
|
end
|
61
68
|
end
|
62
69
|
end
|
@@ -233,6 +233,54 @@ module Danger
|
|
233
233
|
end
|
234
234
|
end
|
235
235
|
|
236
|
+
def failed?
|
237
|
+
violation_report[:errors].count > 0
|
238
|
+
end
|
239
|
+
|
240
|
+
def post_results(danger_id)
|
241
|
+
violations = violation_report
|
242
|
+
|
243
|
+
env.request_source.update_pull_request!(
|
244
|
+
warnings: violations[:warnings],
|
245
|
+
errors: violations[:errors],
|
246
|
+
messages: violations[:messages],
|
247
|
+
markdowns: status_report[:markdowns],
|
248
|
+
danger_id: danger_id
|
249
|
+
)
|
250
|
+
end
|
251
|
+
|
252
|
+
def setup_for_running(base_branch, head_branch)
|
253
|
+
env.ensure_danger_branches_are_setup
|
254
|
+
env.scm.diff_for_folder(".".freeze, from: base_branch, to: head_branch)
|
255
|
+
end
|
256
|
+
|
257
|
+
def run(base_branch, head_branch, dangerfile_path, danger_id)
|
258
|
+
# Setup internal state
|
259
|
+
init_plugins
|
260
|
+
env.fill_environment_vars
|
261
|
+
|
262
|
+
begin
|
263
|
+
# Sets up the git environment
|
264
|
+
setup_for_running(base_branch, head_branch)
|
265
|
+
|
266
|
+
# Parse the local Dangerfile
|
267
|
+
parse(Pathname.new(dangerfile_path))
|
268
|
+
|
269
|
+
# Push results to the API
|
270
|
+
# Pass along the details of the run to the request source
|
271
|
+
# to send back to the code review site.
|
272
|
+
post_results(danger_id)
|
273
|
+
|
274
|
+
# Print results in the terminal
|
275
|
+
print_results
|
276
|
+
ensure
|
277
|
+
# Makes sure that Danger specific git branches are cleaned
|
278
|
+
env.clean_up
|
279
|
+
end
|
280
|
+
|
281
|
+
failed?
|
282
|
+
end
|
283
|
+
|
236
284
|
private
|
237
285
|
|
238
286
|
def print_list(title, rows)
|
@@ -3,7 +3,7 @@ require "danger/request_sources/request_source"
|
|
3
3
|
|
4
4
|
module Danger
|
5
5
|
class EnvironmentManager
|
6
|
-
attr_accessor :ci_source, :request_source, :scm
|
6
|
+
attr_accessor :ci_source, :request_source, :scm, :ui
|
7
7
|
|
8
8
|
# Finds a Danger::CI class based on the ENV
|
9
9
|
def self.local_ci_source(env)
|
@@ -15,9 +15,10 @@ module Danger
|
|
15
15
|
local_ci_source(env).validates_as_pr?(env)
|
16
16
|
end
|
17
17
|
|
18
|
-
def initialize(env)
|
18
|
+
def initialize(env, ui)
|
19
19
|
ci_klass = self.class.local_ci_source(env)
|
20
20
|
self.ci_source = ci_klass.new(env)
|
21
|
+
self.ui = ui
|
21
22
|
|
22
23
|
RequestSources::RequestSource.available_request_sources.each do |klass|
|
23
24
|
next unless self.ci_source.supports?(klass)
|
@@ -28,7 +29,7 @@ module Danger
|
|
28
29
|
self.request_source = request_source
|
29
30
|
end
|
30
31
|
|
31
|
-
|
32
|
+
raise_error_for_no_request_source(env, ui) unless self.request_source
|
32
33
|
self.scm = self.request_source.scm
|
33
34
|
end
|
34
35
|
|
@@ -67,5 +68,53 @@ module Danger
|
|
67
68
|
def self.danger_base_branch
|
68
69
|
"danger_base"
|
69
70
|
end
|
71
|
+
|
72
|
+
def raise_error_for_no_request_source(env, ui)
|
73
|
+
title, subtitle = extract_title_and_subtitle_from_source(ci_source.repo_url)
|
74
|
+
subtitle += travis_note if env["TRAVIS_SECURE_ENV_VARS"] == "true"
|
75
|
+
|
76
|
+
ui_display_no_request_source_error_message(ui, env, title, subtitle)
|
77
|
+
|
78
|
+
exit(1)
|
79
|
+
end
|
80
|
+
|
81
|
+
private
|
82
|
+
|
83
|
+
def get_repo_source(repo_url)
|
84
|
+
if repo_url =~ /github/i
|
85
|
+
RequestSources::GitHub
|
86
|
+
elsif repo_url =~ /gitlab/i
|
87
|
+
RequestSources::GitLab
|
88
|
+
elsif repo_url =~ /bitbucket\.(org|com)/i
|
89
|
+
RequestSources::BitbucketCloud
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def extract_title_and_subtitle_from_source(repo_url)
|
94
|
+
source = get_repo_source(repo_url)
|
95
|
+
|
96
|
+
if source
|
97
|
+
title = "For your #{source.source_name} repo, you need to expose: " + source.env_vars.join(", ").yellow
|
98
|
+
subtitle = "You may also need: #{source.optional_env_vars.join(', ')}" if source.optional_env_vars.any?
|
99
|
+
else
|
100
|
+
title = "For Danger to run on this project, you need to expose a set of following the ENV vars:\n#{RequestSources::RequestSource.available_source_names_and_envs.join("\n")}"
|
101
|
+
end
|
102
|
+
|
103
|
+
[title, (subtitle || "")]
|
104
|
+
end
|
105
|
+
|
106
|
+
def ui_display_no_request_source_error_message(ui, env, title, subtitle)
|
107
|
+
ui.title "Could not set up API to Code Review site for Danger\n".freeze
|
108
|
+
ui.puts title
|
109
|
+
ui.puts subtitle
|
110
|
+
ui.puts "\nFound these keys in your ENV: #{env.keys.join(', '.freeze)}."
|
111
|
+
ui.puts "\nFailing the build, Danger cannot run without API access.".freeze
|
112
|
+
ui.puts "You can see more information at http://danger.systems/guides/getting_started.html".freeze
|
113
|
+
end
|
114
|
+
|
115
|
+
def travis_note
|
116
|
+
"\nTravis note: If you have an open source project, you should ensure 'Display value in build log' enabled for these flags, so that PRs from forks work." \
|
117
|
+
"\nThis also means that people can see this token, so this account should have no write access to repos."
|
118
|
+
end
|
70
119
|
end
|
71
120
|
end
|
@@ -10,61 +10,63 @@ module Danger
|
|
10
10
|
base: nil,
|
11
11
|
head: nil,
|
12
12
|
dangerfile_path: nil,
|
13
|
-
danger_id: nil
|
13
|
+
danger_id: nil,
|
14
|
+
fail_on_errors: nil)
|
15
|
+
# Create a silent Cork instance if cork is nil, as it's likely a test
|
16
|
+
cork ||= Cork::Board.new(silent: false, verbose: false)
|
14
17
|
|
15
|
-
|
16
|
-
|
18
|
+
# Run some validations
|
19
|
+
validate!(cork)
|
17
20
|
|
18
|
-
#
|
19
|
-
|
20
|
-
abort("Could not find the type of CI for Danger to run on.".red)
|
21
|
-
end
|
22
|
-
|
23
|
-
# Could we determine that the CI source is inside a PR?
|
24
|
-
unless EnvironmentManager.pr?(@system_env)
|
25
|
-
cork.puts "Not a Pull Request - skipping `danger` run".yellow
|
26
|
-
return
|
27
|
-
end
|
28
|
-
|
29
|
-
# OK, then we can have some
|
30
|
-
env ||= EnvironmentManager.new(@system_env)
|
21
|
+
# OK, we now know that Danger can run in this enviroment
|
22
|
+
env ||= EnvironmentManager.new(system_env, cork)
|
31
23
|
dm ||= Dangerfile.new(env, cork)
|
32
24
|
|
33
|
-
|
25
|
+
ran_status = begin
|
26
|
+
dm.run(
|
27
|
+
base_branch(base),
|
28
|
+
head_branch(head),
|
29
|
+
dangerfile_path,
|
30
|
+
danger_id
|
31
|
+
)
|
32
|
+
end
|
34
33
|
|
35
|
-
|
34
|
+
# By default Danger will use the status API to fail a build,
|
35
|
+
# allowing execution to continue, this behavior isn't always
|
36
|
+
# optimal for everyone.
|
37
|
+
exit(1) if fail_on_errors && ran_status
|
38
|
+
end
|
36
39
|
|
37
|
-
|
38
|
-
|
40
|
+
def validate!(cork)
|
41
|
+
validate_ci!
|
42
|
+
validate_pr!(cork)
|
43
|
+
end
|
39
44
|
|
40
|
-
|
41
|
-
ci_base = base || EnvironmentManager.danger_base_branch
|
42
|
-
ci_head = head || EnvironmentManager.danger_head_branch
|
45
|
+
private
|
43
46
|
|
44
|
-
|
47
|
+
attr_reader :system_env
|
45
48
|
|
46
|
-
|
47
|
-
|
49
|
+
# Could we find a CI source at all?
|
50
|
+
def validate_ci!
|
51
|
+
unless EnvironmentManager.local_ci_source(system_env)
|
52
|
+
abort("Could not find the type of CI for Danger to run on.".red)
|
53
|
+
end
|
54
|
+
end
|
48
55
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
56
|
+
# Could we determine that the CI source is inside a PR?
|
57
|
+
def validate_pr!(cork)
|
58
|
+
unless EnvironmentManager.pr?(system_env)
|
59
|
+
cork.puts "Not a Pull Request - skipping `danger` run".yellow
|
60
|
+
exit(0)
|
53
61
|
end
|
54
62
|
end
|
55
63
|
|
56
|
-
def
|
57
|
-
|
58
|
-
|
59
|
-
status = danger_file.status_report
|
64
|
+
def base_branch(user_specified_base_branch)
|
65
|
+
user_specified_base_branch || EnvironmentManager.danger_base_branch
|
66
|
+
end
|
60
67
|
|
61
|
-
|
62
|
-
|
63
|
-
errors: violations[:errors],
|
64
|
-
messages: violations[:messages],
|
65
|
-
markdowns: status[:markdowns],
|
66
|
-
danger_id: danger_id
|
67
|
-
)
|
68
|
+
def head_branch(user_specified_head_branch)
|
69
|
+
user_specified_head_branch || EnvironmentManager.danger_head_branch
|
68
70
|
end
|
69
71
|
end
|
70
72
|
end
|
@@ -197,10 +197,20 @@ module Danger
|
|
197
197
|
# @return [void]
|
198
198
|
def import_local(path)
|
199
199
|
Dir[path].each do |file|
|
200
|
+
validate_file_contains_plugin!(file)
|
201
|
+
|
200
202
|
# Without the expand_path it would fail if the path doesn't start with ./
|
201
203
|
require File.expand_path(file)
|
202
204
|
refresh_plugins
|
203
205
|
end
|
204
206
|
end
|
207
|
+
|
208
|
+
def validate_file_contains_plugin!(file)
|
209
|
+
content = IO.read(file)
|
210
|
+
|
211
|
+
if content.scan(/class\s+(?<plugin_class>[\w]+)\s+<\s+Plugin/i).empty?
|
212
|
+
raise("#{file} doesn't contain any valid danger plugin.")
|
213
|
+
end
|
214
|
+
end
|
205
215
|
end
|
206
216
|
end
|
@@ -28,7 +28,7 @@ module Danger
|
|
28
28
|
#
|
29
29
|
# @example Warn when somebody tries to add nokogiri to the project
|
30
30
|
#
|
31
|
-
# diff = git.diff_for_file
|
31
|
+
# diff = git.diff_for_file("Gemfile.lock")
|
32
32
|
# if diff && diff.patch =~ "nokogiri"
|
33
33
|
# warn 'Please do not add nokogiri to the project. Thank you.'
|
34
34
|
# end
|
@@ -8,6 +8,13 @@ module Danger
|
|
8
8
|
include Danger::Helpers::CommentsHelper
|
9
9
|
attr_accessor :pr_json
|
10
10
|
|
11
|
+
def self.env_vars
|
12
|
+
[
|
13
|
+
"DANGER_BITBUCKETCLOUD_USERNAME",
|
14
|
+
"DANGER_BITBUCKETCLOUD_PASSWORD"
|
15
|
+
]
|
16
|
+
end
|
17
|
+
|
11
18
|
def initialize(ci_source, environment)
|
12
19
|
self.ci_source = ci_source
|
13
20
|
self.environment = environment
|
@@ -42,10 +49,12 @@ module Danger
|
|
42
49
|
head_commit = self.pr_json[:source][:commit][:hash]
|
43
50
|
|
44
51
|
# Next, we want to ensure that we have a version of the current branch at a known location
|
52
|
+
scm.ensure_commitish_exists! base_commit
|
45
53
|
self.scm.exec "branch #{EnvironmentManager.danger_base_branch} #{base_commit}"
|
46
54
|
|
47
55
|
# OK, so we want to ensure that we have a known head branch, this will always represent
|
48
56
|
# the head of the PR ( e.g. the most recent commit that will be merged. )
|
57
|
+
scm.ensure_commitish_exists! head_commit
|
49
58
|
self.scm.exec "branch #{EnvironmentManager.danger_head_branch} #{head_commit}"
|
50
59
|
end
|
51
60
|
|
@@ -8,6 +8,14 @@ module Danger
|
|
8
8
|
include Danger::Helpers::CommentsHelper
|
9
9
|
attr_accessor :pr_json
|
10
10
|
|
11
|
+
def self.env_vars
|
12
|
+
[
|
13
|
+
"DANGER_BITBUCKETSERVER_USERNAME",
|
14
|
+
"DANGER_BITBUCKETSERVER_PASSWORD",
|
15
|
+
"DANGER_BITBUCKETSERVER_HOST"
|
16
|
+
]
|
17
|
+
end
|
18
|
+
|
11
19
|
def initialize(ci_source, environment)
|
12
20
|
self.ci_source = ci_source
|
13
21
|
self.environment = environment
|
@@ -42,10 +50,12 @@ module Danger
|
|
42
50
|
head_commit = self.pr_json[:fromRef][:latestCommit]
|
43
51
|
|
44
52
|
# Next, we want to ensure that we have a version of the current branch at a known location
|
53
|
+
scm.ensure_commitish_exists! base_commit
|
45
54
|
self.scm.exec "branch #{EnvironmentManager.danger_base_branch} #{base_commit}"
|
46
55
|
|
47
56
|
# OK, so we want to ensure that we have a known head branch, this will always represent
|
48
57
|
# the head of the PR ( e.g. the most recent commit that will be merged. )
|
58
|
+
scm.ensure_commitish_exists! head_commit
|
49
59
|
self.scm.exec "branch #{EnvironmentManager.danger_head_branch} #{head_commit}"
|
50
60
|
end
|
51
61
|
|
@@ -10,16 +10,20 @@ module Danger
|
|
10
10
|
|
11
11
|
attr_accessor :pr_json, :issue_json, :support_tokenless_auth
|
12
12
|
|
13
|
+
def self.env_vars
|
14
|
+
["DANGER_GITHUB_API_TOKEN"]
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.optional_env_vars
|
18
|
+
["DANGER_GITHUB_HOST", "DANGER_GITHUB_API_BASE_URL"]
|
19
|
+
end
|
20
|
+
|
13
21
|
def initialize(ci_source, environment)
|
14
22
|
self.ci_source = ci_source
|
15
23
|
self.environment = environment
|
16
24
|
self.support_tokenless_auth = false
|
17
25
|
|
18
|
-
Octokit.auto_paginate = true
|
19
26
|
@token = @environment["DANGER_GITHUB_API_TOKEN"]
|
20
|
-
if api_url
|
21
|
-
Octokit.api_endpoint = api_url
|
22
|
-
end
|
23
27
|
end
|
24
28
|
|
25
29
|
def validates_as_api_source?
|
@@ -34,16 +38,23 @@ module Danger
|
|
34
38
|
@host = @environment["DANGER_GITHUB_HOST"] || "github.com"
|
35
39
|
end
|
36
40
|
|
41
|
+
# `DANGER_GITHUB_API_HOST` is the old name kept for legacy reasons and
|
42
|
+
# backwards compatibility. `DANGER_GITHUB_API_BASE_URL` is the new
|
43
|
+
# correctly named variable.
|
37
44
|
def api_url
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
45
|
+
@environment.fetch("DANGER_GITHUB_API_HOST") do
|
46
|
+
@environment.fetch("DANGER_GITHUB_API_BASE_URL") do
|
47
|
+
"https://api.github.com/".freeze
|
48
|
+
end
|
49
|
+
end
|
42
50
|
end
|
43
51
|
|
44
52
|
def client
|
45
53
|
raise "No API token given, please provide one using `DANGER_GITHUB_API_TOKEN`" if !@token && !support_tokenless_auth
|
46
|
-
|
54
|
+
|
55
|
+
@client ||= begin
|
56
|
+
Octokit::Client.new(access_token: @token, auto_paginate: true, api_endpoint: api_url)
|
57
|
+
end
|
47
58
|
end
|
48
59
|
|
49
60
|
def pr_diff
|
@@ -56,10 +67,12 @@ module Danger
|
|
56
67
|
head_commit = self.pr_json["head"]["sha"]
|
57
68
|
|
58
69
|
# Next, we want to ensure that we have a version of the current branch at a known location
|
70
|
+
scm.ensure_commitish_exists! base_commit
|
59
71
|
self.scm.exec "branch #{EnvironmentManager.danger_base_branch} #{base_commit}"
|
60
72
|
|
61
73
|
# OK, so we want to ensure that we have a known head branch, this will always represent
|
62
74
|
# the head of the PR ( e.g. the most recent commit that will be merged. )
|
75
|
+
scm.ensure_commitish_exists! head_commit
|
63
76
|
self.scm.exec "branch #{EnvironmentManager.danger_head_branch} #{head_commit}"
|
64
77
|
end
|
65
78
|
|
@@ -9,6 +9,14 @@ module Danger
|
|
9
9
|
include Danger::Helpers::CommentsHelper
|
10
10
|
attr_accessor :mr_json, :commits_json
|
11
11
|
|
12
|
+
def self.env_vars
|
13
|
+
["DANGER_GITLAB_API_TOKEN"]
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.optional_env_vars
|
17
|
+
["DANGER_GITLAB_HOST", "DANGER_GITLAB_API_BASE_URL"]
|
18
|
+
end
|
19
|
+
|
12
20
|
def initialize(ci_source, environment)
|
13
21
|
self.ci_source = ci_source
|
14
22
|
self.environment = environment
|
@@ -43,7 +51,7 @@ module Danger
|
|
43
51
|
|
44
52
|
def base_commit
|
45
53
|
first_commit_in_branch = self.commits_json.last.id
|
46
|
-
@
|
54
|
+
@base_commit ||= self.scm.exec "rev-parse #{first_commit_in_branch}^1"
|
47
55
|
end
|
48
56
|
|
49
57
|
def mr_comments
|
@@ -64,10 +72,12 @@ module Danger
|
|
64
72
|
head_commit = self.scm.head_commit
|
65
73
|
|
66
74
|
# Next, we want to ensure that we have a version of the current branch at a known location
|
75
|
+
scm.ensure_commitish_exists! base_commit
|
67
76
|
self.scm.exec "branch #{EnvironmentManager.danger_base_branch} #{base_commit}"
|
68
77
|
|
69
78
|
# OK, so we want to ensure that we have a known head branch, this will always represent
|
70
79
|
# the head of the PR ( e.g. the most recent commit that will be merged. )
|
80
|
+
scm.ensure_commitish_exists! head_commit
|
71
81
|
self.scm.exec "branch #{EnvironmentManager.danger_head_branch} #{head_commit}"
|
72
82
|
end
|
73
83
|
|
@@ -5,6 +5,14 @@ module Danger
|
|
5
5
|
|
6
6
|
attr_accessor :ci_source, :environment, :scm, :host, :ignored_violations
|
7
7
|
|
8
|
+
def self.env_vars
|
9
|
+
raise "Subclass and overwrite self.env_vars"
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.optional_env_vars
|
13
|
+
[]
|
14
|
+
end
|
15
|
+
|
8
16
|
def self.inherited(child_class)
|
9
17
|
available_request_sources.add child_class
|
10
18
|
super
|
@@ -14,6 +22,16 @@ module Danger
|
|
14
22
|
@available_request_sources ||= Set.new
|
15
23
|
end
|
16
24
|
|
25
|
+
def self.source_name
|
26
|
+
to_s.sub("Danger::RequestSources::".freeze, "".freeze)
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.available_source_names_and_envs
|
30
|
+
available_request_sources.map do |klass|
|
31
|
+
" - #{klass.source_name}: #{klass.env_vars.join(', '.freeze).yellow}"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
17
35
|
def initialize(_ci_source, _environment)
|
18
36
|
raise "Subclass and overwrite initialize"
|
19
37
|
end
|
@@ -36,15 +36,15 @@ module Danger
|
|
36
36
|
exec("remote show origin -n").lines.grep(/Fetch URL/)[0].split(": ", 2)[1].chomp
|
37
37
|
end
|
38
38
|
|
39
|
+
def ensure_commitish_exists!(commitish)
|
40
|
+
exec("fetch") if exec("rev-parse --quiet --verify #{commitish}").empty?
|
41
|
+
end
|
42
|
+
|
39
43
|
private
|
40
44
|
|
41
45
|
def default_env
|
42
46
|
{ "LANG" => "en_US.UTF-8" }
|
43
47
|
end
|
44
|
-
|
45
|
-
def ensure_commitish_exists!(commitish)
|
46
|
-
exec "fetch" if exec("--no-pager show #{commitish}").empty?
|
47
|
-
end
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
data/lib/danger/version.rb
CHANGED
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: 3.
|
4
|
+
version: 3.4.0
|
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: 2016-09-
|
12
|
+
date: 2016-09-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: claide
|