[PATCH 1 of 3] move filename encoding functions from util to filelog

Matt Mackall mpm at selenic.com
Thu Jul 17 11:26:19 CDT 2008


On Thu, 2008-07-17 at 16:23 +0200, Adrian Buehlmann wrote:
> # HG changeset patch
> # User Adrian Buehlmann <adrian at cadifra.com>
> # Date 1216299441 -7200
> # Node ID 64d51f7facf9804d3b004f4eae7844ae7a1937ca
> # Parent  2134d6c09432e4e3dbee18d93ec9242a332f7cdc
> move filename encoding functions from util to filelog

Looks great. Though it might want to end up in a store.py as per my
other email. That will allow us to actually build the encode functions
on demand. 

> diff --git a/mercurial/filelog.py b/mercurial/filelog.py
> --- a/mercurial/filelog.py
> +++ b/mercurial/filelog.py
> @@ -81,3 +81,36 @@
>              return t2 != text
>  
>          return revlog.cmp(self, node, text)
> +
> +def _buildencodefun():
> +    e = '_'
> +    win_reserved = [ord(x) for x in '\\:*?"<>|']
> +    cmap = dict([ (chr(x), chr(x)) for x in xrange(127) ])
> +    for x in (range(32) + range(126, 256) + win_reserved):
> +        cmap[chr(x)] = "~%02x" % x
> +    for x in range(ord("A"), ord("Z")+1) + [ord(e)]:
> +        cmap[chr(x)] = e + chr(x).lower()
> +    dmap = {}
> +    for k, v in cmap.iteritems():
> +        dmap[v] = k
> +    def decode(s):
> +        i = 0
> +        while i < len(s):
> +            for l in xrange(1, 4):
> +                try:
> +                    yield dmap[s[i:i+l]]
> +                    i += l
> +                    break
> +                except KeyError:
> +                    pass
> +            else:
> +                raise KeyError
> +    return (lambda s: "".join([cmap[c] for c in s]),
> +            lambda s: "".join(list(decode(s))))
> +
> +encodefilename, decodefilename = _buildencodefun()
> +
> +def encodedopener(openerfn, fn):
> +    def o(path, *args, **kw):
> +        return openerfn(fn(path), *args, **kw)
> +    return o
> diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
> --- a/mercurial/localrepo.py
> +++ b/mercurial/localrepo.py
> @@ -62,8 +62,8 @@
>  
>          # setup store
>          if "store" in requirements:
> -            self.encodefn = util.encodefilename
> -            self.decodefn = util.decodefilename
> +            self.encodefn = filelog.encodefilename
> +            self.decodefn = filelog.decodefilename
>              self.spath = os.path.join(self.path, "store")
>          else:
>              self.encodefn = lambda x: x
> @@ -83,7 +83,7 @@
>          self.opener.createmode = mode
>          sopener = util.opener(self.spath)
>          sopener.createmode = mode
> -        self.sopener = util.encodedopener(sopener, self.encodefn)
> +        self.sopener = filelog.encodedopener(sopener, self.encodefn)
>  
>          self.ui = ui.ui(parentui=parentui)
>          try:
> diff --git a/mercurial/statichttprepo.py b/mercurial/statichttprepo.py
> --- a/mercurial/statichttprepo.py
> +++ b/mercurial/statichttprepo.py
> @@ -9,7 +9,7 @@
>  
>  from i18n import _
>  import changelog, httprangereader
> -import repo, localrepo, manifest, util
> +import repo, localrepo, manifest, util, filelog
>  import urllib, urllib2, errno
>  
>  class rangereader(httprangereader.httprangereader):
> @@ -55,14 +55,14 @@
>  
>          # setup store
>          if "store" in requirements:
> -            self.encodefn = util.encodefilename
> -            self.decodefn = util.decodefilename
> +            self.encodefn = filelog.encodefilename
> +            self.decodefn = filelog.decodefilename
>              self.spath = self.path + "/store"
>          else:
>              self.encodefn = lambda x: x
>              self.decodefn = lambda x: x
>              self.spath = self.path
> -        self.sopener = util.encodedopener(opener(self.spath), self.encodefn)
> +        self.sopener = filelog.encodedopener(opener(self.spath), self.encodefn)
>  
>          self.manifest = manifest.manifest(self.sopener)
>          self.changelog = changelog.changelog(self.sopener)
> diff --git a/mercurial/util.py b/mercurial/util.py
> --- a/mercurial/util.py
> +++ b/mercurial/util.py
> @@ -1345,39 +1345,6 @@
>          return name
>      return find_in_path(name, os.environ.get('PATH', ''), default=default)
>  
> -def _buildencodefun():
> -    e = '_'
> -    win_reserved = [ord(x) for x in '\\:*?"<>|']
> -    cmap = dict([ (chr(x), chr(x)) for x in xrange(127) ])
> -    for x in (range(32) + range(126, 256) + win_reserved):
> -        cmap[chr(x)] = "~%02x" % x
> -    for x in range(ord("A"), ord("Z")+1) + [ord(e)]:
> -        cmap[chr(x)] = e + chr(x).lower()
> -    dmap = {}
> -    for k, v in cmap.iteritems():
> -        dmap[v] = k
> -    def decode(s):
> -        i = 0
> -        while i < len(s):
> -            for l in xrange(1, 4):
> -                try:
> -                    yield dmap[s[i:i+l]]
> -                    i += l
> -                    break
> -                except KeyError:
> -                    pass
> -            else:
> -                raise KeyError
> -    return (lambda s: "".join([cmap[c] for c in s]),
> -            lambda s: "".join(list(decode(s))))
> -
> -encodefilename, decodefilename = _buildencodefun()
> -
> -def encodedopener(openerfn, fn):
> -    def o(path, *args, **kw):
> -        return openerfn(fn(path), *args, **kw)
> -    return o
> -
>  def mktempcopy(name, emptyok=False, createmode=None):
>      """Create a temporary file with the same contents from name
>  
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel
-- 
Mathematics is the supreme nostalgia of our time.



More information about the Mercurial-devel mailing list