equal
deleted
inserted
replaced
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 |