Improve Emoji detection in commit messages
This changes our Danger integration so that it is smarter about detecting GitLab emoji in commit messages. This is done using a two step process: 1. We use the old regular expression to determine if a commit message _might_ include an emoji. 2. If this regular expression matches, we then check for all existing emoji names in the commit message. This might be a wee bit expensive, but because we couple it with the previous step it should be rarely executed. This ensures we don't trigger an error when a commit message includes text such as `:foo:bar:`, which is not a valid Emoji. Fixes https://gitlab.com/gitlab-org/release/framework/issues/15
This commit is contained in:
parent
a2a00a5e6d
commit
4ef1dd09dd
|
|
@ -1,5 +1,7 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'json'
|
||||||
|
|
||||||
# rubocop: disable Style/SignalException
|
# rubocop: disable Style/SignalException
|
||||||
# rubocop: disable Metrics/CyclomaticComplexity
|
# rubocop: disable Metrics/CyclomaticComplexity
|
||||||
# rubocop: disable Metrics/PerceivedComplexity
|
# rubocop: disable Metrics/PerceivedComplexity
|
||||||
|
|
@ -8,6 +10,30 @@
|
||||||
# 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.
|
||||||
|
|
||||||
|
class EmojiChecker
|
||||||
|
DIGESTS = File.expand_path('../../fixtures/emojis/digests.json', __dir__)
|
||||||
|
ALIASES = File.expand_path('../../fixtures/emojis/aliases.json', __dir__)
|
||||||
|
|
||||||
|
# A regex that indicates a piece of text _might_ include an Emoji. The regex
|
||||||
|
# alone is not enough, as we'd match `:foo:bar:baz`. Instead, we use this
|
||||||
|
# regex to save us from having to check for all possible emoji names when we
|
||||||
|
# know one definitely is not included.
|
||||||
|
LIKELY_EMOJI = /:[\+a-z0-9_\-]+:/
|
||||||
|
|
||||||
|
def initialize
|
||||||
|
names = JSON.parse(File.read(DIGESTS)).keys +
|
||||||
|
JSON.parse(File.read(ALIASES)).keys
|
||||||
|
|
||||||
|
@emoji = names.map { |name| ":#{name}:" }
|
||||||
|
end
|
||||||
|
|
||||||
|
def includes_emoji?(text)
|
||||||
|
return false unless text.match?(LIKELY_EMOJI)
|
||||||
|
|
||||||
|
@emoji.any? { |emoji| text.include?(emoji) }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def fail_commit(commit, message)
|
def fail_commit(commit, message)
|
||||||
fail("#{commit.sha}: #{message}")
|
fail("#{commit.sha}: #{message}")
|
||||||
end
|
end
|
||||||
|
|
@ -33,6 +59,7 @@ end
|
||||||
|
|
||||||
def lint_commits(commits)
|
def lint_commits(commits)
|
||||||
failures = false
|
failures = false
|
||||||
|
emoji_checker = EmojiChecker.new
|
||||||
|
|
||||||
unicode_emoji_regex = %r((
|
unicode_emoji_regex = %r((
|
||||||
[\u{1F300}-\u{1F5FF}] |
|
[\u{1F300}-\u{1F5FF}] |
|
||||||
|
|
@ -117,7 +144,7 @@ def lint_commits(commits)
|
||||||
failures = true
|
failures = true
|
||||||
end
|
end
|
||||||
|
|
||||||
if commit.message.match?(/:[\+a-z0-9_\-]+:/)
|
if emoji_checker.includes_emoji?(commit.message)
|
||||||
fail_commit(
|
fail_commit(
|
||||||
commit,
|
commit,
|
||||||
'Avoid the use of Markdown Emoji such as `:+1:`. ' \
|
'Avoid the use of Markdown Emoji such as `:+1:`. ' \
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue