mercurial/manifest.py
changeset 39521 154e4f84b51c
parent 39518 c29548ba4a75
child 39522 3ba9ef0fb693
equal deleted inserted replaced
39520:0612e4c6fda0 39521:154e4f84b51c
   708     def _loadlazy(self, d):
   708     def _loadlazy(self, d):
   709         path, node, readsubtree = self._lazydirs[d]
   709         path, node, readsubtree = self._lazydirs[d]
   710         self._dirs[d] = readsubtree(path, node)
   710         self._dirs[d] = readsubtree(path, node)
   711         del self._lazydirs[d]
   711         del self._lazydirs[d]
   712 
   712 
       
   713     def _loadchildrensetlazy(self, visit):
       
   714         if not visit:
       
   715             return None
       
   716         if visit == 'all' or visit == 'this':
       
   717             self._loadalllazy()
       
   718             return None
       
   719 
       
   720         todel = []
       
   721         for k in visit:
       
   722             kslash = k + '/'
       
   723             ld = self._lazydirs.get(kslash)
       
   724             if ld:
       
   725                 path, node, readsubtree = ld
       
   726                 self._dirs[kslash] = readsubtree(path, node)
       
   727                 todel.append(kslash)
       
   728         for kslash in todel:
       
   729             del self._lazydirs[kslash]
       
   730         return visit
       
   731 
   713     def __len__(self):
   732     def __len__(self):
   714         self._load()
   733         self._load()
   715         size = len(self._files)
   734         size = len(self._files)
   716         self._loadalllazy()
   735         self._loadalllazy()
   717         for m in self._dirs.values():
   736         for m in self._dirs.values():
  1041 
  1060 
  1042     def _matches(self, match):
  1061     def _matches(self, match):
  1043         '''recursively generate a new manifest filtered by the match argument.
  1062         '''recursively generate a new manifest filtered by the match argument.
  1044         '''
  1063         '''
  1045 
  1064 
  1046         visit = match.visitdir(self._dir[:-1] or '.')
  1065         visit = match.visitchildrenset(self._dir[:-1] or '.')
  1047         if visit == 'all':
  1066         if visit == 'all':
  1048             return self.copy()
  1067             return self.copy()
  1049         ret = treemanifest(self._dir)
  1068         ret = treemanifest(self._dir)
  1050         if not visit:
  1069         if not visit:
  1051             return ret
  1070             return ret
  1052 
  1071 
  1053         self._load()
  1072         self._load()
  1054         for fn in self._files:
  1073         for fn in self._files:
       
  1074             # While visitchildrenset *usually* lists only subdirs, this is
       
  1075             # actually up to the matcher and may have some files in the set().
       
  1076             # If visit == 'this', we should obviously look at the files in this
       
  1077             # directory; if visit is a set, and fn is in it, we should inspect
       
  1078             # fn (but no need to inspect things not in the set).
       
  1079             if visit != 'this' and fn not in visit:
       
  1080                 continue
  1055             fullp = self._subpath(fn)
  1081             fullp = self._subpath(fn)
       
  1082             # visitchildrenset isn't perfect, we still need to call the regular
       
  1083             # matcher code to further filter results.
  1056             if not match(fullp):
  1084             if not match(fullp):
  1057                 continue
  1085                 continue
  1058             ret._files[fn] = self._files[fn]
  1086             ret._files[fn] = self._files[fn]
  1059             if fn in self._flags:
  1087             if fn in self._flags:
  1060                 ret._flags[fn] = self._flags[fn]
  1088                 ret._flags[fn] = self._flags[fn]
  1061 
  1089 
  1062         # OPT: use visitchildrenset to avoid loading everything
  1090         visit = self._loadchildrensetlazy(visit)
  1063         self._loadalllazy()
       
  1064         for dir, subm in self._dirs.iteritems():
  1091         for dir, subm in self._dirs.iteritems():
       
  1092             if visit and dir[:-1] not in visit:
       
  1093                 continue
  1065             m = subm._matches(match)
  1094             m = subm._matches(match)
  1066             if not m._isempty():
  1095             if not m._isempty():
  1067                 ret._dirs[dir] = m
  1096                 ret._dirs[dir] = m
  1068 
  1097 
  1069         if not ret._isempty():
  1098         if not ret._isempty():