11 from mercurial import ( |
11 from mercurial import ( |
12 changegroup, |
12 changegroup, |
13 error, |
13 error, |
14 extensions, |
14 extensions, |
15 manifest, |
15 manifest, |
|
16 match as matchmod, |
16 mdiff, |
17 mdiff, |
17 node, |
18 node, |
18 revlog, |
19 revlog, |
19 util, |
20 util, |
20 ) |
21 ) |
21 |
22 |
22 def setup(): |
23 def setup(): |
23 |
24 |
|
25 def _cgmatcher(cgpacker): |
|
26 localmatcher = getattr(cgpacker._repo, 'narrowmatch', lambda: None)() |
|
27 remotematcher = getattr(cgpacker, '_narrow_matcher', lambda: None)() |
|
28 if localmatcher and remotematcher: |
|
29 return matchmod.intersectmatchers(localmatcher, remotematcher) |
|
30 else: |
|
31 return localmatcher or remotematcher |
|
32 |
24 def prune(orig, self, revlog, missing, commonrevs): |
33 def prune(orig, self, revlog, missing, commonrevs): |
25 if isinstance(revlog, manifest.manifestrevlog): |
34 if isinstance(revlog, manifest.manifestrevlog): |
26 matcher = getattr(self._repo, 'narrowmatch', |
35 matcher = _cgmatcher(self) |
27 getattr(self, '_narrow_matcher', None)) |
36 if (matcher and |
28 if (matcher is not None and |
37 not matcher.visitdir(revlog._dir[:-1] or '.')): |
29 not matcher().visitdir(revlog._dir[:-1] or '.')): |
|
30 return [] |
38 return [] |
31 return orig(self, revlog, missing, commonrevs) |
39 return orig(self, revlog, missing, commonrevs) |
32 |
40 |
33 extensions.wrapfunction(changegroup.cg1packer, 'prune', prune) |
41 extensions.wrapfunction(changegroup.cg1packer, 'prune', prune) |
34 |
42 |
35 def generatefiles(orig, self, changedfiles, linknodes, commonrevs, |
43 def generatefiles(orig, self, changedfiles, linknodes, commonrevs, |
36 source): |
44 source): |
37 matcher = getattr(self._repo, 'narrowmatch', |
45 matcher = _cgmatcher(self) |
38 getattr(self, '_narrow_matcher', None)) |
46 if matcher: |
39 if matcher is not None: |
47 changedfiles = filter(matcher, changedfiles) |
40 narrowmatch = matcher() |
|
41 changedfiles = [f for f in changedfiles if narrowmatch(f)] |
|
42 if getattr(self, 'is_shallow', False): |
48 if getattr(self, 'is_shallow', False): |
43 # See comment in generate() for why this sadness is a thing. |
49 # See comment in generate() for why this sadness is a thing. |
44 mfdicts = self._mfdicts |
50 mfdicts = self._mfdicts |
45 del self._mfdicts |
51 del self._mfdicts |
46 # In a shallow clone, the linknodes callback needs to also include |
52 # In a shallow clone, the linknodes callback needs to also include |