diff --git a/bears/vcs/git/GitCommitBear.py b/bears/vcs/git/GitCommitBear.py index 22414ee03d..5fa974b1f7 100644 --- a/bears/vcs/git/GitCommitBear.py +++ b/bears/vcs/git/GitCommitBear.py @@ -34,14 +34,22 @@ class GitCommitBear(GlobalBear): 'issue': r'(?:\w+/\w+)?#(\S+)', 'full issue': r'https?://gitlab\S+/issues/(\S+)', }, + 'bitbucket': { + 'issue': r'#(\S+)', + 'full issue': None, + }, } SUPPORTED_HOST_KEYWORD_REGEX = { - 'github': (r'[Cc]lose[sd]?' + 'github': (r'(?:[Cc]lose[sd]?' r'|[Rr]esolve[sd]?' - r'|[Ff]ix(?:e[sd])?'), - 'gitlab': (r'[Cc]los(?:e[sd]?|ing)' + r'|[Ff]ix(?:e[sd])?)\s+'), + 'gitlab': (r'(?:[Cc]los(?:e[sd]?|ing)' r'|[Rr]esolv(?:e[sd]?|ing)' - r'|[Ff]ix(?:e[sd]|ing)?') + r'|[Ff]ix(?:e[sd]|ing)?)\s+'), + 'bitbucket': (r'(?:(?:[Cc]los(?:e[sd]?|ing)' + r'|[Rr]esolv(?:e[sd]?|ing)' + r'|[Ff]ix(?:e[sd]|ing))' + r'(?:\s+(?:(?:bug|issue|ticket)[ \t]*)?))'), } CONCATENATION_KEYWORDS = [r',', r'\sand\s'] @@ -324,6 +332,11 @@ def check_issue_reference(self, body, else: self.issue_type = 'issue' + if self.ISSUE_INFO[host][self.issue_type] is None: + yield Result(self, 'Host {} does not support {} ' + 'reference.'.format(host, self.issue_type)) + return + if body_close_issue_on_last_line: if body: body = body.splitlines()[-1] @@ -337,7 +350,7 @@ def check_issue_reference(self, body, concat_regex = '|'.join(kw for kw in self.CONCATENATION_KEYWORDS) compiled_joint_regex = re.compile( - r'(?:{0})\s+' # match issue related keywords, + r'(?:{0})' # match issue related keywords, # eg: fix, closes etc. r'((?:\S(?!{1}))*\S' # match links/tags diff --git a/tests/vcs/git/GitCommitBearTest.py b/tests/vcs/git/GitCommitBearTest.py index 87f747cb34..d860147e06 100644 --- a/tests/vcs/git/GitCommitBearTest.py +++ b/tests/vcs/git/GitCommitBearTest.py @@ -298,16 +298,139 @@ def test_check_issue_reference(self): # Adding BitBucket remote for testing self.run_git_command('remote', 'add', 'test', - 'https://bitbucket.com/user/repo.git') + 'https://user@bitbucket.org/user/gittest.git') - # Unsupported Host - Bitbucket + # Unsupported Host and Issue reference combination - Bitbucket self.git_commit('Shortlog\n\n' 'First line, blablablablablabla.\n' 'Another line, blablablablablabla.\n' 'Closes #1112') self.assertEqual(self.run_uut( body_close_issue=True, - body_close_issue_full_url=True), []) + body_close_issue_full_url=True), + ['Host bitbucket does not support full issue ' + 'reference.']) + + self.git_commit('Shortlog\n\n' + 'First line, blablablablablabla.\n' + 'Another line, blablablablablabla.\n' + 'Closes #1112') + self.assertEqual(self.run_uut( + body_close_issue=True), []) + + self.git_commit('Shortlog\n\n' + 'First line, blablablablablabla.\n' + 'Another line, blablablablablabla.\n' + 'Resolves https://bitbucket.org/user/repo/issues/1/') + self.assertEqual(self.run_uut( + body_close_issue=True), + ['Invalid issue reference: ' + 'https://bitbucket.org/user/repo/issues/1/']) + + self.git_commit('Shortlog\n\n' + 'First line, blablablablablabla.\n' + 'Another line, blablablablablabla.\n' + 'Resolves https://bitbucket.org/user/repo/issues/1/') + self.assertEqual(self.run_uut( + body_close_issue=True, + body_close_issue_full_url=True), + ['Host bitbucket does not support full issue ' + 'reference.']) + + # Adding BitBucket's ssh remote for testing + self.run_git_command('remote', 'set-url', 'test', + 'git@bitbucket.org:user/repo.git') + + # Unsupported Host and Issue reference combination - Bitbucket + self.git_commit('Shortlog\n\n' + 'First line, blablablablablabla.\n' + 'Another line, blablablablablabla.\n' + 'Closes #1112') + self.assertEqual(self.run_uut( + body_close_issue=True, + body_close_issue_full_url=True), + ['Host bitbucket does not support full issue ' + 'reference.']) + + self.git_commit('Shortlog\n\n' + 'First line, blablablablablabla.\n' + 'Another line, blablablablablabla.\n' + 'Closes #1112') + self.assertEqual(self.run_uut( + body_close_issue=True), []) + + self.git_commit('Shortlog\n\n' + 'First line, blablablablablabla.\n' + 'Another line, blablablablablabla.\n' + 'Fixes issue #1112') + self.assertEqual(self.run_uut( + body_close_issue=True, + body_enforce_issue_reference=True), []) + + self.git_commit('Shortlog\n\n' + 'First line, blablablablablabla.\n' + 'Another line, blablablablablabla.\n' + 'Resolving bug#1112') + self.assertEqual(self.run_uut( + body_close_issue=True, + body_enforce_issue_reference=True), []) + + self.git_commit('Shortlog\n\n' + 'First line, blablablablablabla.\n' + 'Another line, blablablablablabla.\n' + 'Fixed randomkeyword#1112') + self.assertEqual(self.run_uut( + body_close_issue=True, + body_enforce_issue_reference=True), + ['Invalid issue reference: randomkeyword#1112']) + + self.git_commit('Shortlog\n\n' + 'First line, blablablablablabla.\n' + 'Another line, blablablablablabla.\n' + 'Closes#1112') + self.assertEqual(self.run_uut( + body_close_issue=True, + body_enforce_issue_reference=True), + ['Body of HEAD commit does not contain any ' + 'issue reference.']) + + self.git_commit('Shortlog\n\n' + 'First line, blablablablablabla.\n' + 'Another line, blablablablablabla.\n' + 'Closes bug bug#1112') + self.assertEqual(self.run_uut( + body_close_issue=True, + body_enforce_issue_reference=True), + ['Invalid issue reference: bug#1112']) + + self.git_commit('Shortlog\n\n' + 'First line, blablablablablabla.\n' + 'Another line, blablablablablabla.\n' + 'Closesticket #1112') + self.assertEqual(self.run_uut( + body_close_issue=True, + body_enforce_issue_reference=True), + ['Body of HEAD commit does not contain any ' + 'issue reference.']) + + self.git_commit('Shortlog\n\n' + 'First line, blablablablablabla.\n' + 'Another line, blablablablablabla.\n' + 'Resolves https://bitbucket.org/user/repo/issues/1/') + self.assertEqual(self.run_uut( + body_close_issue=True), + ['Invalid issue reference: ' + 'https://bitbucket.org/user/repo/issues/1/']) + + self.git_commit('Shortlog\n\n' + 'First line, blablablablablabla.\n' + 'Another line, blablablablablabla.\n' + 'Resolves https://bitbucket.org/user/repo/issues/1/') + self.assertEqual(self.run_uut( + body_close_issue=True, + body_close_issue_full_url=True), + ['Host bitbucket does not support full issue ' + 'reference.']) # Adding GitHub remote for testing, ssh way :P self.run_git_command('remote', 'set-url', 'test',