danger 8.0.4

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.
Files changed (121) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +22 -0
  3. data/README.md +94 -0
  4. data/bin/danger +5 -0
  5. data/lib/assets/DangerfileTemplate +13 -0
  6. data/lib/danger.rb +44 -0
  7. data/lib/danger/ci_source/appcenter.rb +55 -0
  8. data/lib/danger/ci_source/appveyor.rb +60 -0
  9. data/lib/danger/ci_source/azure_pipelines.rb +44 -0
  10. data/lib/danger/ci_source/bamboo.rb +41 -0
  11. data/lib/danger/ci_source/bitbucket_pipelines.rb +37 -0
  12. data/lib/danger/ci_source/bitrise.rb +65 -0
  13. data/lib/danger/ci_source/buddybuild.rb +62 -0
  14. data/lib/danger/ci_source/buildkite.rb +51 -0
  15. data/lib/danger/ci_source/ci_source.rb +37 -0
  16. data/lib/danger/ci_source/circle.rb +94 -0
  17. data/lib/danger/ci_source/circle_api.rb +51 -0
  18. data/lib/danger/ci_source/cirrus.rb +31 -0
  19. data/lib/danger/ci_source/code_build.rb +57 -0
  20. data/lib/danger/ci_source/codefresh.rb +53 -0
  21. data/lib/danger/ci_source/codeship.rb +44 -0
  22. data/lib/danger/ci_source/dotci.rb +52 -0
  23. data/lib/danger/ci_source/drone.rb +71 -0
  24. data/lib/danger/ci_source/github_actions.rb +43 -0
  25. data/lib/danger/ci_source/gitlab_ci.rb +86 -0
  26. data/lib/danger/ci_source/jenkins.rb +149 -0
  27. data/lib/danger/ci_source/local_git_repo.rb +119 -0
  28. data/lib/danger/ci_source/local_only_git_repo.rb +47 -0
  29. data/lib/danger/ci_source/screwdriver.rb +47 -0
  30. data/lib/danger/ci_source/semaphore.rb +37 -0
  31. data/lib/danger/ci_source/support/commits.rb +17 -0
  32. data/lib/danger/ci_source/support/find_repo_info_from_logs.rb +35 -0
  33. data/lib/danger/ci_source/support/find_repo_info_from_url.rb +42 -0
  34. data/lib/danger/ci_source/support/local_pull_request.rb +14 -0
  35. data/lib/danger/ci_source/support/no_pull_request.rb +7 -0
  36. data/lib/danger/ci_source/support/no_repo_info.rb +5 -0
  37. data/lib/danger/ci_source/support/pull_request_finder.rb +179 -0
  38. data/lib/danger/ci_source/support/remote_pull_request.rb +15 -0
  39. data/lib/danger/ci_source/support/repo_info.rb +10 -0
  40. data/lib/danger/ci_source/surf.rb +37 -0
  41. data/lib/danger/ci_source/teamcity.rb +161 -0
  42. data/lib/danger/ci_source/travis.rb +51 -0
  43. data/lib/danger/ci_source/vsts.rb +73 -0
  44. data/lib/danger/ci_source/xcode_server.rb +48 -0
  45. data/lib/danger/clients/rubygems_client.rb +14 -0
  46. data/lib/danger/commands/dangerfile/gem.rb +43 -0
  47. data/lib/danger/commands/dangerfile/init.rb +30 -0
  48. data/lib/danger/commands/dry_run.rb +54 -0
  49. data/lib/danger/commands/init.rb +297 -0
  50. data/lib/danger/commands/init_helpers/interviewer.rb +92 -0
  51. data/lib/danger/commands/local.rb +83 -0
  52. data/lib/danger/commands/local_helpers/http_cache.rb +36 -0
  53. data/lib/danger/commands/local_helpers/local_setup.rb +46 -0
  54. data/lib/danger/commands/local_helpers/pry_setup.rb +31 -0
  55. data/lib/danger/commands/plugins/plugin_json.rb +46 -0
  56. data/lib/danger/commands/plugins/plugin_lint.rb +54 -0
  57. data/lib/danger/commands/plugins/plugin_readme.rb +45 -0
  58. data/lib/danger/commands/pr.rb +92 -0
  59. data/lib/danger/commands/runner.rb +94 -0
  60. data/lib/danger/commands/staging.rb +53 -0
  61. data/lib/danger/commands/systems.rb +43 -0
  62. data/lib/danger/comment_generators/bitbucket_server.md.erb +20 -0
  63. data/lib/danger/comment_generators/bitbucket_server_inline.md.erb +15 -0
  64. data/lib/danger/comment_generators/bitbucket_server_message_group.md.erb +12 -0
  65. data/lib/danger/comment_generators/github.md.erb +55 -0
  66. data/lib/danger/comment_generators/github_inline.md.erb +26 -0
  67. data/lib/danger/comment_generators/gitlab.md.erb +40 -0
  68. data/lib/danger/comment_generators/gitlab_inline.md.erb +26 -0
  69. data/lib/danger/comment_generators/vsts.md.erb +20 -0
  70. data/lib/danger/core_ext/file_list.rb +18 -0
  71. data/lib/danger/core_ext/string.rb +20 -0
  72. data/lib/danger/danger_core/dangerfile.rb +341 -0
  73. data/lib/danger/danger_core/dangerfile_dsl.rb +29 -0
  74. data/lib/danger/danger_core/dangerfile_generator.rb +11 -0
  75. data/lib/danger/danger_core/environment_manager.rb +123 -0
  76. data/lib/danger/danger_core/executor.rb +92 -0
  77. data/lib/danger/danger_core/message_aggregator.rb +49 -0
  78. data/lib/danger/danger_core/message_group.rb +68 -0
  79. data/lib/danger/danger_core/messages/base.rb +56 -0
  80. data/lib/danger/danger_core/messages/markdown.rb +42 -0
  81. data/lib/danger/danger_core/messages/violation.rb +54 -0
  82. data/lib/danger/danger_core/plugins/dangerfile_bitbucket_cloud_plugin.rb +144 -0
  83. data/lib/danger/danger_core/plugins/dangerfile_bitbucket_server_plugin.rb +211 -0
  84. data/lib/danger/danger_core/plugins/dangerfile_danger_plugin.rb +248 -0
  85. data/lib/danger/danger_core/plugins/dangerfile_git_plugin.rb +158 -0
  86. data/lib/danger/danger_core/plugins/dangerfile_github_plugin.rb +254 -0
  87. data/lib/danger/danger_core/plugins/dangerfile_gitlab_plugin.rb +240 -0
  88. data/lib/danger/danger_core/plugins/dangerfile_local_only_plugin.rb +42 -0
  89. data/lib/danger/danger_core/plugins/dangerfile_messaging_plugin.rb +218 -0
  90. data/lib/danger/danger_core/plugins/dangerfile_vsts_plugin.rb +191 -0
  91. data/lib/danger/danger_core/standard_error.rb +143 -0
  92. data/lib/danger/helpers/array_subclass.rb +61 -0
  93. data/lib/danger/helpers/comment.rb +32 -0
  94. data/lib/danger/helpers/comments_helper.rb +178 -0
  95. data/lib/danger/helpers/comments_parsing_helper.rb +70 -0
  96. data/lib/danger/helpers/emoji_mapper.rb +41 -0
  97. data/lib/danger/helpers/find_max_num_violations.rb +31 -0
  98. data/lib/danger/helpers/message_groups_array_helper.rb +31 -0
  99. data/lib/danger/plugin_support/gems_resolver.rb +77 -0
  100. data/lib/danger/plugin_support/plugin.rb +49 -0
  101. data/lib/danger/plugin_support/plugin_file_resolver.rb +30 -0
  102. data/lib/danger/plugin_support/plugin_linter.rb +161 -0
  103. data/lib/danger/plugin_support/plugin_parser.rb +199 -0
  104. data/lib/danger/plugin_support/templates/readme_table.html.erb +26 -0
  105. data/lib/danger/request_sources/bitbucket_cloud.rb +171 -0
  106. data/lib/danger/request_sources/bitbucket_cloud_api.rb +181 -0
  107. data/lib/danger/request_sources/bitbucket_server.rb +105 -0
  108. data/lib/danger/request_sources/bitbucket_server_api.rb +117 -0
  109. data/lib/danger/request_sources/github/github.rb +530 -0
  110. data/lib/danger/request_sources/github/github_review.rb +126 -0
  111. data/lib/danger/request_sources/github/github_review_resolver.rb +19 -0
  112. data/lib/danger/request_sources/github/github_review_unsupported.rb +25 -0
  113. data/lib/danger/request_sources/gitlab.rb +525 -0
  114. data/lib/danger/request_sources/local_only.rb +53 -0
  115. data/lib/danger/request_sources/request_source.rb +85 -0
  116. data/lib/danger/request_sources/support/get_ignored_violation.rb +17 -0
  117. data/lib/danger/request_sources/vsts.rb +118 -0
  118. data/lib/danger/request_sources/vsts_api.rb +138 -0
  119. data/lib/danger/scm_source/git_repo.rb +181 -0
  120. data/lib/danger/version.rb +4 -0
  121. metadata +339 -0
@@ -0,0 +1,26 @@
1
+ <% json.each do |plugin| %>
2
+
3
+ ### <%= plugin["instance_name"] %>
4
+
5
+ <%= plugin["body_md"] %>
6
+ <%- plugin["example_code"].each do |example| %>
7
+ <blockquote><%= example["title"] %>
8
+ <pre><%= example["text"] %></pre>
9
+ </blockquote>
10
+ <%- end %>
11
+
12
+ <%- unless plugin["attributes"].empty? %>
13
+ #### Attributes
14
+ <%- plugin["attributes"].each do |attribute| %>
15
+ `<%= attribute.keys.first %>` - <%= attribute.values.first["write"]["body_md"] %>
16
+ <%- end %>
17
+ <%- end %>
18
+
19
+ <%- unless plugin["methods"].empty? %>
20
+ #### Methods
21
+ <%- plugin["methods"].each do |method| %>
22
+ `<%= method["name"] %>` - <%= method["body_md"] %>
23
+ <%- end %>
24
+ <%- end %>
25
+
26
+ <% end %>
@@ -0,0 +1,171 @@
1
+ # coding: utf-8
2
+
3
+ require "danger/helpers/comments_helper"
4
+ require "danger/request_sources/bitbucket_cloud_api"
5
+ require "danger/danger_core/message_group"
6
+
7
+ module Danger
8
+ module RequestSources
9
+ class BitbucketCloud < RequestSource
10
+ include Danger::Helpers::CommentsHelper
11
+ attr_accessor :pr_json
12
+
13
+ def self.env_vars
14
+ [
15
+ "DANGER_BITBUCKETCLOUD_USERNAME",
16
+ "DANGER_BITBUCKETCLOUD_UUID",
17
+ "DANGER_BITBUCKETCLOUD_PASSWORD"
18
+ ]
19
+ end
20
+
21
+ def self.optional_env_vars
22
+ ["DANGER_BITBUCKETCLOUD_OAUTH_KEY", "DANGER_BITBUCKETCLOUD_OAUTH_SECRET"]
23
+ end
24
+
25
+ def initialize(ci_source, environment)
26
+ self.ci_source = ci_source
27
+ self.environment = environment
28
+
29
+ @api = BitbucketCloudAPI.new(ci_source.repo_slug, ci_source.pull_request_id, nil, environment)
30
+ end
31
+
32
+ def validates_as_ci?
33
+ # TODO: ???
34
+ true
35
+ end
36
+
37
+ def validates_as_api_source?
38
+ @api.credentials_given?
39
+ end
40
+
41
+ def scm
42
+ @scm ||= GitRepo.new
43
+ end
44
+
45
+ def host
46
+ @host ||= @api.host
47
+ end
48
+
49
+ def fetch_details
50
+ self.pr_json = @api.fetch_pr_json
51
+ end
52
+
53
+ def setup_danger_branches
54
+ base_branch = self.pr_json[:destination][:branch][:name]
55
+ base_commit = self.pr_json[:destination][:commit][:hash]
56
+ head_branch = self.pr_json[:source][:branch][:name]
57
+ head_commit = self.pr_json[:source][:commit][:hash]
58
+
59
+ # Next, we want to ensure that we have a version of the current branch at a known location
60
+ scm.ensure_commitish_exists_on_branch! base_branch, base_commit
61
+ self.scm.exec "branch #{EnvironmentManager.danger_base_branch} #{base_commit}"
62
+
63
+ # OK, so we want to ensure that we have a known head branch, this will always represent
64
+ # the head of the PR ( e.g. the most recent commit that will be merged. )
65
+ scm.ensure_commitish_exists_on_branch! head_branch, head_commit
66
+ self.scm.exec "branch #{EnvironmentManager.danger_head_branch} #{head_commit}"
67
+ end
68
+
69
+ def organisation
70
+ nil
71
+ end
72
+
73
+ def update_pull_request!(warnings: [], errors: [], messages: [], markdowns: [], danger_id: "danger", new_comment: false, remove_previous_comments: false)
74
+ delete_old_comments(danger_id: danger_id) if !new_comment || remove_previous_comments
75
+
76
+ comment = generate_description(warnings: warnings, errors: errors, template: "bitbucket_server")
77
+ comment += "\n\n"
78
+
79
+ warnings = update_inline_comments_for_kind!(:warnings, warnings, danger_id: danger_id)
80
+ errors = update_inline_comments_for_kind!(:errors, errors, danger_id: danger_id)
81
+ messages = update_inline_comments_for_kind!(:messages, messages, danger_id: danger_id)
82
+ markdowns = update_inline_comments_for_kind!(:markdowns, markdowns, danger_id: danger_id)
83
+
84
+ comment += generate_comment(warnings: warnings,
85
+ errors: errors,
86
+ messages: messages,
87
+ markdowns: markdowns,
88
+ previous_violations: {},
89
+ danger_id: danger_id,
90
+ template: "bitbucket_server")
91
+
92
+ @api.post_comment(comment)
93
+ end
94
+
95
+ def update_pr_by_line!(message_groups:,
96
+ danger_id: "danger",
97
+ new_comment: false,
98
+ remove_previous_comments: false)
99
+ if !new_comment || remove_previous_comments
100
+ delete_old_comments(danger_id: danger_id)
101
+ end
102
+
103
+ summary_body = generate_description(warnings: message_groups.fake_warnings_array,
104
+ errors: message_groups.fake_errors_array,
105
+ template: "bitbucket_server")
106
+ summary_body += "\n\n"
107
+
108
+
109
+ # this isn't the most elegant thing in the world, but we need the group
110
+ # with file: nil, line: nil so we can combine its info in with the
111
+ # summary_body
112
+ summary_group = message_groups.first
113
+ if summary_group && summary_group.file.nil? && summary_group.line.nil?
114
+ # remove summary_group from message_groups so it doesn't get a
115
+ # duplicate comment posted in the message_groups loop below
116
+ message_groups.shift
117
+ else
118
+ summary_group = MessageGroup.new(file: nil, line: nil)
119
+ end
120
+
121
+ summary_body += generate_message_group_comment(
122
+ message_group: summary_group,
123
+ danger_id: danger_id,
124
+ template: "bitbucket_server_message_group"
125
+ )
126
+
127
+ @api.post_comment(summary_body)
128
+
129
+ message_groups.each do |message_group|
130
+ body = generate_message_group_comment(message_group: message_group,
131
+ danger_id: danger_id,
132
+ template: "bitbucket_server_message_group")
133
+ @api.post_comment(body,
134
+ file: message_group.file,
135
+ line: message_group.line)
136
+ end
137
+ end
138
+
139
+ def update_inline_comments_for_kind!(kind, messages, danger_id: "danger")
140
+ emoji = { warnings: "warning", errors: "no_entry_sign", messages: "book" }[kind]
141
+
142
+ messages.reject do |message|
143
+ next false unless message.file && message.line
144
+
145
+ body = ""
146
+
147
+ if kind == :markdown
148
+ body = generate_inline_markdown_body(message,
149
+ danger_id: danger_id,
150
+ template: "bitbucket_server")
151
+ else
152
+ body = generate_inline_comment_body(emoji, message,
153
+ danger_id: danger_id,
154
+ template: "bitbucket_server")
155
+ end
156
+
157
+ @api.post_comment(body, file: message.file, line: message.line)
158
+
159
+ true
160
+ end
161
+ end
162
+
163
+ def delete_old_comments(danger_id: "danger")
164
+ @api.fetch_comments.each do |c|
165
+ next if c[:user][:uuid] != @api.my_uuid
166
+ @api.delete_comment(c[:id]) if c[:content][:raw] =~ /generated_by_#{danger_id}/
167
+ end
168
+ end
169
+ end
170
+ end
171
+ end
@@ -0,0 +1,181 @@
1
+ # coding: utf-8
2
+
3
+ require "danger/helpers/comments_helper"
4
+
5
+ module Danger
6
+ module RequestSources
7
+ class BitbucketCloudAPI
8
+ attr_accessor :host, :project, :slug, :access_token, :pull_request_id
9
+ attr_reader :my_uuid
10
+
11
+ def initialize(repo_slug, pull_request_id, branch_name, environment)
12
+ initialize_my_uuid(environment["DANGER_BITBUCKETCLOUD_UUID"])
13
+ @username = environment["DANGER_BITBUCKETCLOUD_USERNAME"]
14
+ @password = environment["DANGER_BITBUCKETCLOUD_PASSWORD"]
15
+ self.project, self.slug = repo_slug.split("/")
16
+ self.access_token = fetch_access_token(environment)
17
+ self.pull_request_id = pull_request_id || fetch_pr_from_branch(branch_name)
18
+ self.host = "https://bitbucket.org/"
19
+ end
20
+
21
+ def initialize_my_uuid(uuid)
22
+ return if uuid.nil?
23
+ return @my_uuid = uuid if uuid.empty?
24
+
25
+ if uuid.start_with?("{") && uuid.end_with?("}")
26
+ @my_uuid = uuid
27
+ else
28
+ @my_uuid = "{#{uuid}}"
29
+ end
30
+ end
31
+
32
+ def inspect
33
+ inspected = super
34
+
35
+ if @password
36
+ inspected = inspected.sub! @password, "********".freeze
37
+ end
38
+
39
+ inspected
40
+ end
41
+
42
+ def credentials_given?
43
+ @my_uuid && !@my_uuid.empty? &&
44
+ @username && !@username.empty? &&
45
+ @password && !@password.empty?
46
+ end
47
+
48
+ def pull_request(*)
49
+ fetch_pr_json
50
+ end
51
+
52
+ def fetch_pr_json
53
+ uri = URI(pr_api_endpoint)
54
+ fetch_json(uri)
55
+ end
56
+
57
+ def fetch_comments
58
+ values = []
59
+ # TODO: use a url parts encoder to encode the query
60
+ uri = "#{pr_api_endpoint}/comments?pagelen=100&q=deleted+%7E+false+AND+user.username+%7E+%22#{@username}%22"
61
+
62
+ while uri
63
+ json = fetch_json(URI(uri))
64
+ values += json[:values]
65
+ uri = json[:next]
66
+ end
67
+ values
68
+ end
69
+
70
+ def delete_comment(id)
71
+ uri = URI("#{pr_api_endpoint}/comments/#{id}")
72
+ delete(uri)
73
+ end
74
+
75
+ def post_comment(text, file: nil, line: nil)
76
+ uri = URI("#{pr_api_endpoint}/comments")
77
+ body = {
78
+ content: {
79
+ raw: text
80
+ }
81
+ }
82
+ body.merge!(inline: { path: file, to: line }) if file && line
83
+
84
+ post(uri, body.to_json)
85
+ end
86
+
87
+ private
88
+
89
+ def base_url(version)
90
+ "https://api.bitbucket.org/#{version}.0/repositories/#{project}/#{slug}/pullrequests"
91
+ end
92
+
93
+ def pr_api_endpoint
94
+ "#{base_url(2)}/#{pull_request_id}"
95
+ end
96
+
97
+ def prs_api_endpoint(branch_name)
98
+ "#{base_url(2)}?q=source.branch.name=\"#{branch_name}\""
99
+ end
100
+
101
+ def fetch_pr_from_branch(branch_name)
102
+ uri = URI(URI.escape(prs_api_endpoint(branch_name)))
103
+ fetch_json(uri)[:values][0][:id]
104
+ end
105
+
106
+ def fetch_access_token(environment)
107
+ oauth_key = environment["DANGER_BITBUCKETCLOUD_OAUTH_KEY"]
108
+ oauth_secret = environment["DANGER_BITBUCKETCLOUD_OAUTH_SECRET"]
109
+ return nil if oauth_key.nil?
110
+ return nil if oauth_secret.nil?
111
+
112
+ uri = URI.parse("https://bitbucket.org/site/oauth2/access_token")
113
+ req = Net::HTTP::Post.new(uri.request_uri, { "Content-Type" => "application/json" })
114
+ req.basic_auth oauth_key, oauth_secret
115
+ req.set_form_data({'grant_type' => 'client_credentials'})
116
+ res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
117
+ http.request(req)
118
+ end
119
+
120
+ JSON.parse(res.body, symbolize_names: true)[:access_token]
121
+ end
122
+
123
+ def fetch_json(uri)
124
+ raise credentials_not_available unless credentials_given?
125
+
126
+ req = Net::HTTP::Get.new(uri.request_uri, { "Content-Type" => "application/json" })
127
+ if access_token.nil?
128
+ req.basic_auth @username, @password
129
+ else
130
+ req["Authorization"] = "Bearer #{access_token}"
131
+ end
132
+ res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
133
+ http.request(req)
134
+ end
135
+ raise error_fetching_json(uri.to_s, res.code) unless res.code == "200"
136
+
137
+ JSON.parse(res.body, symbolize_names: true)
138
+ end
139
+
140
+ def post(uri, body)
141
+ raise credentials_not_available unless credentials_given?
142
+
143
+ req = Net::HTTP::Post.new(uri.request_uri, { "Content-Type" => "application/json" })
144
+ if access_token.nil?
145
+ req.basic_auth @username, @password
146
+ else
147
+ req["Authorization"] = "Bearer #{access_token}"
148
+ end
149
+ req.body = body
150
+ Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
151
+ http.request(req)
152
+ end
153
+ end
154
+
155
+ def delete(uri)
156
+ raise credentials_not_available unless credentials_given?
157
+
158
+ req = Net::HTTP::Delete.new(uri.request_uri, { "Content-Type" => "application/json" })
159
+ if access_token.nil?
160
+ req.basic_auth @username, @password
161
+ else
162
+ req["Authorization"] = "Bearer #{access_token}"
163
+ end
164
+ Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
165
+ http.request(req)
166
+ end
167
+ end
168
+
169
+ def credentials_not_available
170
+ "Credentials not available. Provide DANGER_BITBUCKETCLOUD_USERNAME, " \
171
+ "DANGER_BITBUCKETCLOUD_UUID, and DANGER_BITBUCKETCLOUD_PASSWORD " \
172
+ "as environment variables."
173
+ end
174
+
175
+ def error_fetching_json(url, status_code)
176
+ "Error fetching json for: #{url}, status code: #{status_code}"
177
+ end
178
+
179
+ end
180
+ end
181
+ end
@@ -0,0 +1,105 @@
1
+ # coding: utf-8
2
+
3
+ require "danger/helpers/comments_helper"
4
+ require "danger/request_sources/bitbucket_server_api"
5
+
6
+ module Danger
7
+ module RequestSources
8
+ class BitbucketServer < RequestSource
9
+ include Danger::Helpers::CommentsHelper
10
+ attr_accessor :pr_json
11
+
12
+ def self.env_vars
13
+ [
14
+ "DANGER_BITBUCKETSERVER_USERNAME",
15
+ "DANGER_BITBUCKETSERVER_PASSWORD",
16
+ "DANGER_BITBUCKETSERVER_HOST"
17
+ ]
18
+ end
19
+
20
+ def initialize(ci_source, environment)
21
+ self.ci_source = ci_source
22
+ self.environment = environment
23
+
24
+ project, slug = ci_source.repo_slug.split("/")
25
+ @api = BitbucketServerAPI.new(project, slug, ci_source.pull_request_id, environment)
26
+ end
27
+
28
+ def validates_as_ci?
29
+ # TODO: ???
30
+ true
31
+ end
32
+
33
+ def validates_as_api_source?
34
+ @api.credentials_given?
35
+ end
36
+
37
+ def scm
38
+ @scm ||= GitRepo.new
39
+ end
40
+
41
+ def host
42
+ @host ||= @api.host
43
+ end
44
+
45
+ def fetch_details
46
+ self.pr_json = @api.fetch_pr_json
47
+ end
48
+
49
+ def setup_danger_branches
50
+ base_branch = self.pr_json[:toRef][:id].sub("refs/heads/", "")
51
+ base_commit = self.pr_json[:toRef][:latestCommit]
52
+ # Support for older versions of Bitbucket Server
53
+ base_commit = self.pr_json[:toRef][:latestChangeset] if self.pr_json[:fromRef].key? :latestChangeset
54
+ head_branch = self.pr_json[:fromRef][:id].sub("refs/heads/", "")
55
+ head_commit = self.pr_json[:fromRef][:latestCommit]
56
+ # Support for older versions of Bitbucket Server
57
+ head_commit = self.pr_json[:fromRef][:latestChangeset] if self.pr_json[:fromRef].key? :latestChangeset
58
+
59
+ # Next, we want to ensure that we have a version of the current branch at a known location
60
+ scm.ensure_commitish_exists_on_branch! base_branch, base_commit
61
+ self.scm.exec "branch #{EnvironmentManager.danger_base_branch} #{base_commit}"
62
+
63
+ # OK, so we want to ensure that we have a known head branch, this will always represent
64
+ # the head of the PR ( e.g. the most recent commit that will be merged. )
65
+ scm.ensure_commitish_exists_on_branch! head_branch, head_commit
66
+ self.scm.exec "branch #{EnvironmentManager.danger_head_branch} #{head_commit}"
67
+ end
68
+
69
+ def organisation
70
+ nil
71
+ end
72
+
73
+ def update_pull_request!(warnings: [], errors: [], messages: [], markdowns: [], danger_id: "danger", new_comment: false, remove_previous_comments: false)
74
+ delete_old_comments(danger_id: danger_id) if !new_comment || remove_previous_comments
75
+
76
+ comment = generate_description(warnings: warnings, errors: errors)
77
+ comment += "\n\n"
78
+ comment += generate_comment(warnings: warnings,
79
+ errors: errors,
80
+ messages: messages,
81
+ markdowns: markdowns,
82
+ previous_violations: {},
83
+ danger_id: danger_id,
84
+ template: "bitbucket_server")
85
+
86
+ @api.post_comment(comment)
87
+ end
88
+
89
+ def delete_old_comments(danger_id: "danger")
90
+ @api.fetch_last_comments.each do |c|
91
+ @api.delete_comment(c[:id], c[:version]) if c[:text] =~ /generated_by_#{danger_id}/
92
+ end
93
+ end
94
+
95
+ def update_pr_build_status(status, build_job_link, description)
96
+ changeset = self.pr_json[:fromRef][:latestCommit]
97
+ # Support for older versions of Bitbucket Server
98
+ changeset = self.pr_json[:fromRef][:latestChangeset] if self.pr_json[:fromRef].key? :latestChangeset
99
+ puts "Changeset: " + changeset
100
+ puts self.pr_json.to_json
101
+ @api.update_pr_build_status(status, changeset, build_job_link, description)
102
+ end
103
+ end
104
+ end
105
+ end