# HG changeset patch # User mpm@selenic.com # Date 1122519032 28800 # Node ID 902b12d55751b8414562544faafc7dc41807890b # Parent 46a8dd3145cc417af6643c291d794db75c5b8779 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. diff --git a/mercurial/hg.py b/mercurial/hg.py --- a/mercurial/hg.py +++ b/mercurial/hg.py @@ -16,8 +16,22 @@ demandload(globals(), "bisect select") 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)