danger 2.1.6 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/danger/ci_source/buildkite.rb +8 -1
- data/lib/danger/ci_source/drone.rb +1 -1
- data/lib/danger/ci_source/gitlab_ci.rb +32 -0
- data/lib/danger/ci_source/jenkins.rb +22 -5
- data/lib/danger/ci_source/teamcity.rb +39 -2
- data/lib/danger/commands/plugins/plugin_readme.rb +0 -1
- data/lib/danger/comment_generators/github.md.erb +1 -1
- data/lib/danger/comment_generators/gitlab.md.erb +40 -0
- data/lib/danger/danger_core/dangerfile.rb +3 -2
- data/lib/danger/danger_core/environment_manager.rb +2 -1
- data/lib/danger/danger_core/executor.rb +1 -6
- data/lib/danger/danger_core/plugins/{dangerfile_import_plugin.rb → dangerfile_danger_plugin.rb} +26 -11
- data/lib/danger/danger_core/plugins/dangerfile_github_plugin.rb +5 -1
- data/lib/danger/danger_core/plugins/dangerfile_gitlab_plugin.rb +190 -0
- data/lib/danger/helpers/comments_helper.rb +41 -2
- data/lib/danger/request_source/github.rb +25 -46
- data/lib/danger/request_source/gitlab.rb +133 -0
- data/lib/danger/request_source/request_source.rb +4 -12
- data/lib/danger/version.rb +1 -1
- metadata +37 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8b7dea6bfd9bb27c05eaf6b537f6aff16e682155
|
4
|
+
data.tar.gz: 7ec69647d0f2d827487aefd873be938fbf11a96f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9f724c97c2cd8bd49e6c507ebf9d05885781600e0539c0fa06af9665247b61beec387b2386cfff32ce1a5c51a3392904bc9e288bb742029f98cd049b2566fd47
|
7
|
+
data.tar.gz: 3e17b9025db0a22d3af9f2c53be2e80a3bcd33e86cc24e8cb32ba810bcfe04456ca46385aa0e47abfbc870f1daf40db74845f948aa7e05fe1b28b4079e4b7b72
|
@@ -14,9 +14,16 @@ module Danger
|
|
14
14
|
#
|
15
15
|
# ### Token Setup
|
16
16
|
#
|
17
|
+
# #### GitHub
|
18
|
+
#
|
17
19
|
# As this is self-hosted, you will need to add the `DANGER_GITHUB_API_TOKEN` to your build user's ENV. The alternative
|
18
20
|
# is to pass in the token as a prefix to the command `DANGER_GITHUB_API_TOKEN="123" bundle exec danger`.
|
19
21
|
#
|
22
|
+
# #### GitLab
|
23
|
+
#
|
24
|
+
# As this is self-hosted, you will need to add the `DANGER_GITLAB_API_TOKEN` to your build user's ENV. The alternative
|
25
|
+
# is to pass in the token as a prefix to the command `DANGER_GITLAB_API_TOKEN="123" bundle exec danger`.
|
26
|
+
#
|
20
27
|
class Buildkite < CI
|
21
28
|
def self.validates_as_ci?(env)
|
22
29
|
env.key? "BUILDKITE"
|
@@ -36,7 +43,7 @@ module Danger
|
|
36
43
|
end
|
37
44
|
|
38
45
|
def supported_request_sources
|
39
|
-
@supported_request_sources ||= [Danger::RequestSources::GitHub]
|
46
|
+
@supported_request_sources ||= [Danger::RequestSources::GitHub, Danger::RequestSources::GitLab]
|
40
47
|
end
|
41
48
|
end
|
42
49
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# http://docs.gitlab.com/ce/ci/variables/README.html
|
2
|
+
require "uri"
|
3
|
+
|
4
|
+
module Danger
|
5
|
+
# ### CI Setup
|
6
|
+
# GitLab CI is currently not supported because GitLab's runners don't expose
|
7
|
+
# the required values in the environment. Namely CI_MERGE_REQUEST_ID does not
|
8
|
+
# exist as of yet, however there is an
|
9
|
+
# [MR](https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/5698) fixing this.
|
10
|
+
# If that has been merged and you are using either gitlab.com or a release
|
11
|
+
# with that change this CISource will wokr.
|
12
|
+
#
|
13
|
+
class GitLabCI < CI
|
14
|
+
def self.validates_as_ci?(env)
|
15
|
+
env.key? "GITLAB_CI"
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.validates_as_pr?(env)
|
19
|
+
exists = ["CI_MERGE_REQUEST_ID", "CI_PROJECT_ID", "GITLAB_CI"].all? { |x| env[x] }
|
20
|
+
exists && env["CI_MERGE_REQUEST_ID"].to_i > 0
|
21
|
+
end
|
22
|
+
|
23
|
+
def supported_request_sources
|
24
|
+
@supported_request_sources ||= [Danger::RequestSources::GitLab]
|
25
|
+
end
|
26
|
+
|
27
|
+
def initialize(env)
|
28
|
+
self.repo_slug = env["CI_PROJECT_ID"]
|
29
|
+
self.pull_request_id = env["CI_MERGE_REQUEST_ID"]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -5,9 +5,17 @@ module Danger
|
|
5
5
|
# https://jenkins-ci.org
|
6
6
|
|
7
7
|
# ### CI Setup
|
8
|
-
#
|
9
8
|
# Ah Jenkins, so many memories. So, if you're using Jenkins, you're hosting your own environment. You
|
10
|
-
#
|
9
|
+
#
|
10
|
+
# #### GitHub
|
11
|
+
# You will want to be using the [GitHub pull request builder plugin](https://wiki.jenkins-ci.org/display/JENKINS/GitHub+pull+request+builder+plugin)
|
12
|
+
# in order to ensure that you have the build environment set up for PR integration.
|
13
|
+
#
|
14
|
+
# With that set up, you can edit your job to add `bundle exec danger` at the build action.
|
15
|
+
#
|
16
|
+
# ### GitLab
|
17
|
+
#
|
18
|
+
# You will want to be using the [GitLabe Plugin](https://github.com/jenkinsci/gitlab-plugin)
|
11
19
|
# in order to ensure that you have the build environment set up for PR integration.
|
12
20
|
#
|
13
21
|
# With that set up, you can edit your job to add `bundle exec danger` at the build action.
|
@@ -22,19 +30,28 @@ module Danger
|
|
22
30
|
end
|
23
31
|
|
24
32
|
def self.validates_as_pr?(env)
|
25
|
-
|
33
|
+
id = pull_request_id(env)
|
34
|
+
!id.nil? && !id.empty?
|
26
35
|
end
|
27
36
|
|
28
37
|
def supported_request_sources
|
29
|
-
@supported_request_sources ||= [Danger::RequestSources::GitHub]
|
38
|
+
@supported_request_sources ||= [Danger::RequestSources::GitHub, Danger::RequestSources::GitLab]
|
30
39
|
end
|
31
40
|
|
32
41
|
def initialize(env)
|
33
42
|
self.repo_url = env["GIT_URL"]
|
34
|
-
self.pull_request_id = env
|
43
|
+
self.pull_request_id = self.class.pull_request_id(env)
|
35
44
|
|
36
45
|
repo_matches = self.repo_url.match(%r{([\/:])([^\/]+\/[^\/.]+)(?:.git)?$})
|
37
46
|
self.repo_slug = repo_matches[2] unless repo_matches.nil?
|
38
47
|
end
|
48
|
+
|
49
|
+
def self.pull_request_id(env)
|
50
|
+
if env["ghprPullId"]
|
51
|
+
env["ghprPullId"]
|
52
|
+
else
|
53
|
+
env["gitlabMergeRequestId"]
|
54
|
+
end
|
55
|
+
end
|
39
56
|
end
|
40
57
|
end
|
@@ -9,34 +9,71 @@ module Danger
|
|
9
9
|
#
|
10
10
|
# ### Token + Environment Setup
|
11
11
|
#
|
12
|
+
# #### GitHub
|
13
|
+
#
|
12
14
|
# As this is self-hosted, you will need to add the `DANGER_GITHUB_API_TOKEN` to your build user's ENV. The alternative
|
13
15
|
# is to pass in the token as a prefix to the command `DANGER_GITHUB_API_TOKEN="123" bundle exec danger`.
|
14
16
|
#
|
15
17
|
# However, you will need to find a way to add the environment vars: `GITHUB_REPO_SLUG`, `GITHUB_PULL_REQUEST_ID` and
|
16
18
|
# `GITHUB_REPO_URL`. These are not added by default. You could do this via the GitHub API potentially.
|
17
19
|
#
|
20
|
+
# #### GitLab
|
21
|
+
#
|
22
|
+
# As this is self-hosted, you will need to add the `DANGER_GITLAB_API_TOKEN` to your build user's ENV. The alternative
|
23
|
+
# is to pass in the token as a prefix to the command `DANGER_GITLAB_API_TOKEN="123" bundle exec danger`.
|
24
|
+
#
|
25
|
+
# However, you will need to find a way to add the environment vars: `GITLAB_REPO_SLUG`, `GITLAB_PULL_REQUEST_ID` and
|
26
|
+
# `GITLAB_REPO_URL`. These are not added by default. You could do this via the GitLab API potentially.
|
27
|
+
#
|
18
28
|
# We would love some advice on improving this setup.
|
19
29
|
#
|
20
30
|
class TeamCity < CI
|
31
|
+
class << self
|
32
|
+
def validates_as_github_pr?(env)
|
33
|
+
["GITHUB_PULL_REQUEST_ID", "GITHUB_REPO_URL", "GITHUB_REPO_URL"].all? { |x| env[x] && !env[x].empty? }
|
34
|
+
end
|
35
|
+
|
36
|
+
def validates_as_gitlab_pr?(env)
|
37
|
+
["GITLAB_REPO_SLUG", "GITLAB_PULL_REQUEST_ID", "GITLAB_REPO_URL"].all? { |x| env[x] && !env[x].empty? }
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
21
41
|
def self.validates_as_ci?(env)
|
22
42
|
env.key? "TEAMCITY_VERSION"
|
23
43
|
end
|
24
44
|
|
25
45
|
def self.validates_as_pr?(env)
|
26
|
-
|
46
|
+
validates_as_github_pr?(env) || validates_as_gitlab_pr?(env)
|
27
47
|
end
|
28
48
|
|
29
49
|
def supported_request_sources
|
30
|
-
@supported_request_sources ||= [Danger::RequestSources::GitHub]
|
50
|
+
@supported_request_sources ||= [Danger::RequestSources::GitHub, Danger::RequestSources::GitLab]
|
31
51
|
end
|
32
52
|
|
33
53
|
def initialize(env)
|
34
54
|
# NB: Unfortunately TeamCity doesn't provide these variables
|
35
55
|
# automatically so you have to add these variables manually to your
|
36
56
|
# project or build configuration
|
57
|
+
|
58
|
+
if self.class.validates_as_github_pr?(env)
|
59
|
+
extract_github_variables!(env)
|
60
|
+
elsif self.class.validates_as_gitlab_pr?(env)
|
61
|
+
extract_gitlab_variables!(env)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
private
|
66
|
+
|
67
|
+
def extract_github_variables!(env)
|
37
68
|
self.repo_slug = env["GITHUB_REPO_SLUG"]
|
38
69
|
self.pull_request_id = env["GITHUB_PULL_REQUEST_ID"].to_i
|
39
70
|
self.repo_url = env["GITHUB_REPO_URL"]
|
40
71
|
end
|
72
|
+
|
73
|
+
def extract_gitlab_variables!(env)
|
74
|
+
self.repo_slug = env["GITLAB_REPO_SLUG"]
|
75
|
+
self.pull_request_id = env["GITLAB_PULL_REQUEST_ID"].to_i
|
76
|
+
self.repo_url = env["GITLAB_REPO_URL"]
|
77
|
+
end
|
41
78
|
end
|
42
79
|
end
|
@@ -36,7 +36,6 @@ module Danger
|
|
36
36
|
parser = PluginParser.new(paths)
|
37
37
|
parser.parse
|
38
38
|
|
39
|
-
self.markdown = Kramdown::Document.new(text, input: "GFM").to_html
|
40
39
|
self.json = JSON.parse(parser.to_json_string)
|
41
40
|
|
42
41
|
template = File.join(Danger.gem_path, "lib/danger/plugin_support/templates/readme_table.html.erb")
|
@@ -4,7 +4,7 @@
|
|
4
4
|
<thead>
|
5
5
|
<tr>
|
6
6
|
<th width="50"></th>
|
7
|
-
<th width="100%" data-kind="<%= table[:name] %>">
|
7
|
+
<th width="100%" data-danger-table="true" data-kind="<%= table[:name] %>">
|
8
8
|
<%- if table[:count] > 0 -%>
|
9
9
|
<%= table[:count] %> <%= table[:name] %><%= "s" unless table[:count] == 1 %>
|
10
10
|
<%- else -%>
|
@@ -0,0 +1,40 @@
|
|
1
|
+
<%- @tables.each do |table| -%>
|
2
|
+
<%- if table[:content].any? || table[:resolved].any? -%>
|
3
|
+
<table>
|
4
|
+
<thead>
|
5
|
+
<tr>
|
6
|
+
<th width="5%"></th>
|
7
|
+
<th width="95%" data-danger-table="true" data-kind="<%= table[:name] %>">
|
8
|
+
<%- if table[:count] > 0 -%>
|
9
|
+
<%= table[:count] %> <%= table[:name] %><%= "s" unless table[:count] == 1 %>
|
10
|
+
<%- else -%>
|
11
|
+
:white_check_mark: <%= random_compliment %>
|
12
|
+
<%- end -%>
|
13
|
+
</th>
|
14
|
+
</tr>
|
15
|
+
</thead>
|
16
|
+
<tbody>
|
17
|
+
<%- table[:content].each do |violation| -%>
|
18
|
+
<tr>
|
19
|
+
<td>:<%= table[:emoji] %>:</td>
|
20
|
+
<td data-sticky="<%= violation.sticky %>"><%= violation.message %></td>
|
21
|
+
</tr>
|
22
|
+
<%- end -%>
|
23
|
+
<%- table[:resolved].each do |message| -%>
|
24
|
+
<tr>
|
25
|
+
<td>:white_check_mark:</td>
|
26
|
+
<td data-sticky="true"><del><%= message %></del></td>
|
27
|
+
</tr>
|
28
|
+
<%- end -%>
|
29
|
+
</tbody>
|
30
|
+
</table>
|
31
|
+
<%- end -%>
|
32
|
+
<%- end -%>
|
33
|
+
|
34
|
+
<%- @markdowns.each do |current| -%>
|
35
|
+
<%= current %>
|
36
|
+
<%# the previous line has to be aligned far to the left, otherwise markdown can break easily %>
|
37
|
+
<%- end -%>
|
38
|
+
<p align="right" data-meta="generated_by_<%= @danger_id %>">
|
39
|
+
Generated by :no_entry_sign: <a href="https://github.com/danger/danger/">danger</a>
|
40
|
+
</p>
|
@@ -4,9 +4,10 @@ require "danger/danger_core/dangerfile_dsl"
|
|
4
4
|
require "danger/danger_core/standard_error"
|
5
5
|
|
6
6
|
require "danger/danger_core/plugins/dangerfile_messaging_plugin"
|
7
|
-
require "danger/danger_core/plugins/
|
7
|
+
require "danger/danger_core/plugins/dangerfile_danger_plugin"
|
8
8
|
require "danger/danger_core/plugins/dangerfile_git_plugin"
|
9
9
|
require "danger/danger_core/plugins/dangerfile_github_plugin"
|
10
|
+
require "danger/danger_core/plugins/dangerfile_gitlab_plugin"
|
10
11
|
|
11
12
|
module Danger
|
12
13
|
class Dangerfile
|
@@ -34,7 +35,7 @@ module Danger
|
|
34
35
|
|
35
36
|
# The ones that everything would break without
|
36
37
|
def self.essential_plugin_classes
|
37
|
-
[DangerfileMessagingPlugin, DangerfileGitPlugin,
|
38
|
+
[DangerfileMessagingPlugin, DangerfileGitPlugin, DangerfileDangerPlugin, DangerfileGitHubPlugin, DangerfileGitLabPlugin]
|
38
39
|
end
|
39
40
|
|
40
41
|
# Both of these methods exist on all objects
|
@@ -22,8 +22,9 @@ module Danger
|
|
22
22
|
RequestSources::RequestSource.available_request_sources.each do |klass|
|
23
23
|
next unless self.ci_source.supports?(klass)
|
24
24
|
|
25
|
-
request_source = klass.new(self.ci_source,
|
25
|
+
request_source = klass.new(self.ci_source, env)
|
26
26
|
next unless request_source.validates_as_ci?
|
27
|
+
next unless request_source.validates_as_api_source?
|
27
28
|
self.request_source = request_source
|
28
29
|
end
|
29
30
|
|
@@ -38,14 +38,9 @@ module Danger
|
|
38
38
|
ci_head = head || EnvironmentManager.danger_head_branch
|
39
39
|
dm.env.scm.diff_for_folder(".", from: ci_base, to: ci_head)
|
40
40
|
|
41
|
+
# Parse the local Dangerfile
|
41
42
|
dm.parse(Pathname.new(dangerfile_path))
|
42
43
|
|
43
|
-
if dm.env.request_source.organisation && !dm.env.request_source.danger_repo? && (danger_repo = dm.env.request_source.fetch_danger_repo)
|
44
|
-
url = dm.env.request_source.file_url(repository: danger_repo.name, path: "Dangerfile")
|
45
|
-
path = dm.plugin.download(url)
|
46
|
-
dm.parse(Pathname.new(path))
|
47
|
-
end
|
48
|
-
|
49
44
|
post_results(dm, danger_id)
|
50
45
|
dm.print_results
|
51
46
|
ensure
|
data/lib/danger/danger_core/plugins/{dangerfile_import_plugin.rb → dangerfile_danger_plugin.rb}
RENAMED
@@ -10,36 +10,36 @@ module Danger
|
|
10
10
|
# @example Import a plugin available over HTTP
|
11
11
|
#
|
12
12
|
# device_grid = "https://raw.githubusercontent.com/fastlane/fastlane/master/danger-device_grid/lib/device_grid/plugin.rb"
|
13
|
-
#
|
13
|
+
# danger.import_plugin(device_grid)
|
14
14
|
#
|
15
15
|
# @example Import from a local file reference
|
16
16
|
#
|
17
|
-
#
|
17
|
+
# danger.import_plugin("danger/plugins/watch_plugin.rb")
|
18
18
|
#
|
19
19
|
# @example Import all files inside a folder
|
20
20
|
#
|
21
|
-
#
|
21
|
+
# danger.import_plugin("danger/plugins/*.rb")
|
22
22
|
#
|
23
23
|
# @see danger/danger
|
24
24
|
# @tags core, plugins
|
25
25
|
|
26
|
-
class
|
26
|
+
class DangerfileDangerPlugin < Plugin
|
27
27
|
# The instance name used in the Dangerfile
|
28
28
|
# @return [String]
|
29
29
|
#
|
30
30
|
def self.instance_name
|
31
|
-
"
|
31
|
+
"danger"
|
32
32
|
end
|
33
33
|
|
34
|
-
# @!group
|
35
|
-
# Download a local or remote plugin and
|
34
|
+
# @!group Danger
|
35
|
+
# Download a local or remote plugin and make it usable inside the Dangerfile.
|
36
36
|
#
|
37
37
|
# @param [String] path_or_url
|
38
38
|
# a local path or a https URL to the Ruby file to import
|
39
39
|
# a danger plugin from.
|
40
40
|
# @return [void]
|
41
41
|
#
|
42
|
-
def
|
42
|
+
def import_plugin(path_or_url)
|
43
43
|
raise "`import` requires a string" unless path_or_url.kind_of?(String)
|
44
44
|
|
45
45
|
if path_or_url.start_with?("http")
|
@@ -49,8 +49,25 @@ module Danger
|
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
52
|
+
# @!group Danger
|
53
|
+
# Download and execute a remote Dangerfile.
|
54
|
+
#
|
55
|
+
# @param [String] repo slug
|
56
|
+
# A slug that represents the repo where the Dangerfile is.
|
57
|
+
# @return [void]
|
58
|
+
#
|
59
|
+
def import_dangerfile(slug)
|
60
|
+
raise "`import` requires a string" unless slug.kind_of?(String)
|
61
|
+
org, repo = slug.split("/")
|
62
|
+
download_url = env.request_source.file_url(organisation: org, repository: repo, branch: "master", path: "Dangerfile")
|
63
|
+
local_path = import_url(download_url)
|
64
|
+
dangerfile.parse(Pathname.new(local_path))
|
65
|
+
end
|
66
|
+
|
67
|
+
private
|
68
|
+
|
52
69
|
# @!group Plugins
|
53
|
-
# Download a local or remote plugin or Dangerfile
|
70
|
+
# Download a local or remote plugin or Dangerfile.
|
54
71
|
# This method will not import the file for you, use plugin.import instead
|
55
72
|
#
|
56
73
|
# @param [String] path_or_url
|
@@ -75,8 +92,6 @@ module Danger
|
|
75
92
|
return path
|
76
93
|
end
|
77
94
|
|
78
|
-
private
|
79
|
-
|
80
95
|
# @!group Plugins
|
81
96
|
# Download a remote plugin and use it locally.
|
82
97
|
#
|
@@ -14,7 +14,7 @@ module Danger
|
|
14
14
|
#
|
15
15
|
# @example Ensure that labels have been used on the PR
|
16
16
|
#
|
17
|
-
# fail "Please add labels to this PR" if github.
|
17
|
+
# fail "Please add labels to this PR" if github.pr_labels.empty?
|
18
18
|
#
|
19
19
|
# @example Check if a user is in a specific GitHub org, and message them if so
|
20
20
|
#
|
@@ -205,6 +205,10 @@ module Danger
|
|
205
205
|
paths.first(paths.count - 1).join(", ") + " & " + paths.last
|
206
206
|
end
|
207
207
|
|
208
|
+
[:title, :body, :author, :labels, :json].each do |suffix|
|
209
|
+
alias_method "mr_#{suffix}".to_sym, "pr_#{suffix}".to_sym
|
210
|
+
end
|
211
|
+
|
208
212
|
private
|
209
213
|
|
210
214
|
def create_link(href, text)
|
@@ -0,0 +1,190 @@
|
|
1
|
+
require "danger/plugin_support/plugin"
|
2
|
+
|
3
|
+
module Danger
|
4
|
+
# Handles interacting with GitLab inside a Dangerfile. Provides a few functions which wrap `mr_json` and also
|
5
|
+
# through a few standard functions to simplify your code.
|
6
|
+
#
|
7
|
+
# @example Warn when an MR is classed as work in progress
|
8
|
+
#
|
9
|
+
# warn "MR is classed as Work in Progress" if gitlab.mr_title.include? "[WIP]"
|
10
|
+
#
|
11
|
+
# @example Declare a MR to be simple to avoid specific Danger rules
|
12
|
+
#
|
13
|
+
# declared_trivial = (gitlab.mr_title + gitlab.mr_body).include?("#trivial")
|
14
|
+
#
|
15
|
+
# @example Ensure that labels have been applied to the MR
|
16
|
+
#
|
17
|
+
# fail "Please add labels to this MR" if gitlab.mr_labels.empty?
|
18
|
+
#
|
19
|
+
# @example Ensure that all MRs have an assignee
|
20
|
+
#
|
21
|
+
# warn "This MR does not have any assignees yet." unless gitlab.mr_json["assignee"]
|
22
|
+
#
|
23
|
+
# @example Ensure there is a summary for a MR
|
24
|
+
#
|
25
|
+
# fail "Please provide a summary in the Pull Request description" if gitlab.mr_body.length < 5
|
26
|
+
#
|
27
|
+
# @example Only accept MRs to the develop branch
|
28
|
+
#
|
29
|
+
# fail "Please re-submit this MR to develop, we may have already fixed your issue." if gitlab.branch_for_base != "develop"
|
30
|
+
#
|
31
|
+
# @example Note when MRs don't reference a milestone, which goes away when it does
|
32
|
+
#
|
33
|
+
# has_milestone = gitlab.mr_json["milestone"] != nil
|
34
|
+
# warn("This MR does not refer to an existing milestone", sticky: false) unless has_milestone
|
35
|
+
#
|
36
|
+
# @example Note when a MR cannot be manually merged, which goes away when you can
|
37
|
+
#
|
38
|
+
# can_merge = gitlab.mr_json["mergeable"]
|
39
|
+
# warn("This MR cannot be merged yet.", sticky: false) unless can_merge
|
40
|
+
#
|
41
|
+
# @example Highlight when a celebrity makes a pull request
|
42
|
+
#
|
43
|
+
# message "Welcome, Danger." if gitlab.mr_author == "dangermcshane"
|
44
|
+
#
|
45
|
+
# @example Send a message with links to a collection of specific files
|
46
|
+
#
|
47
|
+
# if git.modified_files.include? "config/*.js"
|
48
|
+
# config_files = git.modified_files.select { |path| path.include? "config/" }
|
49
|
+
# message "This MR changes #{ gitlab.html_link(config_files) }"
|
50
|
+
# end
|
51
|
+
#
|
52
|
+
# @example Highlight with a clickable link if a Package.json is changed
|
53
|
+
#
|
54
|
+
# warn "#{gitlab.html_link("Package.json")} was edited." if git.modified_files.include? "Package.json"
|
55
|
+
#
|
56
|
+
#
|
57
|
+
# @see danger/danger
|
58
|
+
# @tags core, gitlab
|
59
|
+
#
|
60
|
+
class DangerfileGitLabPlugin < Plugin
|
61
|
+
# So that this init can fail.
|
62
|
+
def self.new(dangerfile)
|
63
|
+
return nil if dangerfile.env.request_source.class != Danger::RequestSources::GitLab
|
64
|
+
super
|
65
|
+
end
|
66
|
+
|
67
|
+
# The instance name used in the Dangerfile
|
68
|
+
# @return [String]
|
69
|
+
#
|
70
|
+
def self.instance_name
|
71
|
+
"gitlab"
|
72
|
+
end
|
73
|
+
|
74
|
+
def initialize(dangerfile)
|
75
|
+
super(dangerfile)
|
76
|
+
|
77
|
+
@gitlab = dangerfile.env.request_source
|
78
|
+
end
|
79
|
+
|
80
|
+
# @!group MR Metadata
|
81
|
+
# The title of the Merge Request
|
82
|
+
# @return [String]
|
83
|
+
#
|
84
|
+
def mr_title
|
85
|
+
@gitlab.mr_json.title.to_s
|
86
|
+
end
|
87
|
+
|
88
|
+
# @!group MR Metadata
|
89
|
+
# The body text of the Merge Request
|
90
|
+
# @return [String]
|
91
|
+
#
|
92
|
+
def mr_body
|
93
|
+
@gitlab.mr_json.description.to_s
|
94
|
+
end
|
95
|
+
|
96
|
+
# @!group MR Metadata
|
97
|
+
# The username of the author of the Merge Request
|
98
|
+
# @return [String]
|
99
|
+
#
|
100
|
+
def mr_author
|
101
|
+
@gitlab.mr_json.author.username.to_s
|
102
|
+
end
|
103
|
+
|
104
|
+
# @!group MR Metadata
|
105
|
+
# The labels assigned to the Merge Request
|
106
|
+
# @return [String]
|
107
|
+
#
|
108
|
+
def mr_labels
|
109
|
+
@gitlab.mr_json.labels
|
110
|
+
end
|
111
|
+
|
112
|
+
# @!group MR Commit Metadata
|
113
|
+
# The branch to which the MR is going to be merged into
|
114
|
+
# @return [String]
|
115
|
+
#
|
116
|
+
def branch_for_merge
|
117
|
+
@gitlab.mr_json.target_branch
|
118
|
+
end
|
119
|
+
|
120
|
+
# @!group MR Commit Metadata
|
121
|
+
# The base commit to which the MR is going to be merged as a parent
|
122
|
+
# @return [String]
|
123
|
+
#
|
124
|
+
def base_commit
|
125
|
+
@gitlab.base_commit
|
126
|
+
end
|
127
|
+
|
128
|
+
# @!group MR Commit Metadata
|
129
|
+
# The head commit to which the MR is requesting to be merged from
|
130
|
+
# @return [String]
|
131
|
+
#
|
132
|
+
def head_commit
|
133
|
+
@gitlab.commits_json.first.id
|
134
|
+
end
|
135
|
+
|
136
|
+
# @!group GitLab Misc
|
137
|
+
# The hash that represents the MR's JSON. See documentation for the
|
138
|
+
# structure [here](http://docs.gitlab.com/ce/api/merge_requests.html#get-single-mr)
|
139
|
+
# @return [Hash]
|
140
|
+
#
|
141
|
+
def mr_json
|
142
|
+
@gitlab.mr_json.to_hash
|
143
|
+
end
|
144
|
+
|
145
|
+
# @!group GitLab Misc
|
146
|
+
# Provides access to the GitLab API client used inside Danger. Making
|
147
|
+
# it easy to use the GitLab API inside a Dangerfile.
|
148
|
+
# @return [GitLab::Client]
|
149
|
+
def api
|
150
|
+
@gitlab.client
|
151
|
+
end
|
152
|
+
|
153
|
+
# @!group GitLab Misc
|
154
|
+
# Returns a list of HTML anchors for a file, or files in the head repository. An example would be:
|
155
|
+
# `<a href='https://gitlab.com/artsy/eigen/blob/561827e46167077b5e53515b4b7349b8ae04610b/file.txt'>file.txt</a>`. It returns a string of multiple anchors if passed an array.
|
156
|
+
# @param [String or Array<String>] paths
|
157
|
+
# A list of strings to convert to gitlab anchors
|
158
|
+
# @param [Bool] full_path
|
159
|
+
# Shows the full path as the link's text, defaults to `true`.
|
160
|
+
#
|
161
|
+
# @return [String]
|
162
|
+
def html_link(paths, full_path: true)
|
163
|
+
paths = [paths] unless paths.kind_of?(Array)
|
164
|
+
commit = head_commit
|
165
|
+
same_repo = mr_json[:project_id] == mr_json[:source_project_id]
|
166
|
+
sender_repo = ci_source.repo_slug.split("/").first + "/" + mr_json[:author][:username]
|
167
|
+
repo = same_repo ? ci_source.repo_slug : sender_repo
|
168
|
+
host = @gitlab.host
|
169
|
+
|
170
|
+
paths = paths.map do |path|
|
171
|
+
url_path = path.start_with?("/") ? path : "/#{path}"
|
172
|
+
text = full_path ? path : File.basename(path)
|
173
|
+
create_link("https://#{host}/#{repo}/blob/#{commit}#{url_path}", text)
|
174
|
+
end
|
175
|
+
|
176
|
+
return paths.first if paths.count < 2
|
177
|
+
paths.first(paths.count - 1).join(", ") + " & " + paths.last
|
178
|
+
end
|
179
|
+
|
180
|
+
[:title, :body, :author, :labels, :json].each do |suffix|
|
181
|
+
alias_method "pr_#{suffix}".to_sym, "mr_#{suffix}".to_sym
|
182
|
+
end
|
183
|
+
|
184
|
+
private
|
185
|
+
|
186
|
+
def create_link(href, text)
|
187
|
+
"<a href='#{href}'>#{text}</a>"
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
@@ -28,8 +28,9 @@ module Danger
|
|
28
28
|
tables = parse_tables_from_comment(comment)
|
29
29
|
violations = {}
|
30
30
|
tables.each do |table|
|
31
|
-
|
32
|
-
|
31
|
+
match = danger_table?(table)
|
32
|
+
next unless match
|
33
|
+
title = match[1]
|
33
34
|
kind = table_kind_from_title(title)
|
34
35
|
next unless kind
|
35
36
|
|
@@ -101,6 +102,44 @@ module Danger
|
|
101
102
|
"Yay.", "Jolly good show.", "Good on 'ya.", "Nice work."]
|
102
103
|
compliment.sample
|
103
104
|
end
|
105
|
+
|
106
|
+
private
|
107
|
+
|
108
|
+
GITHUB_OLD_REGEX = %r{<th width="100%"(.*?)</th>}im
|
109
|
+
NEW_REGEX = %r{<th.*data-danger-table="true"(.*?)</th>}im
|
110
|
+
|
111
|
+
def danger_table?(table)
|
112
|
+
# The old GitHub specific method relied on
|
113
|
+
# the width of a `th` element to find the table
|
114
|
+
# title and determine if it was a danger table.
|
115
|
+
# The new method uses a more robust data-danger-table
|
116
|
+
# tag instead.
|
117
|
+
match = GITHUB_OLD_REGEX.match(table)
|
118
|
+
return match if match
|
119
|
+
|
120
|
+
return NEW_REGEX.match(table)
|
121
|
+
end
|
122
|
+
|
123
|
+
class Comment
|
124
|
+
attr_reader :id, :body
|
125
|
+
|
126
|
+
def initialize(id, body)
|
127
|
+
@id = id
|
128
|
+
@body = body
|
129
|
+
end
|
130
|
+
|
131
|
+
def self.from_github(comment)
|
132
|
+
self.new(comment[:id], comment[:body])
|
133
|
+
end
|
134
|
+
|
135
|
+
def self.from_gitlab(comment)
|
136
|
+
self.new(comment.id, comment.body)
|
137
|
+
end
|
138
|
+
|
139
|
+
def generated_by_danger?(danger_id)
|
140
|
+
body.include?("generated_by_#{danger_id}")
|
141
|
+
end
|
142
|
+
end
|
104
143
|
end
|
105
144
|
end
|
106
145
|
end
|
@@ -16,11 +16,15 @@ module Danger
|
|
16
16
|
|
17
17
|
Octokit.auto_paginate = true
|
18
18
|
@token = @environment["DANGER_GITHUB_API_TOKEN"]
|
19
|
-
if
|
20
|
-
Octokit.api_endpoint =
|
19
|
+
if api_url
|
20
|
+
Octokit.api_endpoint = api_url
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
+
def validates_as_api_source?
|
25
|
+
@token && !@token.empty?
|
26
|
+
end
|
27
|
+
|
24
28
|
def scm
|
25
29
|
@scm ||= GitRepo.new
|
26
30
|
end
|
@@ -29,6 +33,13 @@ module Danger
|
|
29
33
|
@host = @environment["DANGER_GITHUB_HOST"] || "github.com"
|
30
34
|
end
|
31
35
|
|
36
|
+
def api_url
|
37
|
+
# `DANGER_GITHUB_API_HOST` is the old name kept for legacy reasons and
|
38
|
+
# backwards compatibility. `DANGER_GITHUB_API_BASE_URL` is the new
|
39
|
+
# correctly named variable.
|
40
|
+
@environment["DANGER_GITHUB_API_HOST"] || @environment["DANGER_GITHUB_API_BASE_URL"]
|
41
|
+
end
|
42
|
+
|
32
43
|
def client
|
33
44
|
raise "No API token given, please provide one using `DANGER_GITHUB_API_TOKEN`" if !@token && !support_tokenless_auth
|
34
45
|
@client ||= Octokit::Client.new(access_token: @token)
|
@@ -68,17 +79,20 @@ module Danger
|
|
68
79
|
self.issue_json = client.get(href)
|
69
80
|
end
|
70
81
|
|
82
|
+
def issue_comments
|
83
|
+
@comments ||= client.issue_comments(ci_source.repo_slug, ci_source.pull_request_id)
|
84
|
+
.map { |comment| Comment.from_github(comment) }
|
85
|
+
end
|
86
|
+
|
71
87
|
# Sending data to GitHub
|
72
88
|
def update_pull_request!(warnings: [], errors: [], messages: [], markdowns: [], danger_id: "danger")
|
73
89
|
comment_result = {}
|
74
|
-
|
75
|
-
comments = client.issue_comments(ci_source.repo_slug, ci_source.pull_request_id)
|
76
|
-
editable_comments = comments.select { |comment| danger_comment?(comment, danger_id) }
|
90
|
+
editable_comments = issue_comments.select { |comment| comment.generated_by_danger?(danger_id) }
|
77
91
|
|
78
92
|
if editable_comments.empty?
|
79
93
|
previous_violations = {}
|
80
94
|
else
|
81
|
-
comment = editable_comments.first
|
95
|
+
comment = editable_comments.first.body
|
82
96
|
previous_violations = parse_comment(comment)
|
83
97
|
end
|
84
98
|
|
@@ -97,7 +111,7 @@ module Danger
|
|
97
111
|
if editable_comments.empty?
|
98
112
|
comment_result = client.add_comment(ci_source.repo_slug, ci_source.pull_request_id, body)
|
99
113
|
else
|
100
|
-
original_id = editable_comments.first
|
114
|
+
original_id = editable_comments.first.id
|
101
115
|
comment_result = client.update_comment(ci_source.repo_slug, original_id, body)
|
102
116
|
end
|
103
117
|
end
|
@@ -145,11 +159,10 @@ module Danger
|
|
145
159
|
|
146
160
|
# Get rid of the previously posted comment, to only have the latest one
|
147
161
|
def delete_old_comments!(except: nil, danger_id: "danger")
|
148
|
-
|
149
|
-
|
150
|
-
next
|
151
|
-
|
152
|
-
client.delete_comment(ci_source.repo_slug, comment[:id])
|
162
|
+
issue_comments.each do |comment|
|
163
|
+
next unless comment.generated_by_danger?(danger_id)
|
164
|
+
next if comment.id == except
|
165
|
+
client.delete_comment(ci_source.repo_slug, comment.id)
|
153
166
|
end
|
154
167
|
end
|
155
168
|
|
@@ -161,45 +174,11 @@ module Danger
|
|
161
174
|
nil
|
162
175
|
end
|
163
176
|
|
164
|
-
# @return [Hash] with the information about the repo
|
165
|
-
# returns nil if the repo is not available
|
166
|
-
def fetch_repository(organisation: nil, repository: nil)
|
167
|
-
organisation ||= self.organisation
|
168
|
-
repository ||= self.ci_source.repo_slug.split("/").last
|
169
|
-
self.client.repo("#{organisation}/#{repository}")
|
170
|
-
rescue Octokit::NotFound
|
171
|
-
nil # repo doesn't exist
|
172
|
-
end
|
173
|
-
|
174
|
-
# @return [Hash] with the information about the repo.
|
175
|
-
# This will automatically detect if the repo is capitalised
|
176
|
-
# returns nil if there is no danger repo
|
177
|
-
def fetch_danger_repo(organisation: nil)
|
178
|
-
data = nil
|
179
|
-
data ||= fetch_repository(organisation: organisation, repository: DANGER_REPO_NAME.downcase)
|
180
|
-
data ||= fetch_repository(organisation: organisation, repository: DANGER_REPO_NAME.capitalize)
|
181
|
-
data
|
182
|
-
end
|
183
|
-
|
184
|
-
# @return [Bool] is this repo the danger repo of the org?
|
185
|
-
def danger_repo?(organisation: nil, repository: nil)
|
186
|
-
repo = fetch_repository(organisation: organisation, repository: repository)
|
187
|
-
repo[:name].casecmp(DANGER_REPO_NAME).zero? || repo[:parent] && repo[:parent][:full_name] == "danger/danger"
|
188
|
-
rescue
|
189
|
-
false
|
190
|
-
end
|
191
|
-
|
192
177
|
# @return [String] A URL to the specific file, ready to be downloaded
|
193
178
|
def file_url(organisation: nil, repository: nil, branch: "master", path: nil)
|
194
179
|
organisation ||= self.organisation
|
195
180
|
"https://raw.githubusercontent.com/#{organisation}/#{repository}/#{branch}/#{path}"
|
196
181
|
end
|
197
|
-
|
198
|
-
private
|
199
|
-
|
200
|
-
def danger_comment?(comment, danger_id)
|
201
|
-
comment[:body].include?("generated_by_#{danger_id}")
|
202
|
-
end
|
203
182
|
end
|
204
183
|
end
|
205
184
|
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
require "gitlab"
|
3
|
+
require "danger/helpers/comments_helper"
|
4
|
+
|
5
|
+
module Danger
|
6
|
+
module RequestSources
|
7
|
+
class GitLab < RequestSource
|
8
|
+
include Danger::Helpers::CommentsHelper
|
9
|
+
attr_accessor :mr_json, :commits_json
|
10
|
+
|
11
|
+
def initialize(ci_source, environment)
|
12
|
+
self.ci_source = ci_source
|
13
|
+
self.environment = environment
|
14
|
+
|
15
|
+
@token = @environment["DANGER_GITLAB_API_TOKEN"]
|
16
|
+
end
|
17
|
+
|
18
|
+
def client
|
19
|
+
token = @environment["DANGER_GITLAB_API_TOKEN"]
|
20
|
+
raise "No API token given, please provide one using `DANGER_GITLAB_API_TOKEN`" unless token
|
21
|
+
params = { private_token: token }
|
22
|
+
params[:endpoint] = endpoint
|
23
|
+
|
24
|
+
@client ||= Gitlab.client(params)
|
25
|
+
end
|
26
|
+
|
27
|
+
def validates_as_api_source?
|
28
|
+
@token && !@token.empty?
|
29
|
+
end
|
30
|
+
|
31
|
+
def scm
|
32
|
+
@scm ||= GitRepo.new
|
33
|
+
end
|
34
|
+
|
35
|
+
def endpoint
|
36
|
+
@endpoint ||= @environment["DANGER_GITLAB_API_BASE_URL"] || "https://gitlab.com/api/v3"
|
37
|
+
end
|
38
|
+
|
39
|
+
def host
|
40
|
+
@host ||= @environment["DANGER_GITLAB_HOST"] || "gitlab.com"
|
41
|
+
end
|
42
|
+
|
43
|
+
def base_commit
|
44
|
+
first_commit_in_branch = self.commits_json.last.id
|
45
|
+
@base_comit ||= self.scm.exec "rev-parse #{first_commit_in_branch}^1"
|
46
|
+
end
|
47
|
+
|
48
|
+
def mr_comments
|
49
|
+
@comments ||= client.merge_request_comments(escaped_ci_slug, ci_source.pull_request_id)
|
50
|
+
.map { |comment| Comment.from_gitlab(comment) }
|
51
|
+
end
|
52
|
+
|
53
|
+
def escaped_ci_slug
|
54
|
+
@escaped_ci_slug ||= CGI.escape(ci_source.repo_slug)
|
55
|
+
end
|
56
|
+
|
57
|
+
def setup_danger_branches
|
58
|
+
head_commit = self.scm.head_commit
|
59
|
+
|
60
|
+
# Next, we want to ensure that we have a version of the current branch at a known location
|
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
|
+
self.scm.exec "branch #{EnvironmentManager.danger_head_branch} #{head_commit}"
|
66
|
+
end
|
67
|
+
|
68
|
+
def fetch_details
|
69
|
+
self.mr_json = client.merge_request(escaped_ci_slug, self.ci_source.pull_request_id)
|
70
|
+
self.commits_json = client.merge_request_commits(escaped_ci_slug, self.ci_source.pull_request_id)
|
71
|
+
self.ignored_violations = ignored_violations_from_pr(self.mr_json)
|
72
|
+
end
|
73
|
+
|
74
|
+
def ignored_violations_from_pr(mr_json)
|
75
|
+
pr_body = mr_json.description
|
76
|
+
return [] if pr_body.nil?
|
77
|
+
pr_body.chomp.scan(/>\s*danger\s*:\s*ignore\s*"(.*)"/i).flatten
|
78
|
+
end
|
79
|
+
|
80
|
+
def update_pull_request!(warnings: [], errors: [], messages: [], markdowns: [], danger_id: "danger")
|
81
|
+
editable_comments = mr_comments.select { |comment| comment.generated_by_danger?(danger_id) }
|
82
|
+
|
83
|
+
if editable_comments.empty?
|
84
|
+
previous_violations = {}
|
85
|
+
else
|
86
|
+
comment = editable_comments.first.body
|
87
|
+
previous_violations = parse_comment(comment)
|
88
|
+
end
|
89
|
+
|
90
|
+
if previous_violations.empty? && (warnings + errors + messages + markdowns).empty?
|
91
|
+
# Just remove the comment, if there"s nothing to say.
|
92
|
+
delete_old_comments!(danger_id: danger_id)
|
93
|
+
else
|
94
|
+
body = generate_comment(warnings: warnings,
|
95
|
+
errors: errors,
|
96
|
+
messages: messages,
|
97
|
+
markdowns: markdowns,
|
98
|
+
previous_violations: previous_violations,
|
99
|
+
danger_id: danger_id,
|
100
|
+
template: "gitlab")
|
101
|
+
|
102
|
+
if editable_comments.empty?
|
103
|
+
client.create_merge_request_comment(
|
104
|
+
escaped_ci_slug, ci_source.pull_request_id, body
|
105
|
+
)
|
106
|
+
else
|
107
|
+
original_id = editable_comments.first.id
|
108
|
+
client.edit_merge_request_comment(
|
109
|
+
escaped_ci_slug, ci_source.pull_request_id, original_id, body
|
110
|
+
)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def delete_old_comments!(except: nil, danger_id: "danger")
|
116
|
+
mr_comments.each do |comment|
|
117
|
+
next unless comment.generated_by_danger?(danger_id)
|
118
|
+
next if comment.id == except
|
119
|
+
client.delete_merge_request_comment(
|
120
|
+
escaped_ci_slug,
|
121
|
+
ci_source.pull_request_id,
|
122
|
+
comment.id
|
123
|
+
)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
# @return [String] The organisation name, is nil if it can't be detected
|
128
|
+
def organisation
|
129
|
+
nil # TODO: Implement this
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
@@ -23,6 +23,10 @@ module Danger
|
|
23
23
|
!!self.scm.origins.match(%r{#{Regexp.escape self.host}(:|/)(?<repo_slug>.+/.+?)(?:\.git)?$})
|
24
24
|
end
|
25
25
|
|
26
|
+
def validates_as_api_source?
|
27
|
+
raise "Subclass and overwrite validates_as_api_source?"
|
28
|
+
end
|
29
|
+
|
26
30
|
def scm
|
27
31
|
@scm ||= nil
|
28
32
|
end
|
@@ -51,18 +55,6 @@ module Danger
|
|
51
55
|
raise "Subclass and overwrite organisation"
|
52
56
|
end
|
53
57
|
|
54
|
-
def fetch_repository(_organisation: nil, _repository: nil)
|
55
|
-
raise "Subclass and overwrite fetch_repository"
|
56
|
-
end
|
57
|
-
|
58
|
-
def fetch_danger_repo(_organisation: nil)
|
59
|
-
raise "Subclass and overwrite fetch_danger_repo"
|
60
|
-
end
|
61
|
-
|
62
|
-
def danger_repo?(_organisation: nil, _repository: nil)
|
63
|
-
raise "Subclass and overwrite danger_repo?"
|
64
|
-
end
|
65
|
-
|
66
58
|
def file_url(_organisation: nil, _repository: nil, _branch: "master", _path: nil)
|
67
59
|
raise "Subclass and overwrite file_url"
|
68
60
|
end
|
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:
|
4
|
+
version: 3.0.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-08-
|
12
|
+
date: 2016-08-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: claide
|
@@ -73,14 +73,14 @@ dependencies:
|
|
73
73
|
requirements:
|
74
74
|
- - "~>"
|
75
75
|
- !ruby/object:Gem::Version
|
76
|
-
version: '0'
|
76
|
+
version: '0.9'
|
77
77
|
type: :runtime
|
78
78
|
prerelease: false
|
79
79
|
version_requirements: !ruby/object:Gem::Requirement
|
80
80
|
requirements:
|
81
81
|
- - "~>"
|
82
82
|
- !ruby/object:Gem::Version
|
83
|
-
version: '0'
|
83
|
+
version: '0.9'
|
84
84
|
- !ruby/object:Gem::Dependency
|
85
85
|
name: faraday-http-cache
|
86
86
|
requirement: !ruby/object:Gem::Requirement
|
@@ -151,6 +151,20 @@ dependencies:
|
|
151
151
|
- - "~>"
|
152
152
|
- !ruby/object:Gem::Version
|
153
153
|
version: '0.1'
|
154
|
+
- !ruby/object:Gem::Dependency
|
155
|
+
name: gitlab
|
156
|
+
requirement: !ruby/object:Gem::Requirement
|
157
|
+
requirements:
|
158
|
+
- - "~>"
|
159
|
+
- !ruby/object:Gem::Version
|
160
|
+
version: 3.7.0
|
161
|
+
type: :runtime
|
162
|
+
prerelease: false
|
163
|
+
version_requirements: !ruby/object:Gem::Requirement
|
164
|
+
requirements:
|
165
|
+
- - "~>"
|
166
|
+
- !ruby/object:Gem::Version
|
167
|
+
version: 3.7.0
|
154
168
|
- !ruby/object:Gem::Dependency
|
155
169
|
name: bundler
|
156
170
|
requirement: !ruby/object:Gem::Requirement
|
@@ -319,6 +333,20 @@ dependencies:
|
|
319
333
|
- - "~>"
|
320
334
|
- !ruby/object:Gem::Version
|
321
335
|
version: '1.2'
|
336
|
+
- !ruby/object:Gem::Dependency
|
337
|
+
name: simplecov
|
338
|
+
requirement: !ruby/object:Gem::Requirement
|
339
|
+
requirements:
|
340
|
+
- - "~>"
|
341
|
+
- !ruby/object:Gem::Version
|
342
|
+
version: 0.12.0
|
343
|
+
type: :development
|
344
|
+
prerelease: false
|
345
|
+
version_requirements: !ruby/object:Gem::Requirement
|
346
|
+
requirements:
|
347
|
+
- - "~>"
|
348
|
+
- !ruby/object:Gem::Version
|
349
|
+
version: 0.12.0
|
322
350
|
description: Stop Saying 'You Forgot To…' in Code Review
|
323
351
|
email:
|
324
352
|
- orta.therox@gmail.com
|
@@ -339,6 +367,7 @@ files:
|
|
339
367
|
- lib/danger/ci_source/circle.rb
|
340
368
|
- lib/danger/ci_source/circle_api.rb
|
341
369
|
- lib/danger/ci_source/drone.rb
|
370
|
+
- lib/danger/ci_source/gitlab_ci.rb
|
342
371
|
- lib/danger/ci_source/jenkins.rb
|
343
372
|
- lib/danger/ci_source/local_git_repo.rb
|
344
373
|
- lib/danger/ci_source/semaphore.rb
|
@@ -356,15 +385,17 @@ files:
|
|
356
385
|
- lib/danger/commands/runner.rb
|
357
386
|
- lib/danger/commands/systems.rb
|
358
387
|
- lib/danger/comment_generators/github.md.erb
|
388
|
+
- lib/danger/comment_generators/gitlab.md.erb
|
359
389
|
- lib/danger/core_ext/file_list.rb
|
360
390
|
- lib/danger/core_ext/string.rb
|
361
391
|
- lib/danger/danger_core/dangerfile.rb
|
362
392
|
- lib/danger/danger_core/dangerfile_dsl.rb
|
363
393
|
- lib/danger/danger_core/environment_manager.rb
|
364
394
|
- lib/danger/danger_core/executor.rb
|
395
|
+
- lib/danger/danger_core/plugins/dangerfile_danger_plugin.rb
|
365
396
|
- lib/danger/danger_core/plugins/dangerfile_git_plugin.rb
|
366
397
|
- lib/danger/danger_core/plugins/dangerfile_github_plugin.rb
|
367
|
-
- lib/danger/danger_core/plugins/
|
398
|
+
- lib/danger/danger_core/plugins/dangerfile_gitlab_plugin.rb
|
368
399
|
- lib/danger/danger_core/plugins/dangerfile_messaging_plugin.rb
|
369
400
|
- lib/danger/danger_core/standard_error.rb
|
370
401
|
- lib/danger/danger_core/violation.rb
|
@@ -375,6 +406,7 @@ files:
|
|
375
406
|
- lib/danger/plugin_support/plugin_parser.rb
|
376
407
|
- lib/danger/plugin_support/templates/readme_table.html.erb
|
377
408
|
- lib/danger/request_source/github.rb
|
409
|
+
- lib/danger/request_source/gitlab.rb
|
378
410
|
- lib/danger/request_source/request_source.rb
|
379
411
|
- lib/danger/scm_source/git_repo.rb
|
380
412
|
- lib/danger/version.rb
|