equal
deleted
inserted
replaced
903 """ |
903 """ |
904 if st is None: |
904 if st is None: |
905 st = fstat(f) |
905 st = fstat(f) |
906 return st.st_uid == os.getuid() |
906 return st.st_uid == os.getuid() |
907 |
907 |
|
908 def _buildencodefun(): |
|
909 e = '_' |
|
910 win_reserved = [ord(x) for x in '|\?*<":>+[]'] |
|
911 cmap = dict([ (chr(x), chr(x)) for x in xrange(127) ]) |
|
912 for x in (range(32) + range(126, 256) + win_reserved): |
|
913 cmap[chr(x)] = "~%02x" % x |
|
914 for x in range(ord("A"), ord("Z")+1) + [ord(e)]: |
|
915 cmap[chr(x)] = e + chr(x).lower() |
|
916 dmap = {} |
|
917 for k, v in cmap.iteritems(): |
|
918 dmap[v] = k |
|
919 def decode(s): |
|
920 i = 0 |
|
921 while i < len(s): |
|
922 for l in xrange(1, 4): |
|
923 try: |
|
924 yield dmap[s[i:i+l]] |
|
925 i += l |
|
926 break |
|
927 except KeyError: |
|
928 pass |
|
929 else: |
|
930 raise KeyError |
|
931 return (lambda s: "".join([cmap[c] for c in s]), |
|
932 lambda s: "".join(list(decode(s)))) |
|
933 |
|
934 encodefilename, decodefilename = _buildencodefun() |
|
935 |
|
936 def encodedopener(openerfn, fn): |
|
937 def o(path, *args, **kw): |
|
938 return openerfn(fn(path), *args, **kw) |
|
939 return o |
908 |
940 |
909 def opener(base, audit=True): |
941 def opener(base, audit=True): |
910 """ |
942 """ |
911 return a function that opens files relative to base |
943 return a function that opens files relative to base |
912 |
944 |