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):