Ver código fonte

Move follow ref logic to RefsContainer.

Jelmer Vernooij 16 anos atrás
pai
commit
17f9ae653b
1 arquivos alterados com 23 adições e 1 exclusões
  1. 23 1
      dulwich/repo.py

+ 23 - 1
dulwich/repo.py

@@ -49,6 +49,17 @@ REFSDIR_HEADS = 'heads'
 INDEX_FILENAME = "index"
 
 
+def follow_ref(container, name):
+    contents = container[name]
+    if contents.startswith(SYMREF):
+        ref = contents[len(SYMREF):]
+        if ref[-1] == '\n':
+            ref = ref[:-1]
+        return follow_ref(container, ref)
+    assert len(contents) == 40, 'Invalid ref in %s' % name
+    return contents
+
+
 class RefsContainer(object):
 
     def __init__(self, path):
@@ -62,6 +73,17 @@ class RefsContainer(object):
             name = name.replace("/", os.path.sep)
         return os.path.join(self.path, name)
 
+    def follow(self, name):
+        return follow_ref(self, name)
+
+    def __getitem__(self, name):
+        file = self.refpath(name)
+        f = open(file, 'rb')
+        try:
+            return f.read().strip("\n")
+        finally:
+            f.close()
+
     def __setitem__(self, name, ref):
         file = self.refpath(name)
         dirpath = os.path.dirname(file)
@@ -186,7 +208,7 @@ class Repo(object):
                 ref = contents[len(SYMREF):]
                 if ref[-1] == '\n':
                     ref = ref[:-1]
-                return self.ref(ref)
+                return follow_ref(self.refs, ref)
             assert len(contents) == 41, 'Invalid ref in %s' % file
             return contents[:-1]
         finally: