From: Jelmer Vernooij Date: Fri, 2 Apr 2010 01:57:11 +0000 (+0200) Subject: Add RefsContainer.read_ref. X-Git-Tag: rc-walker-ack-v5~15 X-Git-Url: http://git.samba.org/samba.git/?p=jelmer%2Fdulwich-libgit2.git;a=commitdiff_plain;h=cc42bf652c527cde2e2ccf96ac11646b83cb3f08;hp=88d5e0982c83d49b36bd86d877b70caf26a89b57 Add RefsContainer.read_ref. --- diff --git a/dulwich/repo.py b/dulwich/repo.py index 04a8923..3442bcd 100644 --- a/dulwich/repo.py +++ b/dulwich/repo.py @@ -200,6 +200,18 @@ class RefsContainer(object): if not name.startswith('refs/') or not check_ref_format(name[5:]): raise KeyError(name) + def read_ref(self, refname): + """Read a reference without following any references. + + :param refname: The name of the reference + :return: The contents of the ref file, or None if it does + not exist. + """ + contents = self.read_loose_ref(refname) + if not contents: + contents = self.get_packed_refs().get(refname, None) + return contents + def read_loose_ref(self, name): """Read a loose reference and return its contents. @@ -220,20 +232,16 @@ class RefsContainer(object): depth = 0 while contents.startswith(SYMREF): refname = contents[len(SYMREF):] - contents = self.read_loose_ref(refname) + contents = self.read_ref(refname) if not contents: - contents = self.get_packed_refs().get(refname, None) - if not contents: - break + break depth += 1 if depth > 5: raise KeyError(name) return refname, contents def __contains__(self, refname): - if self.read_loose_ref(refname): - return True - if self.get_packed_refs().get(refname, None): + if self.read_ref(refname): return True return False diff --git a/dulwich/tests/test_repository.py b/dulwich/tests/test_repository.py index 64ddd5a..f9bbdfd 100644 --- a/dulwich/tests/test_repository.py +++ b/dulwich/tests/test_repository.py @@ -556,3 +556,11 @@ class RefsContainerTests(unittest.TestCase): self._refs.remove_if_equals('refs/tags/refs-0.1', 'df6800012397fb85c56e7418dd4eb9405dee075c')) self.assertRaises(KeyError, lambda: self._refs['refs/tags/refs-0.1']) + + def test_read_ref(self): + self.assertEqual('ref: refs/heads/master', self._refs.read_ref("HEAD")) + self.assertEqual('42d06bd4b77fed026b154d16493e5deab78f02ec', + self._refs.read_ref("refs/heads/packed")) + self.assertEqual(None, + self._refs.read_ref("nonexistant")) +