From de50cec19b4f7e4c5a6da5ecc5cddd7a52ac3725 Mon Sep 17 00:00:00 2001 From: Sam Thursfield Date: Thu, 13 Dec 2012 12:36:07 +0000 Subject: Always use `git rev-parse --verify` to resolve refs Previously some code used `git show-ref`, which is wrong -- given two refs named 'alpha/master' and 'master', `git show-ref master` will return both, sorted alphabetically. This can lead to build failures, etc. due to refs resolving to the wrong SHAs. We should also use `git rev-parse --verify` to verify SHA1s, which we previously did with `git rev-list`. Finally, `git rev-parse --verify` is more than twice as fast as `git show-ref`. --- morphlib/cachedrepo.py | 29 +++++++++-------------------- 1 file changed, 9 insertions(+), 20 deletions(-) (limited to 'morphlib/cachedrepo.py') diff --git a/morphlib/cachedrepo.py b/morphlib/cachedrepo.py index 0b5ce60f..312f580f 100644 --- a/morphlib/cachedrepo.py +++ b/morphlib/cachedrepo.py @@ -112,18 +112,10 @@ class CachedRepo(object): ''' - if not morphlib.git.is_valid_sha1(ref): - try: - refs = self._show_ref(ref).split('\n') - refs = [x.split() for x in refs] - absref = refs[0][0] - except cliapp.AppException: - raise InvalidReferenceError(self, ref) - else: - try: - absref = self._rev_list(ref).strip() - except cliapp.AppException: - raise InvalidReferenceError(self, ref) + try: + absref = self._rev_parse(ref) + except cliapp.AppException: + raise InvalidReferenceError(self, ref) tree = self._show_tree_hash(absref) return absref, tree @@ -141,7 +133,7 @@ class CachedRepo(object): if not morphlib.git.is_valid_sha1(ref): raise UnresolvedNamedReferenceError(self, ref) try: - sha1 = self._rev_list(ref).strip() + sha1 = self._rev_parse(ref) except cliapp.AppException: raise InvalidReferenceError(self, ref) @@ -193,7 +185,7 @@ class CachedRepo(object): '''Loads a morphology from a given ref''' if not morphlib.git.is_valid_sha1(ref): - ref = self._rev_list(ref).strip() + ref = self._rev_parse(ref) text = self.cat(ref, '%s.morph' % name) morphology = morphlib.morph2.Morphology(text) return morphology @@ -210,7 +202,7 @@ class CachedRepo(object): if not morphlib.git.is_valid_sha1(ref): raise UnresolvedNamedReferenceError(self, ref) try: - sha1 = self._rev_list(ref).strip() + sha1 = self._rev_parse(ref) except cliapp.AppException: raise InvalidReferenceError(self, ref) @@ -237,16 +229,13 @@ class CachedRepo(object): kwargs['cwd'] = self.path return self.app.runcmd(*args, **kwargs) - def _show_ref(self, ref): # pragma: no cover - return self._runcmd(['git', 'show-ref', ref]) + def _rev_parse(self, ref): # pragma: no cover + return self._runcmd(['git', 'rev-parse', '--verify', ref])[0:40] def _show_tree_hash(self, absref): # pragma: no cover return self._runcmd( ['git', 'log', '-1', '--format=format:%T', absref]).strip() - def _rev_list(self, ref): # pragma: no cover - return self._runcmd(['git', 'rev-list', '--no-walk', ref]) - def _ls_tree(self, ref): # pragma: no cover result = self._runcmd(['git', 'ls-tree', '--name-only', ref]) return result.split('\n') -- cgit v1.2.1