[PATCH 2 of 3] move store walking from streamclone.py into store.py

Adrian Buehlmann adrian at cadifra.com
Mon Jul 21 16:08:38 CDT 2008


On 21.07.2008 22:15, Matt Mackall wrote:
> On Mon, 2008-07-21 at 21:43 +0200, Adrian Buehlmann wrote:
>> # HG changeset patch
>> # User Adrian Buehlmann <adrian at cadifra.com>
>> # Date 1216645162 -7200
>> # Node ID 00e5d2425f873233e06ed3c6631211ce49935c84
>> # Parent  a7f1babd458d9cb5b6db1b6d326624ab355b4268
>> move store walking from streamclone.py into store.py
> 
> This is looking quite promising.

Great!

>> diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
>> --- a/mercurial/localrepo.py
>> +++ b/mercurial/localrepo.py
>> @@ -60,14 +60,9 @@
>>              if r not in self.supported:
>>                  raise repo.RepoError(_("requirement '%s' not supported") % r)
>>  
>> -        # setup store
>>          if "store" in requirements:
>> -            self.encodefn = store.encodefilename
>> -            self.decodefn = store.decodefilename
>>              self.spath = os.path.join(self.path, "store")
>>          else:
>> -            self.encodefn = lambda x: x
>> -            self.decodefn = lambda x: x
>>              self.spath = self.path
> 
> Seems like we ought to get spath from store.path, no? Then this if logic
> can vanish entirely.

Hmm. Yes, why not. I'll try that.

>>          try:
>> @@ -81,9 +76,10 @@
>>  
>>          self._createmode = mode
>>          self.opener.createmode = mode
>> -        sopener = util.opener(self.spath)
>> -        sopener.createmode = mode
>> -        self.sopener = store.encodedopener(sopener, self.encodefn)
>> +
>> +        self.store = store.store(requirements, self.spath, mode)
>> +        self.sopener = self.store.opener
>> +        self.encodefn = self.store.encodefn
> 
> Do we need encodefn for anything? Looks like only for spath. And that
                                                        ^^^^^
                                                        sjoin?
> looks like it ought to be a store method. In other words:
>  self.sjoin = self.store.join
>

Ok. I'll do that.

I have used encodefn in commands.debugfilenamelog (commands.py#655), but it's easy
to replace "ef = repo.encodefn(f)" with "ef = repo.store.encodefn(f)" there (since
on the line above that I already use repo.store...)

>> -        self.sopener = store.encodedopener(opener(self.spath), self.encodefn)
>> +        self.encodefn = store.encodefn(requirements)
>> +        so = opener(self.spath)
>> +        self.sopener = lambda path, *args, **kw: so(
>> +            self.encodefn(path), *args, **kw)
> 
> What's happening here? Is there a reason we can't use a store object
> here?

Hmm. You are quoting:

diff --git a/mercurial/statichttprepo.py b/mercurial/statichttprepo.py
--- a/mercurial/statichttprepo.py
+++ b/mercurial/statichttprepo.py
@@ -55,14 +55,13 @@

         # setup store
         if "store" in requirements:
-            self.encodefn = store.encodefilename
-            self.decodefn = store.decodefilename
             self.spath = self.path + "/store"
         else:
-            self.encodefn = lambda x: x
-            self.decodefn = lambda x: x
             self.spath = self.path
-        self.sopener = store.encodedopener(opener(self.spath), self.encodefn)
+        self.encodefn = store.encodefn(requirements)
+        so = opener(self.spath)
+        self.sopener = lambda path, *args, **kw: so(
+            self.encodefn(path), *args, **kw)

         self.manifest = manifest.manifest(self.sopener)
         self.changelog = changelog.changelog(self.sopener)

Which uses a special opener (quote from statichttprepo.py#15):

class rangereader(httprangereader.httprangereader):
    def read(self, size=None):
        try:
            return httprangereader.httprangereader.read(self, size)
        except urllib2.HTTPError, inst:
            num = inst.code == 404 and errno.ENOENT or None
            raise IOError(num, inst)
        except urllib2.URLError, inst:
            raise IOError(None, inst.reason[1])

def opener(base):
    """return a function that opens files over http"""
    p = base
    def o(path, mode="r"):
        f = "/".join((p, urllib.quote(path)))
        return rangereader(f)
    return o

I don't see how to integrate that into store.py.







More information about the Mercurial-devel mailing list