mercurial/util.py
changeset 3852 8a9a1a7e1698
parent 3785 1427949b8f80
child 3853 c0b449154a90
equal deleted inserted replaced
3851:8f18e31c4441 3852:8a9a1a7e1698
   867         """
   867         """
   868         if st is None:
   868         if st is None:
   869             st = fstat(f)
   869             st = fstat(f)
   870         return st.st_uid == os.getuid()
   870         return st.st_uid == os.getuid()
   871 
   871 
       
   872 def _buildencodefun():
       
   873     e = '_'
       
   874     win_reserved = [ord(x) for x in '|\?*<":>+[]']
       
   875     cmap = dict([ (chr(x), chr(x)) for x in xrange(127) ])
       
   876     for x in (range(32) + range(126, 256) + win_reserved):
       
   877         cmap[chr(x)] = "~%02x" % x
       
   878     for x in range(ord("A"), ord("Z")+1) + [ord(e)]:
       
   879         cmap[chr(x)] = e + chr(x).lower()
       
   880     dmap = {}
       
   881     for k, v in cmap.iteritems():
       
   882         dmap[v] = k
       
   883     def decode(s):
       
   884         i = 0
       
   885         while i < len(s):
       
   886             for l in xrange(1, 4):
       
   887                 try:
       
   888                     yield dmap[s[i:i+l]]
       
   889                     i += l
       
   890                     break
       
   891                 except KeyError:
       
   892                     pass
       
   893             else:
       
   894                 raise KeyError
       
   895     return (lambda s: "".join([cmap[c] for c in s]),
       
   896             lambda s: "".join(list(decode(s))))
       
   897 
       
   898 encodefilename, decodefilename = _buildencodefun()
       
   899 
   872 
   900 
   873 def opener(base, audit=True):
   901 def opener(base, audit=True):
   874     """
   902     """
   875     return a function that opens files relative to base
   903     return a function that opens files relative to base
   876 
   904