From 444af0396ef0d0a738981bd78f0fc4833f29ff9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lubom=C3=ADr=20Sedl=C3=A1=C5=99?= Date: Wed, 21 Nov 2018 10:15:52 +0100 Subject: [PATCH] util: Add a cache for resolved git urls MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Lubomír Sedlář --- pungi/util.py | 16 ++++++++++++++++ tests/test_util.py | 22 ++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/pungi/util.py b/pungi/util.py index b798d323..34469a63 100644 --- a/pungi/util.py +++ b/pungi/util.py @@ -285,6 +285,22 @@ def resolve_git_url(url): return result +class GitUrlResolver(object): + """A wrapper for resolve_git_url that checks each url only once. In offline + mode it does not actually do anything, returning original input urls. + """ + def __init__(self, offline=False): + self.offline = offline + self.cache = {} + + def __call__(self, url): + if self.offline: + return url + if url not in self.cache: + self.cache[url] = resolve_git_url(url) + return self.cache[url] + + # fomat: {arch|*: [data]} def get_arch_data(conf, var_name, arch): result = [] diff --git a/tests/test_util.py b/tests/test_util.py index da240fef..279c69cb 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -112,6 +112,28 @@ class TestGitRefResolver(unittest.TestCase): [mock.call(['git', 'ls-remote', 'https://git.example.com/repo.git', 'HEAD'], universal_newlines=True)] * 2) + @mock.patch("pungi.util.resolve_git_url") + def test_resolver_offline(self, mock_resolve): + resolver = util.GitUrlResolver(offline=True) + self.assertEqual( + resolver("http://example.com/repo.git#HEAD"), + "http://example.com/repo.git#HEAD", + ) + self.assertEqual(mock_resolve.call_args_list, []) + + @mock.patch("pungi.util.resolve_git_url") + def test_resolver_caches_calls(self, mock_resolve): + url1 = "http://example.com/repo.git#HEAD" + url2 = "http://example.com/repo.git#master" + mock_resolve.side_effect = ["1", "2"] + resolver = util.GitUrlResolver() + self.assertEqual(resolver(url1), "1") + self.assertEqual(resolver(url1), "1") + self.assertEqual(resolver(url2), "2") + self.assertEqual(resolver(url1), "1") + self.assertEqual(resolver(url2), "2") + self.assertEqual(mock_resolve.call_args_list, [mock.call(url1), mock.call(url2)]) + class TestGetVariantData(unittest.TestCase): def test_get_simple(self):