Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYorick Peterse <yorickpeterse@gmail.com>2018-09-18 17:14:38 +0300
committerYorick Peterse <yorickpeterse@gmail.com>2018-09-18 17:22:29 +0300
commit4ef1dd09ddc5701de5ed72887d9e682f4650e732 (patch)
treecd38bacbf1977d56bc56c855fb3163398b7436c2
parenta2a00a5e6d1ba3d2ebfafcff57e211cb1b65c00a (diff)
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
-rw-r--r--danger/commit_messages/Dangerfile29
1 files changed, 28 insertions, 1 deletions
diff --git a/danger/commit_messages/Dangerfile b/danger/commit_messages/Dangerfile
index e982e8ed7c5..a152ff837a9 100644
--- a/danger/commit_messages/Dangerfile
+++ b/danger/commit_messages/Dangerfile
@@ -1,5 +1,7 @@
# frozen_string_literal: true
+require 'json'
+
# rubocop: disable Style/SignalException
# rubocop: disable Metrics/CyclomaticComplexity
# rubocop: disable Metrics/PerceivedComplexity
@@ -8,6 +10,30 @@
# 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.
+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)
fail("#{commit.sha}: #{message}")
end
@@ -33,6 +59,7 @@ end
def lint_commits(commits)
failures = false
+ emoji_checker = EmojiChecker.new
unicode_emoji_regex = %r((
[\u{1F300}-\u{1F5FF}] |
@@ -117,7 +144,7 @@ def lint_commits(commits)
failures = true
end
- if commit.message.match?(/:[\+a-z0-9_\-]+:/)
+ if emoji_checker.includes_emoji?(commit.message)
fail_commit(
commit,
'Avoid the use of Markdown Emoji such as `:+1:`. ' \