Show More
@@ -86,17 +86,25 class match(object): | |||||
86 | self._always = False |
|
86 | self._always = False | |
87 | self._pathrestricted = bool(include or exclude or patterns) |
|
87 | self._pathrestricted = bool(include or exclude or patterns) | |
88 | self._warn = warn |
|
88 | self._warn = warn | |
|
89 | self._includeroots = set() | |||
|
90 | self._includedirs = set(['.']) | |||
|
91 | self._excluderoots = set() | |||
89 |
|
92 | |||
90 | matchfns = [] |
|
93 | matchfns = [] | |
91 | if include: |
|
94 | if include: | |
92 | kindpats = self._normalize(include, 'glob', root, cwd, auditor) |
|
95 | kindpats = self._normalize(include, 'glob', root, cwd, auditor) | |
93 | self.includepat, im = _buildmatch(ctx, kindpats, '(?:/|$)', |
|
96 | self.includepat, im = _buildmatch(ctx, kindpats, '(?:/|$)', | |
94 | listsubrepos) |
|
97 | listsubrepos) | |
|
98 | self._includeroots.update(_roots(kindpats)) | |||
|
99 | self._includeroots.discard('.') | |||
|
100 | self._includedirs.update(util.dirs(self._includeroots)) | |||
95 | matchfns.append(im) |
|
101 | matchfns.append(im) | |
96 | if exclude: |
|
102 | if exclude: | |
97 | kindpats = self._normalize(exclude, 'glob', root, cwd, auditor) |
|
103 | kindpats = self._normalize(exclude, 'glob', root, cwd, auditor) | |
98 | self.excludepat, em = _buildmatch(ctx, kindpats, '(?:/|$)', |
|
104 | self.excludepat, em = _buildmatch(ctx, kindpats, '(?:/|$)', | |
99 | listsubrepos) |
|
105 | listsubrepos) | |
|
106 | self._excluderoots.update(_roots(kindpats)) | |||
|
107 | self._excluderoots.discard('.') | |||
100 | matchfns.append(lambda f: not em(f)) |
|
108 | matchfns.append(lambda f: not em(f)) | |
101 | if exact: |
|
109 | if exact: | |
102 | if isinstance(patterns, list): |
|
110 | if isinstance(patterns, list): | |
@@ -177,10 +185,25 class match(object): | |||||
177 | return set(util.dirs(self._fileroots)) | set(['.']) |
|
185 | return set(util.dirs(self._fileroots)) | set(['.']) | |
178 |
|
186 | |||
179 | def visitdir(self, dir): |
|
187 | def visitdir(self, dir): | |
|
188 | '''Decides whether a directory should be visited based on whether it | |||
|
189 | has potential matches in it or one of its subdirectories. This is | |||
|
190 | based on the match's primary, included, and excluded patterns. | |||
|
191 | ||||
|
192 | This function's behavior is undefined if it has returned False for | |||
|
193 | one of the dir's parent directories. | |||
|
194 | ''' | |||
|
195 | if dir in self._excluderoots: | |||
|
196 | return False | |||
|
197 | parentdirs = None | |||
|
198 | if (self._includeroots and dir not in self._includeroots and | |||
|
199 | dir not in self._includedirs): | |||
|
200 | parentdirs = util.finddirs(dir) | |||
|
201 | if not any(parent in self._includeroots for parent in parentdirs): | |||
|
202 | return False | |||
180 | return (not self._fileroots or '.' in self._fileroots or |
|
203 | return (not self._fileroots or '.' in self._fileroots or | |
181 | dir in self._fileroots or dir in self._dirs or |
|
204 | dir in self._fileroots or dir in self._dirs or | |
182 | any(parentdir in self._fileroots |
|
205 | any(parentdir in self._fileroots | |
183 | for parentdir in util.finddirs(dir))) |
|
206 | for parentdir in parentdirs or util.finddirs(dir))) | |
184 |
|
207 | |||
185 | def exact(self, f): |
|
208 | def exact(self, f): | |
186 | '''Returns True if f is in .files().''' |
|
209 | '''Returns True if f is in .files().''' |
@@ -280,3 +280,100 Turning off treemanifest config has no e | |||||
280 | 0 0 125 0 4 63c9c0557d24 000000000000 000000000000 |
|
280 | 0 0 125 0 4 63c9c0557d24 000000000000 000000000000 | |
281 | 1 125 109 0 5 23d12a1f6e0e 000000000000 000000000000 |
|
281 | 1 125 109 0 5 23d12a1f6e0e 000000000000 000000000000 | |
282 | 2 234 55 0 6 3cb2d87b4250 23d12a1f6e0e 000000000000 |
|
282 | 2 234 55 0 6 3cb2d87b4250 23d12a1f6e0e 000000000000 | |
|
283 | ||||
|
284 | Create deeper repo with tree manifests. | |||
|
285 | ||||
|
286 | $ cd .. | |||
|
287 | $ hg --config experimental.treemanifest=True init deeprepo | |||
|
288 | $ cd deeprepo | |||
|
289 | ||||
|
290 | $ mkdir a | |||
|
291 | $ mkdir b | |||
|
292 | $ mkdir b/bar | |||
|
293 | $ mkdir b/bar/orange | |||
|
294 | $ mkdir b/bar/orange/fly | |||
|
295 | $ mkdir b/foo | |||
|
296 | $ mkdir b/foo/apple | |||
|
297 | $ mkdir b/foo/apple/bees | |||
|
298 | ||||
|
299 | $ touch a/one.txt | |||
|
300 | $ touch a/two.txt | |||
|
301 | $ touch b/bar/fruits.txt | |||
|
302 | $ touch b/bar/orange/fly/gnat.py | |||
|
303 | $ touch b/bar/orange/fly/housefly.txt | |||
|
304 | $ touch b/foo/apple/bees/flower.py | |||
|
305 | $ touch c.txt | |||
|
306 | $ touch d.py | |||
|
307 | ||||
|
308 | $ hg ci -Aqm 'initial' | |||
|
309 | ||||
|
310 | We'll see that visitdir works by removing some treemanifest revlogs and running | |||
|
311 | the files command with various parameters. | |||
|
312 | ||||
|
313 | Test files from the root. | |||
|
314 | ||||
|
315 | $ hg files -r . | |||
|
316 | a/one.txt | |||
|
317 | a/two.txt | |||
|
318 | b/bar/fruits.txt | |||
|
319 | b/bar/orange/fly/gnat.py | |||
|
320 | b/bar/orange/fly/housefly.txt | |||
|
321 | b/foo/apple/bees/flower.py | |||
|
322 | c.txt | |||
|
323 | d.py | |||
|
324 | ||||
|
325 | Test files for a subdirectory. | |||
|
326 | ||||
|
327 | $ mv .hg/store/meta/a oldmf | |||
|
328 | $ hg files -r . b | |||
|
329 | b/bar/fruits.txt | |||
|
330 | b/bar/orange/fly/gnat.py | |||
|
331 | b/bar/orange/fly/housefly.txt | |||
|
332 | b/foo/apple/bees/flower.py | |||
|
333 | $ mv oldmf .hg/store/meta/a | |||
|
334 | ||||
|
335 | Test files with just includes and excludes. | |||
|
336 | ||||
|
337 | $ mv .hg/store/meta/a oldmf | |||
|
338 | $ mv .hg/store/meta/b/bar/orange/fly oldmf2 | |||
|
339 | $ mv .hg/store/meta/b/foo/apple/bees oldmf3 | |||
|
340 | $ hg files -r . -I b/bar -X b/bar/orange/fly -I b/foo -X b/foo/apple/bees | |||
|
341 | b/bar/fruits.txt | |||
|
342 | $ mv oldmf .hg/store/meta/a | |||
|
343 | $ mv oldmf2 .hg/store/meta/b/bar/orange/fly | |||
|
344 | $ mv oldmf3 .hg/store/meta/b/foo/apple/bees | |||
|
345 | ||||
|
346 | Test files for a subdirectory, excluding a directory within it. | |||
|
347 | ||||
|
348 | $ mv .hg/store/meta/a oldmf | |||
|
349 | $ mv .hg/store/meta/b/foo oldmf2 | |||
|
350 | $ hg files -r . -X b/foo b | |||
|
351 | b/bar/fruits.txt | |||
|
352 | b/bar/orange/fly/gnat.py | |||
|
353 | b/bar/orange/fly/housefly.txt | |||
|
354 | $ mv oldmf .hg/store/meta/a | |||
|
355 | $ mv oldmf2 .hg/store/meta/b/foo | |||
|
356 | ||||
|
357 | Test files for a sub directory, including only a directory within it, and | |||
|
358 | including an unrelated directory. | |||
|
359 | ||||
|
360 | $ mv .hg/store/meta/a oldmf | |||
|
361 | $ mv .hg/store/meta/b/foo oldmf2 | |||
|
362 | $ hg files -r . -I b/bar/orange -I a b | |||
|
363 | b/bar/orange/fly/gnat.py | |||
|
364 | b/bar/orange/fly/housefly.txt | |||
|
365 | $ mv oldmf .hg/store/meta/a | |||
|
366 | $ mv oldmf2 .hg/store/meta/b/foo | |||
|
367 | ||||
|
368 | Test files for a pattern, including a directory, and excluding a directory | |||
|
369 | within that. | |||
|
370 | ||||
|
371 | $ mv .hg/store/meta/a oldmf | |||
|
372 | $ mv .hg/store/meta/b/foo oldmf2 | |||
|
373 | $ mv .hg/store/meta/b/bar/orange oldmf3 | |||
|
374 | $ hg files -r . glob:**.txt -I b/bar -X b/bar/orange | |||
|
375 | b/bar/fruits.txt | |||
|
376 | $ mv oldmf .hg/store/meta/a | |||
|
377 | $ mv oldmf2 .hg/store/meta/b/foo | |||
|
378 | $ mv oldmf3 .hg/store/meta/b/bar/orange | |||
|
379 |
General Comments 0
You need to be logged in to leave comments.
Login now