Fix the directory and revlog collision problem
authormpm@selenic.com
Wed, 27 Jul 2005 18:50:32 -0800
changeset 786 902b12d55751
parent 785 46a8dd3145cc
child 787 f199e1887889
Fix the directory and revlog collision problem This adds escaping for directory names so that directory foo.i doesn't collide with the revision data for file foo.
mercurial/hg.py
--- a/mercurial/hg.py	Wed Jul 27 18:16:20 2005 -0800
+++ b/mercurial/hg.py	Wed Jul 27 18:50:32 2005 -0800
@@ -16,8 +16,22 @@
 class filelog(revlog):
     def __init__(self, opener, path):
         revlog.__init__(self, opener,
-                        os.path.join("data", path + ".i"),
-                        os.path.join("data", path + ".d"))
+                        os.path.join("data", self.encodedir(path + ".i")),
+                        os.path.join("data", self.encodedir(path + ".d")))
+
+    # This avoids a collision between a file named foo and a dir named
+    # foo.i or foo.d
+    def encodedir(self, path):
+        path.replace(".hg/", ".hg.hg/")
+        path.replace(".i/", ".i.hg/")
+        path.replace(".d/", ".i.hg/")
+        return path
+
+    def decodedir(self, path):
+        path.replace(".d.hg/", ".d/")
+        path.replace(".i.hg/", ".i/")
+        path.replace(".hg.hg/", ".hg/")
+        return path
 
     def read(self, node):
         t = self.revision(node)