Mercurial > hg
comparison mercurial/store.py @ 6900:def492d1b592
store: change handling of decoding errors
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Wed, 13 Aug 2008 20:18:43 -0500 |
parents | 56a7a54e074f |
children | 93f761c25dea |
comparison
equal
deleted
inserted
replaced
6899:56a7a54e074f | 6900:def492d1b592 |
---|---|
3 # Copyright 2008 Matt Mackall <mpm@selenic.com> | 3 # Copyright 2008 Matt Mackall <mpm@selenic.com> |
4 # | 4 # |
5 # This software may be used and distributed according to the terms | 5 # This software may be used and distributed according to the terms |
6 # of the GNU General Public License, incorporated herein by reference. | 6 # of the GNU General Public License, incorporated herein by reference. |
7 | 7 |
8 from i18n import _ | |
9 import os, stat, osutil, util | 8 import os, stat, osutil, util |
10 | 9 |
11 def _buildencodefun(): | 10 def _buildencodefun(): |
12 e = '_' | 11 e = '_' |
13 win_reserved = [ord(x) for x in '\\:*?"<>|'] | 12 win_reserved = [ord(x) for x in '\\:*?"<>|'] |
57 | 56 |
58 def join(self, f): | 57 def join(self, f): |
59 return os.path.join(self.path, f) | 58 return os.path.join(self.path, f) |
60 | 59 |
61 def _walk(self, relpath, recurse): | 60 def _walk(self, relpath, recurse): |
62 '''yields (filename, size)''' | 61 '''yields (unencoded, encoded, size)''' |
63 path = os.path.join(self.path, relpath) | 62 path = os.path.join(self.path, relpath) |
64 striplen = len(self.path) + len(os.sep) | 63 striplen = len(self.path) + len(os.sep) |
65 prefix = path[striplen:] | 64 prefix = path[striplen:] |
66 l = [] | 65 l = [] |
67 if os.path.isdir(path): | 66 if os.path.isdir(path): |
69 while visit: | 68 while visit: |
70 p = visit.pop() | 69 p = visit.pop() |
71 for f, kind, st in osutil.listdir(p, stat=True): | 70 for f, kind, st in osutil.listdir(p, stat=True): |
72 fp = os.path.join(p, f) | 71 fp = os.path.join(p, f) |
73 if kind == stat.S_IFREG and f[-2:] in ('.d', '.i'): | 72 if kind == stat.S_IFREG and f[-2:] in ('.d', '.i'): |
74 l.append((util.pconvert(fp[striplen:]), st.st_size)) | 73 n = util.pconvert(fp[striplen:]) |
74 l.append((n, n, st.st_size)) | |
75 elif kind == stat.S_IFDIR and recurse: | 75 elif kind == stat.S_IFDIR and recurse: |
76 visit.append(fp) | 76 visit.append(fp) |
77 return util.sort(l) | 77 return util.sort(l) |
78 | 78 |
79 def datafiles(self, reporterror=None): | 79 def datafiles(self): |
80 return self._walk('data', True) | 80 return self._walk('data', True) |
81 | 81 |
82 def walk(self): | 82 def walk(self): |
83 '''yields (direncoded filename, size)''' | 83 '''yields (unencoded, encoded, size)''' |
84 # yield data files first | 84 # yield data files first |
85 for x in self.datafiles(): | 85 for x in self.datafiles(): |
86 yield x | 86 yield x |
87 # yield manifest before changelog | 87 # yield manifest before changelog |
88 meta = self._walk('', False) | 88 meta = self._walk('', False) |
97 self.encodefn = encodefilename | 97 self.encodefn = encodefilename |
98 op = opener(self.path) | 98 op = opener(self.path) |
99 op.createmode = self.createmode | 99 op.createmode = self.createmode |
100 self.opener = lambda f, *args, **kw: op(self.encodefn(f), *args, **kw) | 100 self.opener = lambda f, *args, **kw: op(self.encodefn(f), *args, **kw) |
101 | 101 |
102 def datafiles(self, reporterror=None): | 102 def datafiles(self): |
103 for f, size in self._walk('data', True): | 103 for a, b, size in self._walk('data', True): |
104 try: | 104 try: |
105 yield decodefilename(f), size | 105 a = decodefilename(a) |
106 except KeyError: | 106 except KeyError: |
107 if not reporterror: | 107 a = None |
108 raise | 108 yield a, b, size |
109 reporterror(_("cannot decode filename '%s'") % f) | |
110 | 109 |
111 def join(self, f): | 110 def join(self, f): |
112 return os.path.join(self.path, self.encodefn(f)) | 111 return os.path.join(self.path, self.encodefn(f)) |
113 | 112 |
114 def store(requirements, path, opener): | 113 def store(requirements, path, opener): |