Commit 3051ee4f authored by Lin Jen-Shin's avatar Lin Jen-Shin

Merge branch 'danger-improve-commit-message' into 'master'

Make Danger less verbose about commit messages

See merge request gitlab-org/gitlab!26587
parents e2abcc66 653202fd
...@@ -2,19 +2,28 @@ ...@@ -2,19 +2,28 @@
require_relative File.expand_path('../../lib/gitlab/danger/commit_linter', __dir__) require_relative File.expand_path('../../lib/gitlab/danger/commit_linter', __dir__)
URL_GIT_COMMIT = "https://chris.beams.io/posts/git-commit/" COMMIT_MESSAGE_GUIDELINES = "https://docs.gitlab.com/ee/development/contributing/merge_request_workflow.html#commit-messages-guidelines"
MORE_INFO = "For more information, take a look at our [Commit message guidelines](#{COMMIT_MESSAGE_GUIDELINES})."
THE_DANGER_JOB_TEXT = "the `danger-review` job"
MAX_COMMITS_COUNT = 10 MAX_COMMITS_COUNT = 10
def gitlab_danger def gitlab_danger
@gitlab_danger ||= GitlabDanger.new(helper.gitlab_helper) @gitlab_danger ||= GitlabDanger.new(helper.gitlab_helper)
end end
def fail_commit(commit, message) def fail_commit(commit, message, more_info: true)
self.fail("#{commit.sha}: #{message}") self.fail(build_message(commit, message, more_info: more_info))
end end
def warn_commit(commit, message) def warn_commit(commit, message, more_info: true)
self.warn("#{commit.sha}: #{message}") self.warn(build_message(commit, message, more_info: more_info))
end
def build_message(commit, message, more_info: true)
[message].tap do |full_message|
full_message << ". #{MORE_INFO}" if more_info
full_message.unshift("#{commit.sha}: ") if commit.sha
end.join
end end
def squash_mr? def squash_mr?
...@@ -25,6 +34,10 @@ def wip_mr? ...@@ -25,6 +34,10 @@ def wip_mr?
gitlab_danger.ci? ? gitlab.mr_json['work_in_progress'] : false gitlab_danger.ci? ? gitlab.mr_json['work_in_progress'] : false
end end
def danger_job_link
gitlab_danger.ci? ? "[#{THE_DANGER_JOB_TEXT}](#{ENV['CI_JOB_URL']})" : THE_DANGER_JOB_TEXT
end
# Perform various checks against commits. We're not using # Perform various checks against commits. We're not using
# https://github.com/jonallured/danger-commit_lint because its output is not # https://github.com/jonallured/danger-commit_lint because its output is not
# very helpful, and it doesn't offer the means of ignoring merge commits. # very helpful, and it doesn't offer the means of ignoring merge commits.
...@@ -42,11 +55,11 @@ def lint_commit(commit) ...@@ -42,11 +55,11 @@ def lint_commit(commit)
return linter if linter.fixup? && squash_mr? return linter if linter.fixup? && squash_mr?
if linter.fixup? if linter.fixup?
msg = 'Squash or fixup commits must be squashed before merge, or enable squash merge option' msg = "Squash or fixup commits must be squashed before merge, or enable squash merge option and re-run #{danger_job_link}."
if wip_mr? || squash_mr? if wip_mr? || squash_mr?
warn_commit(commit, msg) warn_commit(commit, msg, more_info: false)
else else
fail_commit(commit, msg) fail_commit(commit, msg, more_info: false)
end end
# Makes no sense to process other rules for fixup commits, they trigger just more noise # Makes no sense to process other rules for fixup commits, they trigger just more noise
...@@ -56,7 +69,7 @@ def lint_commit(commit) ...@@ -56,7 +69,7 @@ def lint_commit(commit)
# Fail if a suggestion commit is used and squash is not enabled # Fail if a suggestion commit is used and squash is not enabled
if linter.suggestion? if linter.suggestion?
unless squash_mr? unless squash_mr?
fail_commit(commit, "If you are applying suggestions, enable squash in the merge request and re-run the `danger-review` job") fail_commit(commit, "If you are applying suggestions, enable squash in the merge request and re-run #{danger_job_link}.", more_info: false)
end end
return linter return linter
...@@ -93,18 +106,12 @@ def lint_commits(commits) ...@@ -93,18 +106,12 @@ def lint_commits(commits)
if multi_line_commit_linter && multi_line_commit_linter.failed? if multi_line_commit_linter && multi_line_commit_linter.failed?
warn_or_fail_commits(multi_line_commit_linter) warn_or_fail_commits(multi_line_commit_linter)
fail_message('The commit message that will be used in the squash commit does not meet our Git commit message standards.')
else else
title_linter = lint_mr_title(gitlab.mr_json['title']) title_linter = lint_mr_title(gitlab.mr_json['title'])
if title_linter.failed? if title_linter.failed?
warn_or_fail_commits(title_linter) warn_or_fail_commits(title_linter)
fail_message('The merge request title that will be used in the squash commit does not meet our Git commit message standards.')
end end
end end
else
if failed_commit_linters.any?
fail_message('One or more commit messages do not meet our Git commit message standards.')
end
end end
end end
...@@ -123,40 +130,4 @@ def warn_or_fail_commits(failed_linters, default_to_fail: true) ...@@ -123,40 +130,4 @@ def warn_or_fail_commits(failed_linters, default_to_fail: true)
end end
end end
def fail_message(intro)
markdown(<<~MARKDOWN)
## Commit message standards
#{intro}
For more information on how to write a good commit message, take a look at
[How to Write a Git Commit Message](#{URL_GIT_COMMIT}).
Here is an example of a good commit message:
Reject ruby interpolation in externalized strings
When using ruby interpolation in externalized strings, they can't be
detected. Which means they will never be presented to be translated.
To mix variables into translations we need to use `sprintf`
instead.
Instead of:
_("Hello \#{subject}")
Use:
_("Hello %{subject}") % { subject: 'world' }
This is an example of a bad commit message:
updated README.md
This commit message is bad because although it tells us that README.md is
updated, it doesn't tell us why or how it was updated.
MARKDOWN
end
lint_commits(git.commits) lint_commits(git.commits)
...@@ -173,7 +173,7 @@ module Gitlab ...@@ -173,7 +173,7 @@ module Gitlab
end end
def details def details
message_parts[2] message_parts[2]&.gsub(/^Signed-off-by.*$/, '')
end end
def line_too_long?(line) def line_too_long?(line)
......
...@@ -86,6 +86,7 @@ describe Gitlab::Danger::CommitLinter do ...@@ -86,6 +86,7 @@ describe Gitlab::Danger::CommitLinter do
"A commit message" | false "A commit message" | false
"A commit message\n" | false "A commit message\n" | false
"A commit message\n\n" | false "A commit message\n\n" | false
"A commit message\n\nSigned-off-by: User Name <user@name.me>" | false
"A commit message\n\nWith details" | true "A commit message\n\nWith details" | true
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment