summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Maw <richard.maw@codethink.co.uk>2013-01-29 17:55:47 +0000
committerRichard Maw <richard.maw@codethink.co.uk>2013-02-11 14:12:14 +0000
commitb40ed1c2bbff27cb16e95c4a1d22381e67509e44 (patch)
treea7bbe2e6465289140e9469d52dfffcd615db5072
parent8c6c178bbe73c35bee15359b72e0cb816cbd48f9 (diff)
downloadmorph-b40ed1c2bbff27cb16e95c4a1d22381e67509e44.tar.gz
RepoAliasResolver: Add aliases_from_url method
This returns a sorted list of possible aliases for a url.
-rw-r--r--morphlib/repoaliasresolver.py24
-rw-r--r--morphlib/repoaliasresolver_tests.py39
2 files changed, 63 insertions, 0 deletions
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<path>.+)'.join(map(re.escape, pattern.split('%s')))
+ else:
+ return re.escape(pattern) + r'(?P<path>.+)'
+
+ 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'))