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.
- checksums.yaml +7 -0
- data/LICENSE +22 -0
- data/README.md +94 -0
- data/bin/danger +5 -0
- data/lib/assets/DangerfileTemplate +13 -0
- data/lib/danger.rb +44 -0
- data/lib/danger/ci_source/appcenter.rb +55 -0
- data/lib/danger/ci_source/appveyor.rb +60 -0
- data/lib/danger/ci_source/azure_pipelines.rb +44 -0
- data/lib/danger/ci_source/bamboo.rb +41 -0
- data/lib/danger/ci_source/bitbucket_pipelines.rb +37 -0
- data/lib/danger/ci_source/bitrise.rb +65 -0
- data/lib/danger/ci_source/buddybuild.rb +62 -0
- data/lib/danger/ci_source/buildkite.rb +51 -0
- data/lib/danger/ci_source/ci_source.rb +37 -0
- data/lib/danger/ci_source/circle.rb +94 -0
- data/lib/danger/ci_source/circle_api.rb +51 -0
- data/lib/danger/ci_source/cirrus.rb +31 -0
- data/lib/danger/ci_source/code_build.rb +57 -0
- data/lib/danger/ci_source/codefresh.rb +53 -0
- data/lib/danger/ci_source/codeship.rb +44 -0
- data/lib/danger/ci_source/dotci.rb +52 -0
- data/lib/danger/ci_source/drone.rb +71 -0
- data/lib/danger/ci_source/github_actions.rb +43 -0
- data/lib/danger/ci_source/gitlab_ci.rb +86 -0
- data/lib/danger/ci_source/jenkins.rb +149 -0
- data/lib/danger/ci_source/local_git_repo.rb +119 -0
- data/lib/danger/ci_source/local_only_git_repo.rb +47 -0
- data/lib/danger/ci_source/screwdriver.rb +47 -0
- data/lib/danger/ci_source/semaphore.rb +37 -0
- data/lib/danger/ci_source/support/commits.rb +17 -0
- data/lib/danger/ci_source/support/find_repo_info_from_logs.rb +35 -0
- data/lib/danger/ci_source/support/find_repo_info_from_url.rb +42 -0
- data/lib/danger/ci_source/support/local_pull_request.rb +14 -0
- data/lib/danger/ci_source/support/no_pull_request.rb +7 -0
- data/lib/danger/ci_source/support/no_repo_info.rb +5 -0
- data/lib/danger/ci_source/support/pull_request_finder.rb +179 -0
- data/lib/danger/ci_source/support/remote_pull_request.rb +15 -0
- data/lib/danger/ci_source/support/repo_info.rb +10 -0
- data/lib/danger/ci_source/surf.rb +37 -0
- data/lib/danger/ci_source/teamcity.rb +161 -0
- data/lib/danger/ci_source/travis.rb +51 -0
- data/lib/danger/ci_source/vsts.rb +73 -0
- data/lib/danger/ci_source/xcode_server.rb +48 -0
- data/lib/danger/clients/rubygems_client.rb +14 -0
- data/lib/danger/commands/dangerfile/gem.rb +43 -0
- data/lib/danger/commands/dangerfile/init.rb +30 -0
- data/lib/danger/commands/dry_run.rb +54 -0
- data/lib/danger/commands/init.rb +297 -0
- data/lib/danger/commands/init_helpers/interviewer.rb +92 -0
- data/lib/danger/commands/local.rb +83 -0
- data/lib/danger/commands/local_helpers/http_cache.rb +36 -0
- data/lib/danger/commands/local_helpers/local_setup.rb +46 -0
- data/lib/danger/commands/local_helpers/pry_setup.rb +31 -0
- data/lib/danger/commands/plugins/plugin_json.rb +46 -0
- data/lib/danger/commands/plugins/plugin_lint.rb +54 -0
- data/lib/danger/commands/plugins/plugin_readme.rb +45 -0
- data/lib/danger/commands/pr.rb +92 -0
- data/lib/danger/commands/runner.rb +94 -0
- data/lib/danger/commands/staging.rb +53 -0
- data/lib/danger/commands/systems.rb +43 -0
- data/lib/danger/comment_generators/bitbucket_server.md.erb +20 -0
- data/lib/danger/comment_generators/bitbucket_server_inline.md.erb +15 -0
- data/lib/danger/comment_generators/bitbucket_server_message_group.md.erb +12 -0
- data/lib/danger/comment_generators/github.md.erb +55 -0
- data/lib/danger/comment_generators/github_inline.md.erb +26 -0
- data/lib/danger/comment_generators/gitlab.md.erb +40 -0
- data/lib/danger/comment_generators/gitlab_inline.md.erb +26 -0
- data/lib/danger/comment_generators/vsts.md.erb +20 -0
- data/lib/danger/core_ext/file_list.rb +18 -0
- data/lib/danger/core_ext/string.rb +20 -0
- data/lib/danger/danger_core/dangerfile.rb +341 -0
- data/lib/danger/danger_core/dangerfile_dsl.rb +29 -0
- data/lib/danger/danger_core/dangerfile_generator.rb +11 -0
- data/lib/danger/danger_core/environment_manager.rb +123 -0
- data/lib/danger/danger_core/executor.rb +92 -0
- data/lib/danger/danger_core/message_aggregator.rb +49 -0
- data/lib/danger/danger_core/message_group.rb +68 -0
- data/lib/danger/danger_core/messages/base.rb +56 -0
- data/lib/danger/danger_core/messages/markdown.rb +42 -0
- data/lib/danger/danger_core/messages/violation.rb +54 -0
- data/lib/danger/danger_core/plugins/dangerfile_bitbucket_cloud_plugin.rb +144 -0
- data/lib/danger/danger_core/plugins/dangerfile_bitbucket_server_plugin.rb +211 -0
- data/lib/danger/danger_core/plugins/dangerfile_danger_plugin.rb +248 -0
- data/lib/danger/danger_core/plugins/dangerfile_git_plugin.rb +158 -0
- data/lib/danger/danger_core/plugins/dangerfile_github_plugin.rb +254 -0
- data/lib/danger/danger_core/plugins/dangerfile_gitlab_plugin.rb +240 -0
- data/lib/danger/danger_core/plugins/dangerfile_local_only_plugin.rb +42 -0
- data/lib/danger/danger_core/plugins/dangerfile_messaging_plugin.rb +218 -0
- data/lib/danger/danger_core/plugins/dangerfile_vsts_plugin.rb +191 -0
- data/lib/danger/danger_core/standard_error.rb +143 -0
- data/lib/danger/helpers/array_subclass.rb +61 -0
- data/lib/danger/helpers/comment.rb +32 -0
- data/lib/danger/helpers/comments_helper.rb +178 -0
- data/lib/danger/helpers/comments_parsing_helper.rb +70 -0
- data/lib/danger/helpers/emoji_mapper.rb +41 -0
- data/lib/danger/helpers/find_max_num_violations.rb +31 -0
- data/lib/danger/helpers/message_groups_array_helper.rb +31 -0
- data/lib/danger/plugin_support/gems_resolver.rb +77 -0
- data/lib/danger/plugin_support/plugin.rb +49 -0
- data/lib/danger/plugin_support/plugin_file_resolver.rb +30 -0
- data/lib/danger/plugin_support/plugin_linter.rb +161 -0
- data/lib/danger/plugin_support/plugin_parser.rb +199 -0
- data/lib/danger/plugin_support/templates/readme_table.html.erb +26 -0
- data/lib/danger/request_sources/bitbucket_cloud.rb +171 -0
- data/lib/danger/request_sources/bitbucket_cloud_api.rb +181 -0
- data/lib/danger/request_sources/bitbucket_server.rb +105 -0
- data/lib/danger/request_sources/bitbucket_server_api.rb +117 -0
- data/lib/danger/request_sources/github/github.rb +530 -0
- data/lib/danger/request_sources/github/github_review.rb +126 -0
- data/lib/danger/request_sources/github/github_review_resolver.rb +19 -0
- data/lib/danger/request_sources/github/github_review_unsupported.rb +25 -0
- data/lib/danger/request_sources/gitlab.rb +525 -0
- data/lib/danger/request_sources/local_only.rb +53 -0
- data/lib/danger/request_sources/request_source.rb +85 -0
- data/lib/danger/request_sources/support/get_ignored_violation.rb +17 -0
- data/lib/danger/request_sources/vsts.rb +118 -0
- data/lib/danger/request_sources/vsts_api.rb +138 -0
- data/lib/danger/scm_source/git_repo.rb +181 -0
- data/lib/danger/version.rb +4 -0
- metadata +339 -0
@@ -0,0 +1,52 @@
|
|
1
|
+
require "danger/request_sources/github/github"
|
2
|
+
|
3
|
+
module Danger
|
4
|
+
# https://groupon.github.io/DotCi
|
5
|
+
|
6
|
+
# ### CI Setup
|
7
|
+
# DotCi is a layer on top of jenkins. So, if you're using DotCi, you're hosting your own environment.
|
8
|
+
#
|
9
|
+
# ### Token Setup
|
10
|
+
#
|
11
|
+
# #### GitHub
|
12
|
+
# As you own the machine, it's up to you to add the environment variable for the `DANGER_GITHUB_API_TOKEN`.
|
13
|
+
#
|
14
|
+
class DotCi < CI
|
15
|
+
def self.validates_as_ci?(env)
|
16
|
+
env.key? "DOTCI"
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.validates_as_pr?(env)
|
20
|
+
!env["DOTCI_PULL_REQUEST"].nil? && !env["DOTCI_PULL_REQUEST"].match(/^[0-9]+$/).nil?
|
21
|
+
end
|
22
|
+
|
23
|
+
def supported_request_sources
|
24
|
+
@supported_request_sources ||= begin
|
25
|
+
[
|
26
|
+
Danger::RequestSources::GitHub
|
27
|
+
]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def initialize(env)
|
32
|
+
self.repo_url = self.class.repo_url(env)
|
33
|
+
self.pull_request_id = self.class.pull_request_id(env)
|
34
|
+
repo_matches = self.repo_url.match(%r{([\/:])([^\/]+\/[^\/]+)$})
|
35
|
+
self.repo_slug = repo_matches[2].gsub(/\.git$/, "") unless repo_matches.nil?
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.pull_request_id(env)
|
39
|
+
env["DOTCI_PULL_REQUEST"]
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.repo_url(env)
|
43
|
+
if env["DOTCI_INSTALL_PACKAGES_GIT_CLONE_URL"]
|
44
|
+
env["DOTCI_INSTALL_PACKAGES_GIT_CLONE_URL"]
|
45
|
+
elsif env["DOTCI_DOCKER_COMPOSE_GIT_CLONE_URL"]
|
46
|
+
env["DOTCI_DOCKER_COMPOSE_GIT_CLONE_URL"]
|
47
|
+
else
|
48
|
+
env["GIT_URL"]
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# http://readme.drone.io/usage/variables/
|
2
|
+
require "danger/request_sources/github/github"
|
3
|
+
require "danger/request_sources/gitlab"
|
4
|
+
|
5
|
+
module Danger
|
6
|
+
# ### CI Setup
|
7
|
+
#
|
8
|
+
# With Drone you run the docker images yourself, so you will want to add `bundle exec danger` at the end of
|
9
|
+
# your `.drone.yml`.
|
10
|
+
#
|
11
|
+
# ``` shell
|
12
|
+
# build:
|
13
|
+
# image: golang
|
14
|
+
# commands:
|
15
|
+
# - ...
|
16
|
+
# - bundle exec danger
|
17
|
+
# ```
|
18
|
+
#
|
19
|
+
# ### Token Setup
|
20
|
+
#
|
21
|
+
# As this is self-hosted, you will need to expose the `DANGER_GITHUB_API_TOKEN` as a secret to your
|
22
|
+
# builds:
|
23
|
+
#
|
24
|
+
# Drone secrets: http://readme.drone.io/usage/secret-guide/
|
25
|
+
# NOTE: This is a new syntax in DroneCI 0.6+
|
26
|
+
#
|
27
|
+
# ```
|
28
|
+
# build:
|
29
|
+
# image: golang
|
30
|
+
# secrets:
|
31
|
+
# - DANGER_GITHUB_API_TOKEN
|
32
|
+
# commands:
|
33
|
+
# - ...
|
34
|
+
# - bundle exec danger
|
35
|
+
# ```
|
36
|
+
class Drone < CI
|
37
|
+
def self.validates_as_ci?(env)
|
38
|
+
validates_as_ci_post_06?(env) or validates_as_ci_pre_06?(env)
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.validates_as_pr?(env)
|
42
|
+
env["DRONE_PULL_REQUEST"].to_i > 0
|
43
|
+
end
|
44
|
+
|
45
|
+
def supported_request_sources
|
46
|
+
@supported_request_sources ||= [Danger::RequestSources::GitHub, Danger::RequestSources::GitLab]
|
47
|
+
end
|
48
|
+
|
49
|
+
def initialize(env)
|
50
|
+
if self.class.validates_as_ci_post_06?(env)
|
51
|
+
self.repo_slug = "#{env['DRONE_REPO_OWNER']}/#{env['DRONE_REPO_NAME']}"
|
52
|
+
self.repo_url = env["DRONE_REPO_LINK"] if self.class.validates_as_ci_post_06?(env)
|
53
|
+
elsif self.class.validates_as_ci_pre_06?(env)
|
54
|
+
self.repo_slug = env["DRONE_REPO"]
|
55
|
+
self.repo_url = GitRepo.new.origins
|
56
|
+
end
|
57
|
+
|
58
|
+
self.pull_request_id = env["DRONE_PULL_REQUEST"]
|
59
|
+
end
|
60
|
+
|
61
|
+
# Check if this build is valid for CI with drone 0.6 or later
|
62
|
+
def self.validates_as_ci_post_06?(env)
|
63
|
+
env.key? "DRONE_REPO_OWNER" and env.key? "DRONE_REPO_NAME"
|
64
|
+
end
|
65
|
+
|
66
|
+
# Checks if this build is valid for CI with drone 0.5 or earlier
|
67
|
+
def self.validates_as_ci_pre_06?(env)
|
68
|
+
env.key? "DRONE_REPO"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require "danger/request_sources/github/github"
|
2
|
+
|
3
|
+
module Danger
|
4
|
+
# ### CI Setup
|
5
|
+
#
|
6
|
+
# You can use `danger/danger` Action in your `.github/workflows/xxx.yml`.
|
7
|
+
# And so, you can use GITHUB_TOKEN secret as `DANGER_GITHUB_API_TOKEN` environment variable.
|
8
|
+
#
|
9
|
+
# ```
|
10
|
+
# ...
|
11
|
+
# steps:
|
12
|
+
# - uses: actions/checkout@v1
|
13
|
+
# - uses: danger/danger@master
|
14
|
+
# env:
|
15
|
+
# DANGER_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
16
|
+
# ```
|
17
|
+
#
|
18
|
+
class GitHubActions < CI
|
19
|
+
def self.validates_as_ci?(env)
|
20
|
+
env.key? "GITHUB_ACTION"
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.validates_as_pr?(env)
|
24
|
+
env["GITHUB_EVENT_NAME"] == "pull_request"
|
25
|
+
end
|
26
|
+
|
27
|
+
def supported_request_sources
|
28
|
+
@supported_request_sources ||= [Danger::RequestSources::GitHub]
|
29
|
+
end
|
30
|
+
|
31
|
+
def initialize(env)
|
32
|
+
self.repo_slug = env["GITHUB_REPOSITORY"]
|
33
|
+
pull_request_event = JSON.parse(File.read(env["GITHUB_EVENT_PATH"]))
|
34
|
+
self.pull_request_id = pull_request_event['number']
|
35
|
+
self.repo_url = pull_request_event['repository']['clone_url']
|
36
|
+
|
37
|
+
# if environment variable DANGER_GITHUB_API_TOKEN is not set, use env GITHUB_TOKEN
|
38
|
+
if (env.key? "GITHUB_ACTION") && (!env.key? 'DANGER_GITHUB_API_TOKEN')
|
39
|
+
env['DANGER_GITHUB_API_TOKEN'] = env['GITHUB_TOKEN']
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
# http://docs.gitlab.com/ce/ci/variables/README.html
|
2
|
+
require "uri"
|
3
|
+
require "danger/request_sources/github/github"
|
4
|
+
require "danger/request_sources/gitlab"
|
5
|
+
|
6
|
+
module Danger
|
7
|
+
# ### CI Setup
|
8
|
+
#
|
9
|
+
# Install dependencies and add a danger step to your .gitlab-ci.yml:
|
10
|
+
# ```yml
|
11
|
+
# before_script:
|
12
|
+
# - bundle install
|
13
|
+
# danger:
|
14
|
+
# script:
|
15
|
+
# - bundle exec danger
|
16
|
+
# ```
|
17
|
+
# ### Token Setup
|
18
|
+
#
|
19
|
+
# Add the `DANGER_GITLAB_API_TOKEN` to your pipeline env variables if you
|
20
|
+
# are hosting your code on GitLab. If you are using GitLab as a mirror
|
21
|
+
# for the purpose of CI/CD, while hosting your repo on GitHub, set the
|
22
|
+
# `DANGER_GITHUB_API_TOKEN` as well as the project repo URL to
|
23
|
+
# `DANGER_PROJECT_REPO_URL`.
|
24
|
+
|
25
|
+
class GitLabCI < CI
|
26
|
+
def self.validates_as_ci?(env)
|
27
|
+
env.key? "GITLAB_CI"
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.validates_as_pr?(env)
|
31
|
+
exists = [
|
32
|
+
"GITLAB_CI", "CI_PROJECT_PATH"
|
33
|
+
].all? { |x| env[x] }
|
34
|
+
|
35
|
+
exists && determine_pull_or_merge_request_id(env).to_i > 0
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.determine_pull_or_merge_request_id(env)
|
39
|
+
return env["CI_MERGE_REQUEST_IID"] if env["CI_MERGE_REQUEST_IID"]
|
40
|
+
return env["CI_EXTERNAL_PULL_REQUEST_IID"] if env["CI_EXTERNAL_PULL_REQUEST_IID"]
|
41
|
+
return 0 unless env["CI_COMMIT_SHA"]
|
42
|
+
|
43
|
+
project_path = env["CI_MERGE_REQUEST_PROJECT_PATH"] || env["CI_PROJECT_PATH"]
|
44
|
+
base_commit = env["CI_COMMIT_SHA"]
|
45
|
+
client = RequestSources::GitLab.new(nil, env).client
|
46
|
+
|
47
|
+
if (Gem::Version.new(client.version.version) >= Gem::Version.new("10.7"))
|
48
|
+
#Use the 'list merge requests associated with a commit' API, for speeed
|
49
|
+
# (GET /projects/:id/repository/commits/:sha/merge_requests) available for GitLab >= 10.7
|
50
|
+
merge_request = client.commit_merge_requests(project_path, base_commit, state: :opened).first
|
51
|
+
else
|
52
|
+
merge_requests = client.merge_requests(project_path, state: :opened)
|
53
|
+
merge_request = merge_requests.auto_paginate.find do |mr|
|
54
|
+
mr.sha == base_commit
|
55
|
+
end
|
56
|
+
end
|
57
|
+
merge_request.nil? ? 0 : merge_request.iid
|
58
|
+
end
|
59
|
+
|
60
|
+
def initialize(env)
|
61
|
+
@env = env
|
62
|
+
@repo_slug = slug_from(env)
|
63
|
+
end
|
64
|
+
|
65
|
+
def supported_request_sources
|
66
|
+
@supported_request_sources ||= [
|
67
|
+
Danger::RequestSources::GitHub,
|
68
|
+
Danger::RequestSources::GitLab
|
69
|
+
]
|
70
|
+
end
|
71
|
+
|
72
|
+
def pull_request_id
|
73
|
+
@pull_request_id ||= self.class.determine_pull_or_merge_request_id(@env)
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
def slug_from(env)
|
79
|
+
if env["DANGER_PROJECT_REPO_URL"]
|
80
|
+
env["DANGER_PROJECT_REPO_URL"].split('/').last(2).join('/')
|
81
|
+
else
|
82
|
+
env["CI_MERGE_REQUEST_PROJECT_PATH"] || env["CI_PROJECT_PATH"]
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,149 @@
|
|
1
|
+
# https://wiki.jenkins-ci.org/display/JENKINS/Building+a+software+project#Buildingasoftwareproject-JenkinsSetEnvironmentVariables
|
2
|
+
# https://wiki.jenkins-ci.org/display/JENKINS/GitHub+pull+request+builder+plugin
|
3
|
+
require "danger/request_sources/github/github"
|
4
|
+
require "danger/request_sources/gitlab"
|
5
|
+
require "danger/request_sources/bitbucket_server"
|
6
|
+
require "danger/request_sources/bitbucket_cloud"
|
7
|
+
|
8
|
+
module Danger
|
9
|
+
# https://jenkins-ci.org
|
10
|
+
|
11
|
+
# ### CI Setup
|
12
|
+
# Ah Jenkins, so many memories. So, if you're using Jenkins, you're hosting your own environment.
|
13
|
+
#
|
14
|
+
# #### GitHub
|
15
|
+
# You will want to be using the [GitHub pull request builder plugin](https://wiki.jenkins-ci.org/display/JENKINS/GitHub+pull+request+builder+plugin)
|
16
|
+
# in order to ensure that you have the build environment set up for PR integration.
|
17
|
+
#
|
18
|
+
# With that set up, you can edit your job to add `bundle exec danger` at the build action.
|
19
|
+
#
|
20
|
+
# ##### Pipeline
|
21
|
+
# If your're using [pipelines](https://jenkins.io/solutions/pipeline/) you should be using the [GitHub branch source plugin](https://wiki.jenkins-ci.org/display/JENKINS/GitHub+Branch+Source+Plugin)
|
22
|
+
# for easy setup and handling of PRs.
|
23
|
+
#
|
24
|
+
# After you've set up the plugin, add a `sh 'bundle exec danger'` line in your pipeline script and make sure that build PRs is enabled.
|
25
|
+
#
|
26
|
+
# #### GitLab
|
27
|
+
# You will want to be using the [GitLab Plugin](https://github.com/jenkinsci/gitlab-plugin)
|
28
|
+
# in order to ensure that you have the build environment set up for MR integration.
|
29
|
+
#
|
30
|
+
# With that set up, you can edit your job to add `bundle exec danger` at the build action.
|
31
|
+
#
|
32
|
+
# #### General
|
33
|
+
#
|
34
|
+
# People occasionally see issues with Danger not classing your CI runs as a PR, to give you visibilty
|
35
|
+
# the Jenkins side of Danger expects to see one of these env vars:
|
36
|
+
# - ghprbPullId
|
37
|
+
# - CHANGE_ID
|
38
|
+
# - gitlabMergeRequestIid
|
39
|
+
# - gitlabMergeRequestId
|
40
|
+
#
|
41
|
+
# ### Token Setup
|
42
|
+
#
|
43
|
+
# #### GitHub
|
44
|
+
# As you own the machine, it's up to you to add the environment variable for the `DANGER_GITHUB_API_TOKEN`.
|
45
|
+
#
|
46
|
+
# #### GitLab
|
47
|
+
# As you own the machine, it's up to you to add the environment variable for the `DANGER_GITLAB_API_TOKEN`.
|
48
|
+
#
|
49
|
+
class Jenkins < CI
|
50
|
+
attr_accessor :project_url
|
51
|
+
class EnvNotFound < StandardError
|
52
|
+
def initialize
|
53
|
+
super("ENV not found, please check your Jenkins. Related: https://stackoverflow.com/search?q=jenkins+env+null")
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.validates_as_ci?(env)
|
58
|
+
env.key? "JENKINS_URL"
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.validates_as_pr?(env)
|
62
|
+
id = pull_request_id(env)
|
63
|
+
!id.nil? && !id.empty? && !!id.match(%r{^\d+$})
|
64
|
+
end
|
65
|
+
|
66
|
+
def supported_request_sources
|
67
|
+
@supported_request_sources ||= begin
|
68
|
+
[
|
69
|
+
Danger::RequestSources::GitHub,
|
70
|
+
Danger::RequestSources::GitLab,
|
71
|
+
Danger::RequestSources::BitbucketServer,
|
72
|
+
Danger::RequestSources::BitbucketCloud
|
73
|
+
]
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def initialize(env)
|
78
|
+
raise EnvNotFound.new if env.nil? || env.empty?
|
79
|
+
|
80
|
+
self.repo_url = self.class.repo_url(env)
|
81
|
+
self.pull_request_id = self.class.pull_request_id(env)
|
82
|
+
self.repo_slug = self.class.repo_slug(self.repo_url)
|
83
|
+
self.project_url = env["CI_MERGE_REQUEST_PROJECT_URL"] || env["CI_PROJECT_URL"]
|
84
|
+
end
|
85
|
+
|
86
|
+
def self.repo_slug(repo_url)
|
87
|
+
slug = self.slug_ssh(repo_url)
|
88
|
+
slug = self.slug_http(repo_url) unless slug
|
89
|
+
slug = self.slug_bitbucket(repo_url) unless slug
|
90
|
+
slug = self.slug_fallback(repo_url) unless slug
|
91
|
+
return slug.gsub(/\.git$/, "") unless slug.nil?
|
92
|
+
end
|
93
|
+
|
94
|
+
def self.slug_bitbucket(repo_url)
|
95
|
+
repo_matches = repo_url.match(%r{(?:[\/:])projects\/([^\/.]+)\/repos\/([^\/.]+)})
|
96
|
+
return "#{repo_matches[1]}/#{repo_matches[2]}" if repo_matches
|
97
|
+
end
|
98
|
+
|
99
|
+
def self.slug_ssh(repo_url)
|
100
|
+
repo_matches = repo_url.match(%r{^git@.+:(.+)})
|
101
|
+
return repo_matches[1] if repo_matches
|
102
|
+
end
|
103
|
+
|
104
|
+
def self.slug_http(repo_url)
|
105
|
+
repo_matches = repo_url.match(%r{^https?.+(?>\.\w*\d*\/)(.+.git$)})
|
106
|
+
return repo_matches[1] if repo_matches
|
107
|
+
end
|
108
|
+
|
109
|
+
def self.slug_fallback(repo_url)
|
110
|
+
repo_matches = repo_url.match(%r{([\/:])([^\/]+\/[^\/]+)$})
|
111
|
+
return repo_matches[2]
|
112
|
+
end
|
113
|
+
|
114
|
+
def self.pull_request_id(env)
|
115
|
+
if env["ghprbPullId"]
|
116
|
+
env["ghprbPullId"]
|
117
|
+
elsif env["CHANGE_ID"]
|
118
|
+
env["CHANGE_ID"]
|
119
|
+
elsif env["gitlabMergeRequestIid"]
|
120
|
+
env["gitlabMergeRequestIid"]
|
121
|
+
else
|
122
|
+
env["gitlabMergeRequestId"]
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def self.repo_url(env)
|
127
|
+
if env["GIT_URL_1"]
|
128
|
+
env["GIT_URL_1"]
|
129
|
+
elsif env["CHANGE_URL"]
|
130
|
+
change_url = env["CHANGE_URL"]
|
131
|
+
case change_url
|
132
|
+
when %r{\/pull\/} # GitHub
|
133
|
+
matches = change_url.match(%r{(.+)\/pull\/[0-9]+})
|
134
|
+
matches[1] unless matches.nil?
|
135
|
+
when %r{\/merge_requests\/} # GitLab
|
136
|
+
matches = change_url.match(%r{(.+)\/merge_requests\/[0-9]+})
|
137
|
+
matches[1] unless matches.nil?
|
138
|
+
when %r{\/pull-requests\/} # Bitbucket
|
139
|
+
matches = change_url.match(%r{(.+)\/pull-requests\/[0-9]+})
|
140
|
+
matches[1] unless matches.nil?
|
141
|
+
else
|
142
|
+
change_url
|
143
|
+
end
|
144
|
+
else
|
145
|
+
env["GIT_URL"]
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
@@ -0,0 +1,119 @@
|
|
1
|
+
# For more info see: https://github.com/schacon/ruby-git
|
2
|
+
|
3
|
+
require "git"
|
4
|
+
require "uri"
|
5
|
+
|
6
|
+
require "danger/request_sources/github/github"
|
7
|
+
|
8
|
+
require "danger/ci_source/support/find_repo_info_from_url"
|
9
|
+
require "danger/ci_source/support/find_repo_info_from_logs"
|
10
|
+
require "danger/ci_source/support/no_repo_info"
|
11
|
+
require "danger/ci_source/support/pull_request_finder"
|
12
|
+
require "danger/ci_source/support/commits"
|
13
|
+
|
14
|
+
module Danger
|
15
|
+
# ignore
|
16
|
+
class LocalGitRepo < CI
|
17
|
+
attr_accessor :base_commit, :head_commit
|
18
|
+
|
19
|
+
def self.validates_as_ci?(env)
|
20
|
+
env.key? "DANGER_USE_LOCAL_GIT"
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.validates_as_pr?(_env)
|
24
|
+
false
|
25
|
+
end
|
26
|
+
|
27
|
+
def git
|
28
|
+
@git ||= GitRepo.new
|
29
|
+
end
|
30
|
+
|
31
|
+
def run_git(command)
|
32
|
+
git.exec(command).encode("UTF-8", "binary", invalid: :replace, undef: :replace, replace: "")
|
33
|
+
end
|
34
|
+
|
35
|
+
def supported_request_sources
|
36
|
+
@supported_request_sources ||= [Danger::RequestSources::GitHub, Danger::RequestSources::BitbucketServer, Danger::RequestSources::BitbucketCloud]
|
37
|
+
end
|
38
|
+
|
39
|
+
def initialize(env = {})
|
40
|
+
@env = env
|
41
|
+
|
42
|
+
self.repo_slug = remote_info.slug
|
43
|
+
raise_error_for_missing_remote if remote_info.kind_of?(NoRepoInfo)
|
44
|
+
|
45
|
+
self.pull_request_id = found_pull_request.pull_request_id
|
46
|
+
|
47
|
+
if sha
|
48
|
+
self.base_commit = commits.base
|
49
|
+
self.head_commit = commits.head
|
50
|
+
else
|
51
|
+
self.base_commit = found_pull_request.base
|
52
|
+
self.head_commit = found_pull_request.head
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
attr_reader :env
|
59
|
+
|
60
|
+
def raise_error_for_missing_remote
|
61
|
+
raise missing_remote_error_message
|
62
|
+
end
|
63
|
+
|
64
|
+
def missing_remote_error_message
|
65
|
+
"danger cannot find your git remote, please set a remote. " \
|
66
|
+
"And the repository must host on GitHub.com or GitHub Enterprise."
|
67
|
+
end
|
68
|
+
|
69
|
+
def remote_info
|
70
|
+
@_remote_info ||= begin
|
71
|
+
remote_info = begin
|
72
|
+
if given_pull_request_url?
|
73
|
+
FindRepoInfoFromURL.new(env["LOCAL_GIT_PR_URL"]).call
|
74
|
+
else
|
75
|
+
FindRepoInfoFromLogs.new(
|
76
|
+
env["DANGER_GITHUB_HOST"] || "github.com".freeze,
|
77
|
+
run_git("remote show origin -n".freeze)
|
78
|
+
).call
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
remote_info || NoRepoInfo.new
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def found_pull_request
|
87
|
+
@_found_pull_request ||= begin
|
88
|
+
if given_pull_request_url?
|
89
|
+
PullRequestFinder.new(
|
90
|
+
remote_info.id,
|
91
|
+
remote_info.slug,
|
92
|
+
remote: true,
|
93
|
+
remote_url: env["LOCAL_GIT_PR_URL"],
|
94
|
+
env: env
|
95
|
+
).call
|
96
|
+
else
|
97
|
+
PullRequestFinder.new(
|
98
|
+
env.fetch("LOCAL_GIT_PR_ID") { "".freeze },
|
99
|
+
remote_info.slug,
|
100
|
+
remote: false,
|
101
|
+
git_logs: run_git("log --oneline -1000000".freeze)
|
102
|
+
).call
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def given_pull_request_url?
|
108
|
+
env["LOCAL_GIT_PR_URL"] && !env["LOCAL_GIT_PR_URL"].empty?
|
109
|
+
end
|
110
|
+
|
111
|
+
def sha
|
112
|
+
@_sha ||= found_pull_request.sha
|
113
|
+
end
|
114
|
+
|
115
|
+
def commits
|
116
|
+
@_commits ||= Commits.new(run_git("rev-list --parents -n 1 #{sha}"))
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|