hgext/narrow/narrowchangegroup.py
changeset 36467 2d82a24d0c78
parent 36465 94709406f10d
child 36472 d0d5eef57fb0
equal deleted inserted replaced
36466:a8b4d7673d8e 36467:2d82a24d0c78
    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