mercurial/util.py
changeset 13928 155d2e17884e
parent 13926 61ba09d8d118
child 13943 545091b12724
equal deleted inserted replaced
13927:518344d02761 13928:155d2e17884e
   553         self.auditeddir = set()
   553         self.auditeddir = set()
   554         self.root = root
   554         self.root = root
   555         self.callback = callback
   555         self.callback = callback
   556 
   556 
   557     def __call__(self, path):
   557     def __call__(self, path):
       
   558         '''Check the relative path.
       
   559         path may contain a pattern (e.g. foodir/**.txt)'''
       
   560 
   558         if path in self.audited:
   561         if path in self.audited:
   559             return
   562             return
   560         # AIX ignores "/" at end of path, others raise EISDIR.
   563         # AIX ignores "/" at end of path, others raise EISDIR.
   561         if endswithsep(path):
   564         if endswithsep(path):
   562             raise Abort(_("path ends in directory separator: %s") % path)
   565             raise Abort(_("path ends in directory separator: %s") % path)
   572                 if p in lparts[1:]:
   575                 if p in lparts[1:]:
   573                     pos = lparts.index(p)
   576                     pos = lparts.index(p)
   574                     base = os.path.join(*parts[:pos])
   577                     base = os.path.join(*parts[:pos])
   575                     raise Abort(_('path %r is inside nested repo %r')
   578                     raise Abort(_('path %r is inside nested repo %r')
   576                                 % (path, base))
   579                                 % (path, base))
   577         def check(prefix):
   580 
       
   581         parts.pop()
       
   582         prefixes = []
       
   583         while parts:
       
   584             prefix = os.sep.join(parts)
       
   585             if prefix in self.auditeddir:
       
   586                 break
   578             curpath = os.path.join(self.root, prefix)
   587             curpath = os.path.join(self.root, prefix)
   579             try:
   588             try:
   580                 st = os.lstat(curpath)
   589                 st = os.lstat(curpath)
   581             except OSError, err:
   590             except OSError, err:
   582                 # EINVAL can be raised as invalid path syntax under win32.
   591                 # EINVAL can be raised as invalid path syntax under win32.
   590                 elif (stat.S_ISDIR(st.st_mode) and
   599                 elif (stat.S_ISDIR(st.st_mode) and
   591                       os.path.isdir(os.path.join(curpath, '.hg'))):
   600                       os.path.isdir(os.path.join(curpath, '.hg'))):
   592                     if not self.callback or not self.callback(curpath):
   601                     if not self.callback or not self.callback(curpath):
   593                         raise Abort(_('path %r is inside nested repo %r') %
   602                         raise Abort(_('path %r is inside nested repo %r') %
   594                                     (path, prefix))
   603                                     (path, prefix))
   595         parts.pop()
       
   596         prefixes = []
       
   597         while parts:
       
   598             prefix = os.sep.join(parts)
       
   599             if prefix in self.auditeddir:
       
   600                 break
       
   601             check(prefix)
       
   602             prefixes.append(prefix)
   604             prefixes.append(prefix)
   603             parts.pop()
   605             parts.pop()
   604 
   606 
   605         self.audited.add(path)
   607         self.audited.add(path)
   606         # only add prefixes to the cache after checking everything: we don't
   608         # only add prefixes to the cache after checking everything: we don't