[PATCH 1 of 2] Fix for Issue1260

Adrian Buehlmann adrian at cadifra.com
Sun Aug 31 06:38:48 CDT 2008


# HG changeset patch
# User Adrian Buehlmann <adrian at cadifra.com>
# Date 1220134940 -7200
# Node ID 8f78c9cc5b5714eba2b7ab9e2405047d6a3232b2
# Parent  a7fcb43af82e4a033e2dd34b7a1f60830e1fce50
Fix for Issue1260

diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -60,7 +60,7 @@
                 if inst.errno != errno.ENOENT:
                     raise
 
-        self.store = store.store(requirements, self.path, util.opener)
+        self.store = store.store(requirements, self.path, util.opener, os.path.join)
         self.spath = self.store.path
         self.sopener = self.store.opener
         self.sjoin = self.store.join
diff --git a/mercurial/statichttprepo.py b/mercurial/statichttprepo.py
--- a/mercurial/statichttprepo.py
+++ b/mercurial/statichttprepo.py
@@ -54,7 +54,9 @@
                 raise repo.RepoError(_("requirement '%s' not supported") % r)
 
         # setup store
-        self.store = store.store(requirements, self.path, opener)
+        def pjoin(a, b):
+            return a + '/' + b
+        self.store = store.store(requirements, self.path, opener, pjoin)
         self.spath = self.store.path
         self.sopener = self.store.opener
         self.sjoin = self.store.join
diff --git a/mercurial/store.py b/mercurial/store.py
--- a/mercurial/store.py
+++ b/mercurial/store.py
@@ -50,18 +50,19 @@
 
 class basicstore:
     '''base class for local repository stores'''
-    def __init__(self, path, opener):
+    def __init__(self, path, opener, pathjoiner):
+        self.pathjoiner = pathjoiner
         self.path = path
         self.createmode = _calcmode(path)
         self.opener = opener(self.path)
         self.opener.createmode = self.createmode
 
     def join(self, f):
-        return os.path.join(self.path, f)
+        return self.pathjoiner(self.path, f)
 
     def _walk(self, relpath, recurse):
         '''yields (unencoded, encoded, size)'''
-        path = os.path.join(self.path, relpath)
+        path = self.pathjoiner(self.path, relpath)
         striplen = len(self.path) + len(os.sep)
         prefix = path[striplen:]
         l = []
@@ -70,7 +71,7 @@
             while visit:
                 p = visit.pop()
                 for f, kind, st in osutil.listdir(p, stat=True):
-                    fp = os.path.join(p, f)
+                    fp = self.pathjoiner(p, f)
                     if kind == stat.S_IFREG and f[-2:] in ('.d', '.i'):
                         n = util.pconvert(fp[striplen:])
                         l.append((n, n, st.st_size))
@@ -96,8 +97,9 @@
         return ['requires'] + _data.split()
 
 class encodedstore(basicstore):
-    def __init__(self, path, opener):
-        self.path = os.path.join(path, 'store')
+    def __init__(self, path, opener, pathjoiner):
+        self.pathjoiner = pathjoiner
+        self.path = self.pathjoiner(path, 'store')
         self.createmode = _calcmode(self.path)
         op = opener(self.path)
         op.createmode = self.createmode
@@ -112,13 +114,13 @@
             yield a, b, size
 
     def join(self, f):
-        return os.path.join(self.path, encodefilename(f))
+        return self.pathjoiner(self.path, encodefilename(f))
 
     def copylist(self):
         return (['requires', '00changelog.i'] +
-                ['store/' + f for f in _data.split()])
+                [self.pathjoiner('store', f) for f in _data.split()])
 
-def store(requirements, path, opener):
+def store(requirements, path, opener, pathjoiner):
     if 'store' in requirements:
-        return encodedstore(path, opener)
-    return basicstore(path, opener)
+        return encodedstore(path, opener, pathjoiner)
+    return basicstore(path, opener, pathjoiner)


More information about the Mercurial-devel mailing list