comparison mercurial/dirstate.py @ 3607:f4c9bb4ad7b1

issue352: disallow '\n' and '\r' in filenames (dirstate and manifest)
author Benoit Boissinot <benoit.boissinot@ens-lyon.org>
date Wed, 01 Nov 2006 17:56:55 +0100
parents ece5c53577eb
children 63e173a4ffbc
comparison
equal deleted inserted replaced
3606:f8589028a7fa 3607:f4c9bb4ad7b1
209 for c in strutil.findall(path, '/'): 209 for c in strutil.findall(path, '/'):
210 pc = path[:c] 210 pc = path[:c]
211 self.dirs.setdefault(pc, 0) 211 self.dirs.setdefault(pc, 0)
212 self.dirs[pc] += delta 212 self.dirs[pc] += delta
213 213
214 def checkshadows(self, files): 214 def checkinterfering(self, files):
215 def prefixes(f): 215 def prefixes(f):
216 for c in strutil.rfindall(f, '/'): 216 for c in strutil.rfindall(f, '/'):
217 yield f[:c] 217 yield f[:c]
218 self.lazyread() 218 self.lazyread()
219 self.initdirs() 219 self.initdirs()
220 seendirs = {} 220 seendirs = {}
221 for f in files: 221 for f in files:
222 # shadows
222 if self.dirs.get(f): 223 if self.dirs.get(f):
223 raise util.Abort(_('directory named %r already in dirstate') % 224 raise util.Abort(_('directory named %r already in dirstate') %
224 f) 225 f)
225 for d in prefixes(f): 226 for d in prefixes(f):
226 if d in seendirs: 227 if d in seendirs:
227 break 228 break
228 if d in self.map: 229 if d in self.map:
229 raise util.Abort(_('file named %r already in dirstate') % 230 raise util.Abort(_('file named %r already in dirstate') %
230 d) 231 d)
231 seendirs[d] = True 232 seendirs[d] = True
233 # disallowed
234 if '\r' in f or '\n' in f:
235 raise util.Abort(_("'\\n' and '\\r' disallowed in filenames"))
232 236
233 def update(self, files, state, **kw): 237 def update(self, files, state, **kw):
234 ''' current states: 238 ''' current states:
235 n normal 239 n normal
236 m needs merging 240 m needs merging
240 if not files: return 244 if not files: return
241 self.lazyread() 245 self.lazyread()
242 self.markdirty() 246 self.markdirty()
243 if state == "a": 247 if state == "a":
244 self.initdirs() 248 self.initdirs()
245 self.checkshadows(files) 249 self.checkinterfering(files)
246 for f in files: 250 for f in files:
247 if state == "r": 251 if state == "r":
248 self.map[f] = ('r', 0, 0, 0) 252 self.map[f] = ('r', 0, 0, 0)
249 self.updatedirs(f, -1) 253 self.updatedirs(f, -1)
250 else: 254 else: