equal
deleted
inserted
replaced
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) |
|