mercurial/scmutil.py
changeset 24635 21e1ece30f8c
parent 24628 a0b47885a1c5
child 24689 ca3a90096c95
equal deleted inserted replaced
24634:4ece2847cf4c 24635:21e1ece30f8c
     5 # This software may be used and distributed according to the terms of the
     5 # This software may be used and distributed according to the terms of the
     6 # GNU General Public License version 2 or any later version.
     6 # GNU General Public License version 2 or any later version.
     7 
     7 
     8 from i18n import _
     8 from i18n import _
     9 from mercurial.node import nullrev
     9 from mercurial.node import nullrev
    10 import util, error, osutil, revset, similar, encoding, phases, parsers
    10 import util, error, osutil, revset, similar, encoding, phases
    11 import pathutil
    11 import pathutil
    12 import match as matchmod
    12 import match as matchmod
    13 import os, errno, re, glob, tempfile
    13 import os, errno, re, glob, tempfile
    14 
    14 
    15 if os.name == 'nt':
    15 if os.name == 'nt':
  1081     def __delete__(self, obj):
  1081     def __delete__(self, obj):
  1082         try:
  1082         try:
  1083             del obj.__dict__[self.name]
  1083             del obj.__dict__[self.name]
  1084         except KeyError:
  1084         except KeyError:
  1085             raise AttributeError(self.name)
  1085             raise AttributeError(self.name)
  1086 
       
  1087 class dirs(object):
       
  1088     '''a multiset of directory names from a dirstate or manifest'''
       
  1089 
       
  1090     def __init__(self, map, skip=None):
       
  1091         self._dirs = {}
       
  1092         addpath = self.addpath
       
  1093         if util.safehasattr(map, 'iteritems') and skip is not None:
       
  1094             for f, s in map.iteritems():
       
  1095                 if s[0] != skip:
       
  1096                     addpath(f)
       
  1097         else:
       
  1098             for f in map:
       
  1099                 addpath(f)
       
  1100 
       
  1101     def addpath(self, path):
       
  1102         dirs = self._dirs
       
  1103         for base in finddirs(path):
       
  1104             if base in dirs:
       
  1105                 dirs[base] += 1
       
  1106                 return
       
  1107             dirs[base] = 1
       
  1108 
       
  1109     def delpath(self, path):
       
  1110         dirs = self._dirs
       
  1111         for base in finddirs(path):
       
  1112             if dirs[base] > 1:
       
  1113                 dirs[base] -= 1
       
  1114                 return
       
  1115             del dirs[base]
       
  1116 
       
  1117     def __iter__(self):
       
  1118         return self._dirs.iterkeys()
       
  1119 
       
  1120     def __contains__(self, d):
       
  1121         return d in self._dirs
       
  1122 
       
  1123 if util.safehasattr(parsers, 'dirs'):
       
  1124     dirs = parsers.dirs
       
  1125 
       
  1126 def finddirs(path):
       
  1127     pos = path.rfind('/')
       
  1128     while pos != -1:
       
  1129         yield path[:pos]
       
  1130         pos = path.rfind('/', 0, pos)