From b40ed1c2bbff27cb16e95c4a1d22381e67509e44 Mon Sep 17 00:00:00 2001 From: Richard Maw Date: Tue, 29 Jan 2013 17:55:47 +0000 Subject: RepoAliasResolver: Add aliases_from_url method This returns a sorted list of possible aliases for a url. --- morphlib/repoaliasresolver.py | 24 +++++++++++++++++++++++ morphlib/repoaliasresolver_tests.py | 39 +++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/morphlib/repoaliasresolver.py b/morphlib/repoaliasresolver.py index b5da524a..653eba90 100644 --- a/morphlib/repoaliasresolver.py +++ b/morphlib/repoaliasresolver.py @@ -26,6 +26,19 @@ class RepoAlias(object): self.pullpat = pullpat self.pushpat = pushpat + def _pattern_to_regex(self, pattern): + if '%s' in pattern: + return r'(?P.+)'.join(map(re.escape, pattern.split('%s'))) + else: + return re.escape(pattern) + r'(?P.+)' + + def match_url(self, url): + '''Given a URL, return what its alias would be if it matches''' + for pat in (self.pullpat, self.pushpat): + m = re.match(self._pattern_to_regex(pat), url) + if m: + return '%s:%s' % (self.prefix, m.group('path')) + return None class RepoAliasResolver(object): @@ -55,6 +68,17 @@ class RepoAliasResolver(object): '''Expand a possibly shortened repo name to a push url.''' return self._expand_reponame(reponame, 'pushpat') + def aliases_from_url(self, url): + '''Find aliases the url could have expanded from. + + Returns an ascii-betically sorted list. + ''' + potential_matches = (repo_alias.match_url(url) + for repo_alias in self.aliases.itervalues()) + known_aliases = (url_alias for url_alias in potential_matches + if url_alias is not None) + return sorted(known_aliases) + def _expand_reponame(self, reponame, patname): logging.debug('expanding: reponame=%s' % reponame) logging.debug('expanding: patname=%s' % patname) diff --git a/morphlib/repoaliasresolver_tests.py b/morphlib/repoaliasresolver_tests.py index 04b9e695..21724a35 100644 --- a/morphlib/repoaliasresolver_tests.py +++ b/morphlib/repoaliasresolver_tests.py @@ -88,3 +88,42 @@ class RepoAliasResolverTests(unittest.TestCase): ]) self.assertEqual(resolver.pull_url('malformed:foo'), 'malformed:foo') self.assertEqual(resolver.push_url('malformed:foo'), 'malformed:foo') + + def test_gets_aliases_from_interpolated_patterns(self): + self.assertEqual( + self.resolver.aliases_from_url('git://gitorious.org/baserock/foo'), + ['baserock:foo']) + self.assertEqual( + self.resolver.aliases_from_url( + 'git@gitorious.org:baserock/foo.git'), + ['baserock:foo']) + self.assertEqual( + self.resolver.aliases_from_url( + 'git://gitorious.org/baserock-morphs/bar'), + ['upstream:bar']) + self.assertEqual( + self.resolver.aliases_from_url( + 'git@gitorious.org:baserock-morphs/bar.git'), + ['upstream:bar']) + + def test_gets_aliases_from_append_pattern(self): + self.assertEqual( + ['append:foo'], self.resolver.aliases_from_url('git://append/foo')) + self.assertEqual( + ['append:foo'], self.resolver.aliases_from_url('git@append/foo')) + + self.assertEqual( + ['append:bar'], self.resolver.aliases_from_url('git://append/bar')) + self.assertEqual( + ['append:bar'], self.resolver.aliases_from_url('git@append/bar')) + + def test_handles_multiple_possible_aliases(self): + resolver = morphlib.repoaliasresolver.RepoAliasResolver([ + 'trove=git://git.baserock.org/#ssh://git@git.baserock.org/', + 'baserock=git://git.baserock.org/baserock/' + '#ssh://git@git.baserock.org/baserock/', + ]) + self.assertEqual( + ['baserock:baserock/morphs', 'trove:baserock/baserock/morphs'], + resolver.aliases_from_url( + 'git://git.baserock.org/baserock/baserock/morphs')) -- cgit v1.2.1