Mercurial > hg-stable
changeset 38928:a06aab274aef
changegroup: move generatefiles() from narrow
The code is a bit ugly in that it overrides the linknodes
function that is passed in as a function. I'd like to think
that the caller of generatefiles() would pass in the appropriate
function. We can clean this up later.
Differential Revision: https://phab.mercurial-scm.org/D4066
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Thu, 02 Aug 2018 12:18:35 -0700 |
parents | c9315bc578bc |
children | d706c77449f9 |
files | hgext/narrow/narrowchangegroup.py mercurial/changegroup.py |
diffstat | 2 files changed, 36 insertions(+), 35 deletions(-) [+] |
line wrap: on
line diff
--- a/hgext/narrow/narrowchangegroup.py Thu Aug 02 12:12:12 2018 -0700 +++ b/hgext/narrow/narrowchangegroup.py Thu Aug 02 12:18:35 2018 -0700 @@ -10,47 +10,12 @@ from mercurial.i18n import _ from mercurial import ( changegroup, - error, extensions, node, util, ) def setup(): - def generatefiles(orig, self, changedfiles, linknodes, commonrevs, - source): - changedfiles = list(filter(self._filematcher, changedfiles)) - - if getattr(self, 'is_shallow', False): - # See comment in generate() for why this sadness is a thing. - mfdicts = self._mfdicts - del self._mfdicts - # In a shallow clone, the linknodes callback needs to also include - # those file nodes that are in the manifests we sent but weren't - # introduced by those manifests. - commonctxs = [self._repo[c] for c in commonrevs] - oldlinknodes = linknodes - clrev = self._repo.changelog.rev - def linknodes(flog, fname): - for c in commonctxs: - try: - fnode = c.filenode(fname) - self.clrev_to_localrev[c.rev()] = flog.rev(fnode) - except error.ManifestLookupError: - pass - links = oldlinknodes(flog, fname) - if len(links) != len(mfdicts): - for mf, lr in mfdicts: - fnode = mf.get(fname, None) - if fnode in links: - links[fnode] = min(links[fnode], lr, key=clrev) - elif fnode: - links[fnode] = lr - return links - return orig(self, changedfiles, linknodes, commonrevs, source) - extensions.wrapfunction( - changegroup.cg1packer, 'generatefiles', generatefiles) - def generate(orig, self, commonrevs, clnodes, fastpathlinkrev, source): '''yield a sequence of changegroup chunks (strings)''' # Note: other than delegating to orig, the only deviation in
--- a/mercurial/changegroup.py Thu Aug 02 12:12:12 2018 -0700 +++ b/mercurial/changegroup.py Thu Aug 02 12:18:35 2018 -0700 @@ -796,6 +796,42 @@ # The 'source' parameter is useful for extensions def generatefiles(self, changedfiles, linknodes, commonrevs, source): + changedfiles = list(filter(self._filematcher, changedfiles)) + + if getattr(self, 'is_shallow', False): + # See comment in generate() for why this sadness is a thing. + mfdicts = self._mfdicts + del self._mfdicts + # In a shallow clone, the linknodes callback needs to also include + # those file nodes that are in the manifests we sent but weren't + # introduced by those manifests. + commonctxs = [self._repo[c] for c in commonrevs] + oldlinknodes = linknodes + clrev = self._repo.changelog.rev + + # Defining this function has a side-effect of overriding the + # function of the same name that was passed in as an argument. + # TODO have caller pass in appropriate function. + def linknodes(flog, fname): + for c in commonctxs: + try: + fnode = c.filenode(fname) + self.clrev_to_localrev[c.rev()] = flog.rev(fnode) + except error.ManifestLookupError: + pass + links = oldlinknodes(flog, fname) + if len(links) != len(mfdicts): + for mf, lr in mfdicts: + fnode = mf.get(fname, None) + if fnode in links: + links[fnode] = min(links[fnode], lr, key=clrev) + elif fnode: + links[fnode] = lr + return links + + return self._generatefiles(changedfiles, linknodes, commonrevs, source) + + def _generatefiles(self, changedfiles, linknodes, commonrevs, source): repo = self._repo progress = repo.ui.makeprogress(_('bundling'), unit=_('files'), total=len(changedfiles))