jenkins-bot has submitted this change and it was merged. ( 
https://gerrit.wikimedia.org/r/404156 )

Change subject: Add GitHubMessageValidator and add logic to switch the 
MessageValidator
......................................................................


Add GitHubMessageValidator and add logic to switch the MessageValidator

Add GitHubMessageValidator and add logic
to detect the remote repo and switch the MessageValidator
to the appropriate MessageValidator, e.g repo with remote
GitHub will be checked with GitHubMessageValidator, and
repo with remote Gerrit will be checked with GerritMessageValidator.

This commit also modifies the way how the tests work,
the `tests/data` directory has subdirectories
that's where the tests for each MessageValidator
is put in.

Bug: T179905
Change-Id: I990c6d7ac313292e929b1c1aba2e6b9e19fb3e7d
---
M commit_message_validator/__init__.py
R commit_message_validator/tests/data/GerritMessageValidator/bug_in_header.msg
R commit_message_validator/tests/data/GerritMessageValidator/bug_in_header.out
R 
commit_message_validator/tests/data/GerritMessageValidator/check_message_errors.msg
R 
commit_message_validator/tests/data/GerritMessageValidator/check_message_errors.out
R 
commit_message_validator/tests/data/GerritMessageValidator/check_message_ok.msg
R 
commit_message_validator/tests/data/GerritMessageValidator/check_message_ok.out
R 
commit_message_validator/tests/data/GerritMessageValidator/cherry_pick_not_on_the_last_line.msg
R 
commit_message_validator/tests/data/GerritMessageValidator/cherry_pick_not_on_the_last_line.out
R 
commit_message_validator/tests/data/GerritMessageValidator/co-authored-by_ok.msg
R 
commit_message_validator/tests/data/GerritMessageValidator/co-authored-by_ok.out
R 
commit_message_validator/tests/data/GerritMessageValidator/invalid_change_id.msg
R 
commit_message_validator/tests/data/GerritMessageValidator/invalid_change_id.out
R 
commit_message_validator/tests/data/GerritMessageValidator/invalid_depends_on.msg
R 
commit_message_validator/tests/data/GerritMessageValidator/invalid_depends_on.out
R 
commit_message_validator/tests/data/GerritMessageValidator/multiple_change_id.msg
C 
commit_message_validator/tests/data/GerritMessageValidator/multiple_change_id.out
R 
commit_message_validator/tests/data/GerritMessageValidator/note-in-message_ok.msg
R 
commit_message_validator/tests/data/GerritMessageValidator/note-in-message_ok.out
R 
commit_message_validator/tests/data/GerritMessageValidator/really_long_url_ok.msg
R 
commit_message_validator/tests/data/GerritMessageValidator/really_long_url_ok.out
R commit_message_validator/tests/data/GerritMessageValidator/short_one_line.msg
R commit_message_validator/tests/data/GerritMessageValidator/short_one_line.out
R commit_message_validator/tests/data/GerritMessageValidator/short_two_lines.msg
R commit_message_validator/tests/data/GerritMessageValidator/short_two_lines.out
R 
commit_message_validator/tests/data/GerritMessageValidator/signed-off-by_ok.msg
R 
commit_message_validator/tests/data/GerritMessageValidator/signed-off-by_ok.out
R commit_message_validator/tests/data/GerritMessageValidator/success
R 
commit_message_validator/tests/data/GerritMessageValidator/tag-like-in-message_ok.msg
R 
commit_message_validator/tests/data/GerritMessageValidator/tag-like-in-message_ok.out
R 
commit_message_validator/tests/data/GerritMessageValidator/unexpected_line_in_footers.msg
R 
commit_message_validator/tests/data/GerritMessageValidator/unexpected_line_in_footers.out
A 
commit_message_validator/tests/data/GitHubMessageValidator/check_bug_in_header.msg
A 
commit_message_validator/tests/data/GitHubMessageValidator/check_bug_in_header.out
A 
commit_message_validator/tests/data/GitHubMessageValidator/check_github_close_keyword_another_repository.msg
A 
commit_message_validator/tests/data/GitHubMessageValidator/check_github_close_keyword_another_repository.out
A 
commit_message_validator/tests/data/GitHubMessageValidator/check_github_closed_keyword_another_repository.msg
A 
commit_message_validator/tests/data/GitHubMessageValidator/check_github_closed_keyword_another_repository.out
A 
commit_message_validator/tests/data/GitHubMessageValidator/check_github_closes_keyword_another_repository.msg
A 
commit_message_validator/tests/data/GitHubMessageValidator/check_github_closes_keyword_another_repository.out
A 
commit_message_validator/tests/data/GitHubMessageValidator/check_github_fix_keyword_another_repository.msg
A 
commit_message_validator/tests/data/GitHubMessageValidator/check_github_fix_keyword_another_repository.out
A 
commit_message_validator/tests/data/GitHubMessageValidator/check_github_fixed_keyword_another_repository.msg
A 
commit_message_validator/tests/data/GitHubMessageValidator/check_github_fixed_keyword_another_repository.out
A 
commit_message_validator/tests/data/GitHubMessageValidator/check_github_fixes_keyword_another_repository.msg
A 
commit_message_validator/tests/data/GitHubMessageValidator/check_github_fixes_keyword_another_repository.out
A 
commit_message_validator/tests/data/GitHubMessageValidator/check_github_resolve_keyword_another_repository.msg
A 
commit_message_validator/tests/data/GitHubMessageValidator/check_github_resolve_keyword_another_repository.out
A 
commit_message_validator/tests/data/GitHubMessageValidator/check_github_resolved_keyword_another_repository.msg
A 
commit_message_validator/tests/data/GitHubMessageValidator/check_github_resolved_keyword_another_repository.out
A 
commit_message_validator/tests/data/GitHubMessageValidator/check_github_resolves_keyword_another_repository.msg
A 
commit_message_validator/tests/data/GitHubMessageValidator/check_github_resolves_keyword_another_repository.out
A 
commit_message_validator/tests/data/GitHubMessageValidator/github_close_keyword_error.out
A commit_message_validator/tests/data/GitHubMessageValidator/good_commit_ok.msg
C commit_message_validator/tests/data/GitHubMessageValidator/good_commit_ok.out
D commit_message_validator/tests/data/multiple_change_id.out
M commit_message_validator/tests/test_commit-message-validator.py
A commit_message_validator/validators/GitHubMessageValidator.py
58 files changed, 199 insertions(+), 35 deletions(-)

Approvals:
  John Vandenberg: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/commit_message_validator/__init__.py 
b/commit_message_validator/__init__.py
index 3f1bc34..242f7f2 100644
--- a/commit_message_validator/__init__.py
+++ b/commit_message_validator/__init__.py
@@ -29,35 +29,84 @@
 
 from commit_message_validator.validators.GerritMessageValidator import (
     GerritMessageValidator)
+from commit_message_validator.validators.GitHubMessageValidator import (
+    GitHubMessageValidator)
 
 __version__ = '0.5.2'
 
 
-def check_message(lines):
-    """Check a commit message to see if it has errors.
+WIKIMEDIA_GERRIT_URL = 'gerrit.wikimedia.org'
+GERRIT_CHECK_FAIL_MESSAGE_SUGGESTION = (
+    'Please review '
+    '<https://www.mediawiki.org/wiki/Gerrit/Commit_message_guidelines>'
+    '\nand update your commit message accordingly')
 
-    Checks:
-    - All lines ok as checked by line_errors()
-    - Message has at least 3 lines (subject, blank, Change-Id)
-    - For any footer line, next line is not blank
-    - For any footer line, prior line is another footer line or blank
-    - Exactly one "Change-Id: " line per commit
-    - Any "Bug:" and "Depends-On:" lines come before "Change-Id:"
-    - "(cherry picked from commit ...)" is last line in footer if present
+
+def get_message_validator_class():
     """
-    validator = GerritMessageValidator(lines)
+    Get appropriate MessageValidator class to check the commit message
+    in the repo.
+
+    This method will check whether the remote repo is a Gerrit or GitHub, and
+    return the appropriate MessageValidator class to check the commit message.
+
+    :return: A class that implements `MessageValidator` class.
+    """
+    result = None
+    if os.path.exists('.gitreview') and os.path.isfile('.gitreview'):
+        result = check_output(
+            ['git', 'config', '-f', '.gitreview', '--get', 'gerrit.host'])
+
+    if result and WIKIMEDIA_GERRIT_URL in result:
+        return GerritMessageValidator
+    else:
+        result = check_output(
+            ['git', 'config', '--get-regex', '^remote.*.url$'])
+
+        remotes = result.splitlines()
+        remote_dict = dict()
+
+        for remote in remotes:
+            remote_splitted = remote.split(' ')
+            remote_dict[remote_splitted[0]] = remote_splitted[1]
+
+        if (WIKIMEDIA_GERRIT_URL in {remote_dict.get('remote.wikimedia.url'),
+                                     remote_dict.get('remote.gerrit.url')}):
+            return GerritMessageValidator
+        elif 'github.com' in remote_dict.get('remote.origin.url'):
+            return GitHubMessageValidator
+        else:
+            # If there's nothing match just use GerritMessageValidator
+            return GerritMessageValidator
+
+
+def check_message(lines, validator_cls=GerritMessageValidator):
+    """
+    Check a commit message to see if it has errors.
+
+    This method will check the commit message by using an appropriate checker
+    depending on what remote repo is.
+
+    :param lines:
+        list of lines from the commit message that will be checked.
+    :param validator_cls:
+        A class that implements `MessageValidator` class,
+        default to `GerritMessageValidator`.
+    :return:
+        An integer, used for exit code.
+    """
     errors = ["Line {0}: {1}".format(lineno, error)
-              for lineno, error in validator]
+              for lineno, error in validator_cls(lines)]
 
     print('commit-message-validator v%s' % __version__)
+    print('Using {0} to check the commit message'.format(
+        validator_cls.__name__))
     if errors:
         print('The following errors were found:')
         for e in errors:
             print(e)
-        print(
-            'Please review '
-            '<https://www.mediawiki.org/wiki/Gerrit/Commit_message_guidelines>'
-            '\nand update your commit message accordingly')
+        if validator_cls is GerritMessageValidator:
+            print(GERRIT_CHECK_FAIL_MESSAGE_SUGGESTION)
         return 1
     else:
         print('Commit message is formatted properly! Keep up the good work!')
@@ -89,7 +138,7 @@
     if len(lines) > 0 and not lines[-1]:
         lines = lines[:-1]
 
-    return check_message(lines)
+    return check_message(lines, get_message_validator_class())
 
 
 def install():
diff --git a/commit_message_validator/tests/data/bug_in_header.msg 
b/commit_message_validator/tests/data/GerritMessageValidator/bug_in_header.msg
similarity index 100%
rename from commit_message_validator/tests/data/bug_in_header.msg
rename to 
commit_message_validator/tests/data/GerritMessageValidator/bug_in_header.msg
diff --git a/commit_message_validator/tests/data/bug_in_header.out 
b/commit_message_validator/tests/data/GerritMessageValidator/bug_in_header.out
similarity index 80%
rename from commit_message_validator/tests/data/bug_in_header.out
rename to 
commit_message_validator/tests/data/GerritMessageValidator/bug_in_header.out
index d0f1d67..4d24c22 100644
--- a/commit_message_validator/tests/data/bug_in_header.out
+++ 
b/commit_message_validator/tests/data/GerritMessageValidator/bug_in_header.out
@@ -1,4 +1,5 @@
 commit-message-validator v%version%
+Using GerritMessageValidator to check the commit message
 The following errors were found:
 Line 1: Do not define bug in the header
 Please review <https://www.mediawiki.org/wiki/Gerrit/Commit_message_guidelines>
diff --git a/commit_message_validator/tests/data/check_message_errors.msg 
b/commit_message_validator/tests/data/GerritMessageValidator/check_message_errors.msg
similarity index 100%
rename from commit_message_validator/tests/data/check_message_errors.msg
rename to 
commit_message_validator/tests/data/GerritMessageValidator/check_message_errors.msg
diff --git a/commit_message_validator/tests/data/check_message_errors.out 
b/commit_message_validator/tests/data/GerritMessageValidator/check_message_errors.out
similarity index 95%
rename from commit_message_validator/tests/data/check_message_errors.out
rename to 
commit_message_validator/tests/data/GerritMessageValidator/check_message_errors.out
index 4609a24..8d859c2 100644
--- a/commit_message_validator/tests/data/check_message_errors.out
+++ 
b/commit_message_validator/tests/data/GerritMessageValidator/check_message_errors.out
@@ -1,4 +1,5 @@
 commit-message-validator v%version%
+Using GerritMessageValidator to check the commit message
 The following errors were found:
 Line 1: First line should be <=80 characters
 Line 2: Second line should be empty
diff --git a/commit_message_validator/tests/data/check_message_ok.msg 
b/commit_message_validator/tests/data/GerritMessageValidator/check_message_ok.msg
similarity index 100%
rename from commit_message_validator/tests/data/check_message_ok.msg
rename to 
commit_message_validator/tests/data/GerritMessageValidator/check_message_ok.msg
diff --git a/commit_message_validator/tests/data/check_message_ok.out 
b/commit_message_validator/tests/data/GerritMessageValidator/check_message_ok.out
similarity index 100%
rename from commit_message_validator/tests/data/check_message_ok.out
rename to 
commit_message_validator/tests/data/GerritMessageValidator/check_message_ok.out
diff --git 
a/commit_message_validator/tests/data/cherry_pick_not_on_the_last_line.msg 
b/commit_message_validator/tests/data/GerritMessageValidator/cherry_pick_not_on_the_last_line.msg
similarity index 100%
rename from 
commit_message_validator/tests/data/cherry_pick_not_on_the_last_line.msg
rename to 
commit_message_validator/tests/data/GerritMessageValidator/cherry_pick_not_on_the_last_line.msg
diff --git 
a/commit_message_validator/tests/data/cherry_pick_not_on_the_last_line.out 
b/commit_message_validator/tests/data/GerritMessageValidator/cherry_pick_not_on_the_last_line.out
similarity index 80%
rename from 
commit_message_validator/tests/data/cherry_pick_not_on_the_last_line.out
rename to 
commit_message_validator/tests/data/GerritMessageValidator/cherry_pick_not_on_the_last_line.out
index ecbfa6a..f6ce1f8 100644
--- a/commit_message_validator/tests/data/cherry_pick_not_on_the_last_line.out
+++ 
b/commit_message_validator/tests/data/GerritMessageValidator/cherry_pick_not_on_the_last_line.out
@@ -1,4 +1,5 @@
 commit-message-validator v%version%
+Using GerritMessageValidator to check the commit message
 The following errors were found:
 Line 5: Cherry pick line is not the last line
 Please review <https://www.mediawiki.org/wiki/Gerrit/Commit_message_guidelines>
diff --git a/commit_message_validator/tests/data/co-authored-by_ok.msg 
b/commit_message_validator/tests/data/GerritMessageValidator/co-authored-by_ok.msg
similarity index 100%
rename from commit_message_validator/tests/data/co-authored-by_ok.msg
rename to 
commit_message_validator/tests/data/GerritMessageValidator/co-authored-by_ok.msg
diff --git a/commit_message_validator/tests/data/co-authored-by_ok.out 
b/commit_message_validator/tests/data/GerritMessageValidator/co-authored-by_ok.out
similarity index 100%
rename from commit_message_validator/tests/data/co-authored-by_ok.out
rename to 
commit_message_validator/tests/data/GerritMessageValidator/co-authored-by_ok.out
diff --git a/commit_message_validator/tests/data/invalid_change_id.msg 
b/commit_message_validator/tests/data/GerritMessageValidator/invalid_change_id.msg
similarity index 100%
rename from commit_message_validator/tests/data/invalid_change_id.msg
rename to 
commit_message_validator/tests/data/GerritMessageValidator/invalid_change_id.msg
diff --git a/commit_message_validator/tests/data/invalid_change_id.out 
b/commit_message_validator/tests/data/GerritMessageValidator/invalid_change_id.out
similarity index 81%
rename from commit_message_validator/tests/data/invalid_change_id.out
rename to 
commit_message_validator/tests/data/GerritMessageValidator/invalid_change_id.out
index f6e563b..dd4f9f3 100644
--- a/commit_message_validator/tests/data/invalid_change_id.out
+++ 
b/commit_message_validator/tests/data/GerritMessageValidator/invalid_change_id.out
@@ -1,4 +1,5 @@
 commit-message-validator v%version%
+Using GerritMessageValidator to check the commit message
 The following errors were found:
 Line 3: Change-Id: value must be a single Gerrit change id
 Please review <https://www.mediawiki.org/wiki/Gerrit/Commit_message_guidelines>
diff --git a/commit_message_validator/tests/data/invalid_depends_on.msg 
b/commit_message_validator/tests/data/GerritMessageValidator/invalid_depends_on.msg
similarity index 100%
rename from commit_message_validator/tests/data/invalid_depends_on.msg
rename to 
commit_message_validator/tests/data/GerritMessageValidator/invalid_depends_on.msg
diff --git a/commit_message_validator/tests/data/invalid_depends_on.out 
b/commit_message_validator/tests/data/GerritMessageValidator/invalid_depends_on.out
similarity index 81%
rename from commit_message_validator/tests/data/invalid_depends_on.out
rename to 
commit_message_validator/tests/data/GerritMessageValidator/invalid_depends_on.out
index 1ff48d8..8c97e17 100644
--- a/commit_message_validator/tests/data/invalid_depends_on.out
+++ 
b/commit_message_validator/tests/data/GerritMessageValidator/invalid_depends_on.out
@@ -1,4 +1,5 @@
 commit-message-validator v%version%
+Using GerritMessageValidator to check the commit message
 The following errors were found:
 Line 3: Depends-On: value must be a single Gerrit change id
 Please review <https://www.mediawiki.org/wiki/Gerrit/Commit_message_guidelines>
diff --git a/commit_message_validator/tests/data/multiple_change_id.msg 
b/commit_message_validator/tests/data/GerritMessageValidator/multiple_change_id.msg
similarity index 100%
rename from commit_message_validator/tests/data/multiple_change_id.msg
rename to 
commit_message_validator/tests/data/GerritMessageValidator/multiple_change_id.msg
diff --git a/commit_message_validator/tests/data/invalid_change_id.out 
b/commit_message_validator/tests/data/GerritMessageValidator/multiple_change_id.out
similarity index 81%
copy from commit_message_validator/tests/data/invalid_change_id.out
copy to 
commit_message_validator/tests/data/GerritMessageValidator/multiple_change_id.out
index f6e563b..dd4f9f3 100644
--- a/commit_message_validator/tests/data/invalid_change_id.out
+++ 
b/commit_message_validator/tests/data/GerritMessageValidator/multiple_change_id.out
@@ -1,4 +1,5 @@
 commit-message-validator v%version%
+Using GerritMessageValidator to check the commit message
 The following errors were found:
 Line 3: Change-Id: value must be a single Gerrit change id
 Please review <https://www.mediawiki.org/wiki/Gerrit/Commit_message_guidelines>
diff --git a/commit_message_validator/tests/data/note-in-message_ok.msg 
b/commit_message_validator/tests/data/GerritMessageValidator/note-in-message_ok.msg
similarity index 100%
rename from commit_message_validator/tests/data/note-in-message_ok.msg
rename to 
commit_message_validator/tests/data/GerritMessageValidator/note-in-message_ok.msg
diff --git a/commit_message_validator/tests/data/note-in-message_ok.out 
b/commit_message_validator/tests/data/GerritMessageValidator/note-in-message_ok.out
similarity index 100%
rename from commit_message_validator/tests/data/note-in-message_ok.out
rename to 
commit_message_validator/tests/data/GerritMessageValidator/note-in-message_ok.out
diff --git a/commit_message_validator/tests/data/really_long_url_ok.msg 
b/commit_message_validator/tests/data/GerritMessageValidator/really_long_url_ok.msg
similarity index 100%
rename from commit_message_validator/tests/data/really_long_url_ok.msg
rename to 
commit_message_validator/tests/data/GerritMessageValidator/really_long_url_ok.msg
diff --git a/commit_message_validator/tests/data/really_long_url_ok.out 
b/commit_message_validator/tests/data/GerritMessageValidator/really_long_url_ok.out
similarity index 100%
rename from commit_message_validator/tests/data/really_long_url_ok.out
rename to 
commit_message_validator/tests/data/GerritMessageValidator/really_long_url_ok.out
diff --git a/commit_message_validator/tests/data/short_one_line.msg 
b/commit_message_validator/tests/data/GerritMessageValidator/short_one_line.msg
similarity index 100%
rename from commit_message_validator/tests/data/short_one_line.msg
rename to 
commit_message_validator/tests/data/GerritMessageValidator/short_one_line.msg
diff --git a/commit_message_validator/tests/data/short_one_line.out 
b/commit_message_validator/tests/data/GerritMessageValidator/short_one_line.out
similarity index 81%
rename from commit_message_validator/tests/data/short_one_line.out
rename to 
commit_message_validator/tests/data/GerritMessageValidator/short_one_line.out
index 9892d53..ce34f3e 100644
--- a/commit_message_validator/tests/data/short_one_line.out
+++ 
b/commit_message_validator/tests/data/GerritMessageValidator/short_one_line.out
@@ -1,4 +1,5 @@
 commit-message-validator v%version%
+Using GerritMessageValidator to check the commit message
 The following errors were found:
 Line 1: Expected at least 3 lines
 Line 1: Expected Change-Id
diff --git a/commit_message_validator/tests/data/short_two_lines.msg 
b/commit_message_validator/tests/data/GerritMessageValidator/short_two_lines.msg
similarity index 100%
rename from commit_message_validator/tests/data/short_two_lines.msg
rename to 
commit_message_validator/tests/data/GerritMessageValidator/short_two_lines.msg
diff --git a/commit_message_validator/tests/data/short_two_lines.out 
b/commit_message_validator/tests/data/GerritMessageValidator/short_two_lines.out
similarity index 84%
rename from commit_message_validator/tests/data/short_two_lines.out
rename to 
commit_message_validator/tests/data/GerritMessageValidator/short_two_lines.out
index 87935fd..214a360 100644
--- a/commit_message_validator/tests/data/short_two_lines.out
+++ 
b/commit_message_validator/tests/data/GerritMessageValidator/short_two_lines.out
@@ -1,4 +1,5 @@
 commit-message-validator v%version%
+Using GerritMessageValidator to check the commit message
 The following errors were found:
 Line 2: Second line should be empty
 Line 2: Expected 'Change-Id:' to be in footer
diff --git a/commit_message_validator/tests/data/signed-off-by_ok.msg 
b/commit_message_validator/tests/data/GerritMessageValidator/signed-off-by_ok.msg
similarity index 100%
rename from commit_message_validator/tests/data/signed-off-by_ok.msg
rename to 
commit_message_validator/tests/data/GerritMessageValidator/signed-off-by_ok.msg
diff --git a/commit_message_validator/tests/data/signed-off-by_ok.out 
b/commit_message_validator/tests/data/GerritMessageValidator/signed-off-by_ok.out
similarity index 100%
rename from commit_message_validator/tests/data/signed-off-by_ok.out
rename to 
commit_message_validator/tests/data/GerritMessageValidator/signed-off-by_ok.out
diff --git a/commit_message_validator/tests/data/success 
b/commit_message_validator/tests/data/GerritMessageValidator/success
similarity index 63%
rename from commit_message_validator/tests/data/success
rename to commit_message_validator/tests/data/GerritMessageValidator/success
index 76dfe33..82feb75 100644
--- a/commit_message_validator/tests/data/success
+++ b/commit_message_validator/tests/data/GerritMessageValidator/success
@@ -1,2 +1,3 @@
 commit-message-validator v%version%
+Using GerritMessageValidator to check the commit message
 Commit message is formatted properly! Keep up the good work!
diff --git a/commit_message_validator/tests/data/tag-like-in-message_ok.msg 
b/commit_message_validator/tests/data/GerritMessageValidator/tag-like-in-message_ok.msg
similarity index 100%
rename from commit_message_validator/tests/data/tag-like-in-message_ok.msg
rename to 
commit_message_validator/tests/data/GerritMessageValidator/tag-like-in-message_ok.msg
diff --git a/commit_message_validator/tests/data/tag-like-in-message_ok.out 
b/commit_message_validator/tests/data/GerritMessageValidator/tag-like-in-message_ok.out
similarity index 100%
rename from commit_message_validator/tests/data/tag-like-in-message_ok.out
rename to 
commit_message_validator/tests/data/GerritMessageValidator/tag-like-in-message_ok.out
diff --git a/commit_message_validator/tests/data/unexpected_line_in_footers.msg 
b/commit_message_validator/tests/data/GerritMessageValidator/unexpected_line_in_footers.msg
similarity index 100%
rename from commit_message_validator/tests/data/unexpected_line_in_footers.msg
rename to 
commit_message_validator/tests/data/GerritMessageValidator/unexpected_line_in_footers.msg
diff --git a/commit_message_validator/tests/data/unexpected_line_in_footers.out 
b/commit_message_validator/tests/data/GerritMessageValidator/unexpected_line_in_footers.out
similarity index 79%
rename from commit_message_validator/tests/data/unexpected_line_in_footers.out
rename to 
commit_message_validator/tests/data/GerritMessageValidator/unexpected_line_in_footers.out
index 60f94c3..dc2ed84 100644
--- a/commit_message_validator/tests/data/unexpected_line_in_footers.out
+++ 
b/commit_message_validator/tests/data/GerritMessageValidator/unexpected_line_in_footers.out
@@ -1,4 +1,5 @@
 commit-message-validator v%version%
+Using GerritMessageValidator to check the commit message
 The following errors were found:
 Line 6: Unexpected line in footers
 Please review <https://www.mediawiki.org/wiki/Gerrit/Commit_message_guidelines>
diff --git 
a/commit_message_validator/tests/data/GitHubMessageValidator/check_bug_in_header.msg
 
b/commit_message_validator/tests/data/GitHubMessageValidator/check_bug_in_header.msg
new file mode 100644
index 0000000..5d888de
--- /dev/null
+++ 
b/commit_message_validator/tests/data/GitHubMessageValidator/check_bug_in_header.msg
@@ -0,0 +1,3 @@
+Fix bug #12344
+
+This test should fail since bug is defined
diff --git 
a/commit_message_validator/tests/data/GitHubMessageValidator/check_bug_in_header.out
 
b/commit_message_validator/tests/data/GitHubMessageValidator/check_bug_in_header.out
new file mode 100644
index 0000000..8695c70
--- /dev/null
+++ 
b/commit_message_validator/tests/data/GitHubMessageValidator/check_bug_in_header.out
@@ -0,0 +1,4 @@
+commit-message-validator v%version%
+Using GitHubMessageValidator to check the commit message
+The following errors were found:
+Line 1: Do not define bug in the header
diff --git 
a/commit_message_validator/tests/data/GitHubMessageValidator/check_github_close_keyword_another_repository.msg
 
b/commit_message_validator/tests/data/GitHubMessageValidator/check_github_close_keyword_another_repository.msg
new file mode 100644
index 0000000..9d07fbd
--- /dev/null
+++ 
b/commit_message_validator/tests/data/GitHubMessageValidator/check_github_close_keyword_another_repository.msg
@@ -0,0 +1,3 @@
+Test close keywords for another repository
+
+Close refeed/testrepo#123
diff --git 
a/commit_message_validator/tests/data/GitHubMessageValidator/check_github_close_keyword_another_repository.out
 
b/commit_message_validator/tests/data/GitHubMessageValidator/check_github_close_keyword_another_repository.out
new file mode 120000
index 0000000..0e8ca28
--- /dev/null
+++ 
b/commit_message_validator/tests/data/GitHubMessageValidator/check_github_close_keyword_another_repository.out
@@ -0,0 +1 @@
+github_close_keyword_error.out
\ No newline at end of file
diff --git 
a/commit_message_validator/tests/data/GitHubMessageValidator/check_github_closed_keyword_another_repository.msg
 
b/commit_message_validator/tests/data/GitHubMessageValidator/check_github_closed_keyword_another_repository.msg
new file mode 100644
index 0000000..0e588b3
--- /dev/null
+++ 
b/commit_message_validator/tests/data/GitHubMessageValidator/check_github_closed_keyword_another_repository.msg
@@ -0,0 +1,3 @@
+Test close keywords for another repository
+
+Closed refeed/testrepo#123
diff --git 
a/commit_message_validator/tests/data/GitHubMessageValidator/check_github_closed_keyword_another_repository.out
 
b/commit_message_validator/tests/data/GitHubMessageValidator/check_github_closed_keyword_another_repository.out
new file mode 120000
index 0000000..0e8ca28
--- /dev/null
+++ 
b/commit_message_validator/tests/data/GitHubMessageValidator/check_github_closed_keyword_another_repository.out
@@ -0,0 +1 @@
+github_close_keyword_error.out
\ No newline at end of file
diff --git 
a/commit_message_validator/tests/data/GitHubMessageValidator/check_github_closes_keyword_another_repository.msg
 
b/commit_message_validator/tests/data/GitHubMessageValidator/check_github_closes_keyword_another_repository.msg
new file mode 100644
index 0000000..199deef
--- /dev/null
+++ 
b/commit_message_validator/tests/data/GitHubMessageValidator/check_github_closes_keyword_another_repository.msg
@@ -0,0 +1,3 @@
+Test closes keywords for another repository
+
+Closes refeed/testrepo#123
diff --git 
a/commit_message_validator/tests/data/GitHubMessageValidator/check_github_closes_keyword_another_repository.out
 
b/commit_message_validator/tests/data/GitHubMessageValidator/check_github_closes_keyword_another_repository.out
new file mode 120000
index 0000000..0e8ca28
--- /dev/null
+++ 
b/commit_message_validator/tests/data/GitHubMessageValidator/check_github_closes_keyword_another_repository.out
@@ -0,0 +1 @@
+github_close_keyword_error.out
\ No newline at end of file
diff --git 
a/commit_message_validator/tests/data/GitHubMessageValidator/check_github_fix_keyword_another_repository.msg
 
b/commit_message_validator/tests/data/GitHubMessageValidator/check_github_fix_keyword_another_repository.msg
new file mode 100644
index 0000000..df3299e
--- /dev/null
+++ 
b/commit_message_validator/tests/data/GitHubMessageValidator/check_github_fix_keyword_another_repository.msg
@@ -0,0 +1,3 @@
+Test close keywords for another repository
+
+Fix refeed/testrepo#123
diff --git 
a/commit_message_validator/tests/data/GitHubMessageValidator/check_github_fix_keyword_another_repository.out
 
b/commit_message_validator/tests/data/GitHubMessageValidator/check_github_fix_keyword_another_repository.out
new file mode 120000
index 0000000..0e8ca28
--- /dev/null
+++ 
b/commit_message_validator/tests/data/GitHubMessageValidator/check_github_fix_keyword_another_repository.out
@@ -0,0 +1 @@
+github_close_keyword_error.out
\ No newline at end of file
diff --git 
a/commit_message_validator/tests/data/GitHubMessageValidator/check_github_fixed_keyword_another_repository.msg
 
b/commit_message_validator/tests/data/GitHubMessageValidator/check_github_fixed_keyword_another_repository.msg
new file mode 100644
index 0000000..edfbc07
--- /dev/null
+++ 
b/commit_message_validator/tests/data/GitHubMessageValidator/check_github_fixed_keyword_another_repository.msg
@@ -0,0 +1,3 @@
+Test close keywords for another repository
+
+Fixed refeed/testrepo#123
diff --git 
a/commit_message_validator/tests/data/GitHubMessageValidator/check_github_fixed_keyword_another_repository.out
 
b/commit_message_validator/tests/data/GitHubMessageValidator/check_github_fixed_keyword_another_repository.out
new file mode 120000
index 0000000..0e8ca28
--- /dev/null
+++ 
b/commit_message_validator/tests/data/GitHubMessageValidator/check_github_fixed_keyword_another_repository.out
@@ -0,0 +1 @@
+github_close_keyword_error.out
\ No newline at end of file
diff --git 
a/commit_message_validator/tests/data/GitHubMessageValidator/check_github_fixes_keyword_another_repository.msg
 
b/commit_message_validator/tests/data/GitHubMessageValidator/check_github_fixes_keyword_another_repository.msg
new file mode 100644
index 0000000..93be210
--- /dev/null
+++ 
b/commit_message_validator/tests/data/GitHubMessageValidator/check_github_fixes_keyword_another_repository.msg
@@ -0,0 +1,3 @@
+Test close keywords for another repository
+
+Fixes refeed/testrepo#123
diff --git 
a/commit_message_validator/tests/data/GitHubMessageValidator/check_github_fixes_keyword_another_repository.out
 
b/commit_message_validator/tests/data/GitHubMessageValidator/check_github_fixes_keyword_another_repository.out
new file mode 120000
index 0000000..0e8ca28
--- /dev/null
+++ 
b/commit_message_validator/tests/data/GitHubMessageValidator/check_github_fixes_keyword_another_repository.out
@@ -0,0 +1 @@
+github_close_keyword_error.out
\ No newline at end of file
diff --git 
a/commit_message_validator/tests/data/GitHubMessageValidator/check_github_resolve_keyword_another_repository.msg
 
b/commit_message_validator/tests/data/GitHubMessageValidator/check_github_resolve_keyword_another_repository.msg
new file mode 100644
index 0000000..b2fe2cf
--- /dev/null
+++ 
b/commit_message_validator/tests/data/GitHubMessageValidator/check_github_resolve_keyword_another_repository.msg
@@ -0,0 +1,3 @@
+Test closes keywords for another repository
+
+Resolve refeed/testrepo#123
diff --git 
a/commit_message_validator/tests/data/GitHubMessageValidator/check_github_resolve_keyword_another_repository.out
 
b/commit_message_validator/tests/data/GitHubMessageValidator/check_github_resolve_keyword_another_repository.out
new file mode 120000
index 0000000..0e8ca28
--- /dev/null
+++ 
b/commit_message_validator/tests/data/GitHubMessageValidator/check_github_resolve_keyword_another_repository.out
@@ -0,0 +1 @@
+github_close_keyword_error.out
\ No newline at end of file
diff --git 
a/commit_message_validator/tests/data/GitHubMessageValidator/check_github_resolved_keyword_another_repository.msg
 
b/commit_message_validator/tests/data/GitHubMessageValidator/check_github_resolved_keyword_another_repository.msg
new file mode 100644
index 0000000..04e6751
--- /dev/null
+++ 
b/commit_message_validator/tests/data/GitHubMessageValidator/check_github_resolved_keyword_another_repository.msg
@@ -0,0 +1,3 @@
+Test close keywords for another repository
+
+Resolved refeed/testrepo#123
diff --git 
a/commit_message_validator/tests/data/GitHubMessageValidator/check_github_resolved_keyword_another_repository.out
 
b/commit_message_validator/tests/data/GitHubMessageValidator/check_github_resolved_keyword_another_repository.out
new file mode 120000
index 0000000..0e8ca28
--- /dev/null
+++ 
b/commit_message_validator/tests/data/GitHubMessageValidator/check_github_resolved_keyword_another_repository.out
@@ -0,0 +1 @@
+github_close_keyword_error.out
\ No newline at end of file
diff --git 
a/commit_message_validator/tests/data/GitHubMessageValidator/check_github_resolves_keyword_another_repository.msg
 
b/commit_message_validator/tests/data/GitHubMessageValidator/check_github_resolves_keyword_another_repository.msg
new file mode 100644
index 0000000..7bb8992
--- /dev/null
+++ 
b/commit_message_validator/tests/data/GitHubMessageValidator/check_github_resolves_keyword_another_repository.msg
@@ -0,0 +1,3 @@
+Test close keywords for another repository
+
+Resolves refeed/testrepo#123
diff --git 
a/commit_message_validator/tests/data/GitHubMessageValidator/check_github_resolves_keyword_another_repository.out
 
b/commit_message_validator/tests/data/GitHubMessageValidator/check_github_resolves_keyword_another_repository.out
new file mode 120000
index 0000000..0e8ca28
--- /dev/null
+++ 
b/commit_message_validator/tests/data/GitHubMessageValidator/check_github_resolves_keyword_another_repository.out
@@ -0,0 +1 @@
+github_close_keyword_error.out
\ No newline at end of file
diff --git 
a/commit_message_validator/tests/data/GitHubMessageValidator/github_close_keyword_error.out
 
b/commit_message_validator/tests/data/GitHubMessageValidator/github_close_keyword_error.out
new file mode 100644
index 0000000..4d2500b
--- /dev/null
+++ 
b/commit_message_validator/tests/data/GitHubMessageValidator/github_close_keyword_error.out
@@ -0,0 +1,4 @@
+commit-message-validator v%version%
+Using GitHubMessageValidator to check the commit message
+The following errors were found:
+Line 3: Do not write "closing issue keywords" for closing an issue that is in 
another repository
diff --git 
a/commit_message_validator/tests/data/GitHubMessageValidator/good_commit_ok.msg 
b/commit_message_validator/tests/data/GitHubMessageValidator/good_commit_ok.msg
new file mode 100644
index 0000000..822997e
--- /dev/null
+++ 
b/commit_message_validator/tests/data/GitHubMessageValidator/good_commit_ok.msg
@@ -0,0 +1,3 @@
+Replace thisFunction() with thatFunction()
+
+This is a good commit subject.
diff --git a/commit_message_validator/tests/data/success 
b/commit_message_validator/tests/data/GitHubMessageValidator/good_commit_ok.out
similarity index 62%
copy from commit_message_validator/tests/data/success
copy to 
commit_message_validator/tests/data/GitHubMessageValidator/good_commit_ok.out
index 76dfe33..2df974f 100644
--- a/commit_message_validator/tests/data/success
+++ 
b/commit_message_validator/tests/data/GitHubMessageValidator/good_commit_ok.out
@@ -1,2 +1,3 @@
 commit-message-validator v%version%
+Using GitHubMessageValidator to check the commit message
 Commit message is formatted properly! Keep up the good work!
diff --git a/commit_message_validator/tests/data/multiple_change_id.out 
b/commit_message_validator/tests/data/multiple_change_id.out
deleted file mode 100644
index f6e563b..0000000
--- a/commit_message_validator/tests/data/multiple_change_id.out
+++ /dev/null
@@ -1,5 +0,0 @@
-commit-message-validator v%version%
-The following errors were found:
-Line 3: Change-Id: value must be a single Gerrit change id
-Please review <https://www.mediawiki.org/wiki/Gerrit/Commit_message_guidelines>
-and update your commit message accordingly
diff --git a/commit_message_validator/tests/test_commit-message-validator.py 
b/commit_message_validator/tests/test_commit-message-validator.py
index 4ae9744..892cf7e 100644
--- a/commit_message_validator/tests/test_commit-message-validator.py
+++ b/commit_message_validator/tests/test_commit-message-validator.py
@@ -7,10 +7,23 @@
 
 import commit_message_validator as cmv
 
+from commit_message_validator.validators.GerritMessageValidator import (
+    GerritMessageValidator
+)
+from commit_message_validator.validators.GitHubMessageValidator import (
+    GitHubMessageValidator
+)
+
 if sys.version_info[0] > 2:
     from io import StringIO
 else:
     from StringIO import StringIO
+
+
+MESSAGE_VALIDATOR_MAP = {
+    'GerritMessageValidator': GerritMessageValidator,
+    'GitHubMessageValidator': GitHubMessageValidator,
+}
 
 
 class MetaValidator(type):
@@ -26,14 +39,17 @@
     """
 
     def __new__(cls, name, bases, dct):
-        def create_test_method(msg, expected, expected_exit_code):
+        def create_test_method(msg, expected, expected_exit_code,
+                               message_validator_name):
             def test(self):
                 saved_stdout = sys.stdout
                 self.maxDiff = None
                 try:
                     out = StringIO()
                     sys.stdout = out
-                    exit_code = cmv.check_message(msg.splitlines())
+                    exit_code = cmv.check_message(
+                        msg.splitlines(),
+                        MESSAGE_VALIDATOR_MAP[message_validator_name])
                     # For some unknown reason, assertEqual isn't always
                     # choosing the multiline method for the actual assertion.
                     self.assertMultiLineEqual(expected, out.getvalue())
@@ -44,17 +60,22 @@
 
         base_path = os.path.join(
             os.path.dirname(__file__), 'data')
-        for fn in os.listdir(base_path):
-            test, _, extension = fn.rpartition('.')
-            fn = os.path.join(base_path, test)
-            if extension == 'msg' and os.path.isfile(fn + '.out'):
-                exit_code = 0 if fn.endswith('ok') else 1
-                with open(fn + '.msg') as msg:
-                    with open(fn + '.out') as out:
-                        out_text = out.read().replace(
-                            '%version%', cmv.__version__)
-                        dct['test_' + test] = create_test_method(
-                            msg.read(), out_text, exit_code)
+        for message_validator_name in os.listdir(base_path):
+            specific_message_validator_test_path = os.path.join(
+                base_path, message_validator_name)
+
+            for fn in os.listdir(specific_message_validator_test_path):
+                test, _, extension = fn.rpartition('.')
+                fn = os.path.join(specific_message_validator_test_path, test)
+                if extension == 'msg' and os.path.isfile(fn + '.out'):
+                    exit_code = 0 if fn.endswith('ok') else 1
+                    with open(fn + '.msg') as msg:
+                        with open(fn + '.out') as out:
+                            out_text = out.read().replace(
+                                '%version%', cmv.__version__)
+                            dct['test_' + test] = create_test_method(
+                                msg.read(), out_text, exit_code,
+                                message_validator_name)
         return super(MetaValidator, cls).__new__(cls, name, bases, dct)
 
 
diff --git a/commit_message_validator/validators/GitHubMessageValidator.py 
b/commit_message_validator/validators/GitHubMessageValidator.py
new file mode 100644
index 0000000..11bda11
--- /dev/null
+++ b/commit_message_validator/validators/GitHubMessageValidator.py
@@ -0,0 +1,38 @@
+import re
+
+from commit_message_validator.validators.GlobalMessageValidator import (
+    GlobalMessageValidator)
+
+RE_GITHUB_ISSUE_NUMBER = re.compile(r'#\d+')
+RE_GITHUB_CLOSE_ISSUE_IN_DIFFERENT_REPO = re.compile(
+    r'^(?:close[sd]?|fix(?:e[sd])?|resolve[sd]?)\s+\S+/\S+#\d+',
+    re.IGNORECASE
+)
+
+
+class GitHubMessageValidator(GlobalMessageValidator):
+    """
+    An iterator to validate GitHub remote repo commit message.
+
+    Checks:
+    - First line <=80 characters
+    - Second line blank
+    - No line >100 characters (unless it is only a URL)
+    - Issue should not be defined in the header
+    - "Closing issue keywords" for closing an issue that is in another
+    repository shouldn't be exist.
+    """
+
+    def check_line(self, lineno):
+        for error in super(GitHubMessageValidator, self).check_line(lineno):
+            yield error
+
+        line = self._lines[lineno]
+
+        if lineno == 0 and RE_GITHUB_ISSUE_NUMBER.findall(line):
+            yield "Do not define bug in the header"
+
+        if RE_GITHUB_CLOSE_ISSUE_IN_DIFFERENT_REPO.match(line):
+            yield (
+                'Do not write "closing issue keywords" for closing an issue '
+                'that is in another repository')

-- 
To view, visit https://gerrit.wikimedia.org/r/404156
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I990c6d7ac313292e929b1c1aba2e6b9e19fb3e7d
Gerrit-PatchSet: 13
Gerrit-Project: integration/commit-message-validator
Gerrit-Branch: master
Gerrit-Owner: Rafidaslam <rafidt...@gmail.com>
Gerrit-Reviewer: Hashar <has...@free.fr>
Gerrit-Reviewer: John Vandenberg <jay...@gmail.com>
Gerrit-Reviewer: Legoktm <lego...@member.fsf.org>
Gerrit-Reviewer: Paladox <thomasmulhall...@yahoo.com>
Gerrit-Reviewer: Rafidaslam <rafidt...@gmail.com>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to