diff --git a/master/buildbot/reporters/bitbucket.py b/master/buildbot/reporters/bitbucket.py index 0e707641762..a1b8f2f4524 100644 --- a/master/buildbot/reporters/bitbucket.py +++ b/master/buildbot/reporters/bitbucket.py @@ -14,6 +14,7 @@ # Copyright Buildbot Team Members import json +from urlparse import urlparse from twisted.internet import defer from twisted.python import log @@ -100,15 +101,19 @@ def get_owner_and_repo(repourl): ssh://git@bitbucket.com/OWNER/REPONAME.git :return: owner, repo: The owner of the repository and the repository name """ - owner = 'repo' - repo = 'repo' - if repourl.startswith('git@'): - tail = repourl.split(':')[-1] - owner = tail.split('/')[-2] - repo = tail.split('/')[-1] - elif repourl.startswith('http') or repourl.startswith('ssh://git@'): - repo = repourl.split('/')[-1] - owner = repourl.split('/')[-2] - if repo is not None and repo.endswith('.git'): - repo = repo[:-4] - return owner, repo + parsed = urlparse(repourl) + + if parsed.scheme: + path = parsed.path[1:] + else: + # we assume git@host:owner/repo.git here + path = parsed.path.split(':', 1)[-1] + + if path.endswith('.git'): + path = path[:-4] + + parts = path.split('/') + + assert len(parts) == 2, 'OWNER/REPONAME is expected' + + return parts diff --git a/master/buildbot/test/unit/test_reporter_bitbucket.py b/master/buildbot/test/unit/test_reporter_bitbucket.py index ab7c8e6f446..d15cfb1ae21 100644 --- a/master/buildbot/test/unit/test_reporter_bitbucket.py +++ b/master/buildbot/test/unit/test_reporter_bitbucket.py @@ -97,3 +97,19 @@ def test_basic(self): 'key': u'Builder0', 'name': u'Builder0'}) ]) + + +class TestBitbucketStatusPushRepoParsing(unittest.TestCase): + def parse(self, repourl): + return tuple(BitbucketStatusPush.get_owner_and_repo(repourl)) + + def test_parse_no_scheme(self): + self.assertEqual(('user', 'repo'), self.parse('git@bitbucket.com:user/repo.git')) + self.assertEqual(('user', 'repo'), self.parse('git@bitbucket.com:user/repo')) + + def test_parse_with_scheme(self): + self.assertEqual(('user', 'repo'), self.parse('https://bitbucket.com/user/repo.git')) + self.assertEqual(('user', 'repo'), self.parse('https://bitbucket.com/user/repo')) + + self.assertEqual(('user', 'repo'), self.parse('ssh://git@bitbucket.com/user/repo.git')) + self.assertEqual(('user', 'repo'), self.parse('ssh://git@bitbucket.com/user/repo'))