From 2cbbc17c16679265f56eb3af57bafa66fcb19dc7 Mon Sep 17 00:00:00 2001 From: Ryan Beisner Date: Fri, 4 Oct 2019 10:06:28 -0500 Subject: [PATCH] Add opendev.org https and git fetcher Related to #552 https://bugs.launchpad.net/charm-barbican/+bug/1846263 --- charmtools/fetchers.py | 16 +++++++++ tests/test_fetchers.py | 77 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+) diff --git a/charmtools/fetchers.py b/charmtools/fetchers.py index 5050b29d..a5b2a64c 100644 --- a/charmtools/fetchers.py +++ b/charmtools/fetchers.py @@ -195,6 +195,21 @@ def fetch(self, dir_): return rename(dir_) +class OpendevFetcher(Fetcher): + MATCH = re.compile(r""" + ^(https:\/\/(www\.)?opendev\.org\/|git@opendev.org:) + (?P[^@]*)(@(?P.*))?$ + """, re.VERBOSE) + + def fetch(self, dir_): + dir_ = tempfile.mkdtemp(dir=dir_) + url = 'https://opendev.org/' + self.repo + git('clone {} {}'.format(url, dir_)) + if self.revision: + git('checkout {}'.format(self.revision), cwd=dir_) + return rename(dir_) + + class GitFetcher(Fetcher): """Generic git fetcher. @@ -358,6 +373,7 @@ def check_output(cmd, **kw): BzrFetcher, BzrMergeProposalFetcher, GithubFetcher, + OpendevFetcher, BitbucketFetcher, LocalFetcher, CharmstoreDownloader, diff --git a/tests/test_fetchers.py b/tests/test_fetchers.py index 47d79002..712b7dec 100644 --- a/tests/test_fetchers.py +++ b/tests/test_fetchers.py @@ -7,6 +7,7 @@ BzrFetcher, BzrMergeProposalFetcher, GithubFetcher, + OpendevFetcher, GitFetcher, BitbucketFetcher, LocalFetcher, @@ -132,6 +133,82 @@ def test_can_fetch(self): self.assertEqual(test, {}) +class OpendevFetcherGenericTest(unittest.TestCase): + def test_can_fetch(self): + f = OpendevFetcher.can_fetch + + good_tests = [ + f('https://opendev.org/charms/foo'), + f('https://www.opendev.org/charms/foo'), + f('git@opendev.org:charms/foo'), + ] + + bad_tests = [ + f('http://www.opendev.org/charms/foo'), + f('http://opendev.org/charms/foo'), + f('https://opendev.com/charms/foo'), + f('https://www.opendev.com/charms/foo'), + f('git@opendev.com:charms/foo'), + f('gh:charms/foo'), + f('github:charms/foo'), + f('http://github.com/charms/foo'), + f('https://github.com/charms/foo'), + f('http://www.github.com/charms/foo'), + f('https://www.github.com/charms/foo'), + f('git@github.com:charms/foo'), + f('lp:~openstack-charmers/charms/bionic/foo'), + f('lp:~openstack-charmers/charms/bionic/foo/+merge/12345'), + f('bb:charms/foo'), + f('local:~/src/charms/bionic/foo'), + f('cs:bionic/foo'), + f('bundle:openstack-base/single'), + ] + + for test in good_tests: + self.assertEqual(test['repo'], 'charms/foo') + + for test in bad_tests: + self.assertEqual(test, {}) + + +class OpendevFetcherSpecificTest(unittest.TestCase): + def test_can_fetch(self): + f = OpendevFetcher.can_fetch + + good_tests = [ + f('https://opendev.org/x/charm-interface-barbican-hsm'), + f('https://www.opendev.org/x/charm-interface-barbican-hsm'), + f('git@opendev.org:x/charm-interface-barbican-hsm'), + ] + + bad_tests = [ + f('http://opendev.org/x/charm-interface-barbican-hsm'), + f('http://www.opendev.org/x/charm-interface-barbican-hsm'), + f('https://opendev.com/x/charm-interface-barbican-hsm'), + f('https://www.opendev.com/x/charm-interface-barbican-hsm'), + f('git@opendev.com:x/charm-interface-barbican-hsm'), + f('gh:x/charm-interface-barbican-hsm'), + f('github:x/charm-interface-barbican-hsm'), + f('http://github.com/x/charm-interface-barbican-hsm'), + f('https://github.com/x/charm-interface-barbican-hsm'), + f('http://www.github.com/x/charm-interface-barbican-hsm'), + f('https://www.github.com/x/charm-interface-barbican-hsm'), + f('git@github.com:x/charm-interface-barbican-hsm'), + f('lp:~openstack-charmers/x/charm-interface-barbican-hsm'), + f('lp:~openstack-charmers/x/charm-interface-barbican-hsm/+merge/12345'), + f('bb:x/charm-interface-barbican-hsm'), + f('local:~/src/charms/bionic/x/charm-interface-barbican-hsm'), + f('cs:bionic/x/charm-interface-barbican-hsm'), + f('bundle:openstack-base/x/charm-interface-barbican-hsm'), + ] + + for test in good_tests: + self.assertEqual(test['repo'], 'x/charm-interface-barbican-hsm') + + for test in bad_tests: + self.assertEqual(test, {}) + + class GitFetcherTest(unittest.TestCase): def test_can_fetch(self): f = GitFetcher.can_fetch