mercurial/dirstate.py
changeset 3607 f4c9bb4ad7b1
parent 3567 ece5c53577eb
child 3628 63e173a4ffbc
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: