mercurial/dirstate.py
changeset 7032 7dfac37cfabf
parent 7023 74be9d0c665c
child 7034 0d513661d6c2
equal deleted inserted replaced
7031:19e8d034932e 7032:7dfac37cfabf
    14 
    14 
    15 _unknown = ('?', 0, 0, 0)
    15 _unknown = ('?', 0, 0, 0)
    16 _format = ">cllll"
    16 _format = ">cllll"
    17 
    17 
    18 def _finddirs(path):
    18 def _finddirs(path):
    19     pos = len(path)
    19     pos = path.rfind('/')
    20     while 1:
    20     while pos != -1:
       
    21         yield path[:pos]
    21         pos = path.rfind('/', 0, pos)
    22         pos = path.rfind('/', 0, pos)
    22         if pos == -1:
       
    23             break
       
    24         yield path[:pos]
       
    25 
    23 
    26 class dirstate(object):
    24 class dirstate(object):
    27 
    25 
    28     def __init__(self, opener, ui, root):
    26     def __init__(self, opener, ui, root):
    29         self._opener = opener
    27         self._opener = opener
    63             except IOError, err:
    61             except IOError, err:
    64                 if err.errno != errno.ENOENT: raise
    62                 if err.errno != errno.ENOENT: raise
    65             return self._pl
    63             return self._pl
    66         elif name == '_dirs':
    64         elif name == '_dirs':
    67             dirs = {}
    65             dirs = {}
    68             for f,s in self._map.items():
    66             for f,s in self._map.iteritems():
    69                 if s[0] != 'r':
    67                 if s[0] != 'r':
    70                     for base in _finddirs(f):
    68                     pos = f.rfind('/')
    71                         dirs[base] = dirs.get(base, 0) + 1
    69                     while pos != -1:
       
    70                         f = f[:pos]
       
    71                         if f in dirs:
       
    72                             dirs[f] += 1
       
    73                             break
       
    74                         dirs[f] = 1
       
    75                         pos = f.rfind('/')
    72             self._dirs = dirs
    76             self._dirs = dirs
    73             return self._dirs
    77             return self._dirs
    74         elif name == '_ignore':
    78         elif name == '_ignore':
    75             files = [self._join('.hgignore')]
    79             files = [self._join('.hgignore')]
    76             for name, path in self._ui.configitems("ui"):
    80             for name, path in self._ui.configitems("ui"):
   240         if self[f] not in "?r" and "_dirs" in self.__dict__:
   244         if self[f] not in "?r" and "_dirs" in self.__dict__:
   241             dirs = self._dirs
   245             dirs = self._dirs
   242             for base in _finddirs(f):
   246             for base in _finddirs(f):
   243                 if dirs[base] == 1:
   247                 if dirs[base] == 1:
   244                     del dirs[base]
   248                     del dirs[base]
   245                 else:
   249                     return
   246                     dirs[base] -= 1
   250                 dirs[base] -= 1
   247 
   251 
   248     def _addpath(self, f, check=False):
   252     def _addpath(self, f, check=False):
   249         oldstate = self[f]
   253         oldstate = self[f]
   250         if check or oldstate == "r":
   254         if check or oldstate == "r":
   251             if '\r' in f or '\n' in f:
   255             if '\r' in f or '\n' in f: