Add RefsContainer.read_ref.
authorJelmer Vernooij <jelmer@samba.org>
Fri, 2 Apr 2010 01:57:11 +0000 (03:57 +0200)
committerJelmer Vernooij <jelmer@samba.org>
Fri, 2 Apr 2010 01:57:11 +0000 (03:57 +0200)
dulwich/repo.py
dulwich/tests/test_repository.py

index 04a8923ad241301e59a32790dbac19b699a7c765..3442bcd751450b3af1d51caeb24649118a915a0a 100644 (file)
@@ -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
 
index 64ddd5afea5f9c624eec90a8d9400a934ae93b33..f9bbdfdefb8058237a7973792f149ed687cdc604 100644 (file)
@@ -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"))
+