[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