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.
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
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"))
+