comparison mercurial/dirstate.py @ 4617:70352337934e

dirstate: refactor checkinterfering
author Matt Mackall <mpm@selenic.com>
date Mon, 18 Jun 2007 13:24:34 -0500
parents 9b00b73a5286
children d97fd22a0ea9
comparison
equal deleted inserted replaced
4616:9b00b73a5286 4617:70352337934e
180 for c in strutil.findall(path, '/'): 180 for c in strutil.findall(path, '/'):
181 pc = path[:c] 181 pc = path[:c]
182 self._dirs.setdefault(pc, 0) 182 self._dirs.setdefault(pc, 0)
183 self._dirs[pc] -= 1 183 self._dirs[pc] -= 1
184 184
185 def checkinterfering(self, files): 185 def _incpathcheck(self, f):
186 def prefixes(f): 186 if '\r' in f or '\n' in f:
187 for c in strutil.rfindall(f, '/'): 187 raise util.Abort(_("'\\n' and '\\r' disallowed in filenames"))
188 yield f[:c] 188 # shadows
189 seendirs = {} 189 if f in self._dirs:
190 for f in files: 190 raise util.Abort(_('directory named %r already in dirstate') % f)
191 # shadows 191 for c in strutil.rfindall(f, '/'):
192 if self._dirs.get(f): 192 d = f[:c]
193 raise util.Abort(_('directory named %r already in dirstate') % 193 if d in self._dirs:
194 f) 194 break
195 for d in prefixes(f): 195 if d in self._map:
196 if d in seendirs: 196 raise util.Abort(_('file named %r already in dirstate') % d)
197 break 197 self._incpath(f)
198 if d in self._map:
199 raise util.Abort(_('file named %r already in dirstate') %
200 d)
201 seendirs[d] = True
202 # disallowed
203 if '\r' in f or '\n' in f:
204 raise util.Abort(_("'\\n' and '\\r' disallowed in filenames"))
205 198
206 def update(self, files, state, **kw): 199 def update(self, files, state, **kw):
207 ''' current states: 200 ''' current states:
208 n normal 201 n normal
209 m needs merging 202 m needs merging
210 r marked for removal 203 r marked for removal
211 a marked for addition''' 204 a marked for addition'''
212 205
213 if not files: return 206 if not files: return
214 self.markdirty() 207 self.markdirty()
215 if state == "a":
216 self.checkinterfering(files)
217 for f in files: 208 for f in files:
209 if self._copymap.has_key(f):
210 del self._copymap[f]
211
218 if state == "r": 212 if state == "r":
219 self._map[f] = ('r', 0, 0, 0) 213 self._map[f] = ('r', 0, 0, 0)
220 self._decpath(f) 214 self._decpath(f)
215 continue
221 else: 216 else:
222 if state == "a": 217 if state == "a":
223 self._incpath(f) 218 self._incpathcheck(f)
224 s = os.lstat(self.wjoin(f)) 219 s = os.lstat(self.wjoin(f))
225 st_size = kw.get('st_size', s.st_size) 220 st_size = kw.get('st_size', s.st_size)
226 st_mtime = kw.get('st_mtime', s.st_mtime) 221 st_mtime = kw.get('st_mtime', s.st_mtime)
227 self._map[f] = (state, s.st_mode, st_size, st_mtime) 222 self._map[f] = (state, s.st_mode, st_size, st_mtime)
228 if self._copymap.has_key(f):
229 del self._copymap[f]
230 223
231 def forget(self, files): 224 def forget(self, files):
232 if not files: return 225 if not files: return
233 self.markdirty() 226 self.markdirty()
234 for f in files: 227 for f in files: