# HG changeset patch # User Matt Mackall # Date 1301597765 18000 # Node ID 7b7c1d9d08ab463929ae023147fb8c257846d4c8 # Parent b975a326aec084d1eed948cb6e34a88e53124410 changegroup: unnest flookup diff -r b975a326aec0 -r 7b7c1d9d08ab mercurial/localrepo.py --- a/mercurial/localrepo.py Thu Mar 31 12:04:54 2011 -0500 +++ b/mercurial/localrepo.py Thu Mar 31 13:56:05 2011 -0500 @@ -1479,6 +1479,7 @@ mfs = {} # needed manifests fnodes = {} # needed file nodes changedfiles = set() + fstate = ['', {}] count = [0] # can we go through the fast path ? @@ -1515,6 +1516,12 @@ unit=_('manifests'), total=len(mfs)) return mfs[x] + def flookup(revlog, x): + self.ui.progress( + _('bundling'), count[0], item=fstate[0], + unit=_('files'), total=len(changedfiles)) + return fstate[1][x] + # Now that we have all theses utility functions to help out and # logically divide up the task, generate the group. def gengroup(): @@ -1522,7 +1529,6 @@ # back to lookup the owning changenode and collect information. for chunk in cl.group(csets, clookup): yield chunk - efiles = len(changedfiles) self.ui.progress(_('bundling'), None) # Create a generator for the manifestnodes that calls our lookup @@ -1535,29 +1541,21 @@ mfs.clear() # Go through all our files in order sorted by name. - for idx, fname in enumerate(sorted(changedfiles)): + count[0] = 0 + for fname in sorted(changedfiles): filerevlog = self.file(fname) if not len(filerevlog): raise util.Abort(_("empty or missing revlog for %s") % fname) - # Toss out the filenodes that the recipient isn't really - # missing. - missingfnodes = fnodes.pop(fname, {}) + fstate[0] = fname + fstate[1] = fnodes.pop(fname, {}) first = True - def flookup(revlog, x): - # even though we print the same progress on - # most loop iterations, put the progress call - # here so that time estimates (if any) can be updated - self.ui.progress( - _('bundling'), idx, item=fname, - unit=_('files'), total=efiles) - return missingfnodes[x] - - for chunk in filerevlog.group(prune(filerevlog, missingfnodes), + for chunk in filerevlog.group(prune(filerevlog, fstate[1]), flookup): if first: if chunk == changegroup.closechunk(): break + count[0] += 1 yield changegroup.chunkheader(len(fname)) yield fname first = False @@ -1589,6 +1587,8 @@ mf = self.manifest mfs = {} changedfiles = set() + fstate = [''] + count = [0] self.hook('preoutgoing', throw=True, source=source) self.changegroupinfo(nodes, source) @@ -1600,51 +1600,51 @@ if log.linkrev(r) in revset: yield log.node(r) + def clookup(revlog, x): + c = cl.read(x) + changedfiles.update(c[3]) + mfs.setdefault(c[0], x) + count[0] += 1 + self.ui.progress(_('bundling'), count[0], unit=_('changesets')) + return x + + def mlookup(revlog, x): + count[0] += 1 + self.ui.progress(_('bundling'), count[0], + unit=_('manifests'), total=len(mfs)) + return cl.node(revlog.linkrev(revlog.rev(x))) + + def flookup(revlog, x): + self.ui.progress( + _('bundling'), count[0], item=fstate[0], + total=len(changedfiles), unit=_('files')) + return cl.node(revlog.linkrev(revlog.rev(x))) + def gengroup(): '''yield a sequence of changegroup chunks (strings)''' # construct a list of all changed files - count = [0] - def clookup(revlog, x): - c = cl.read(x) - changedfiles.update(c[3]) - mfs.setdefault(c[0], x) - count[0] += 1 - self.ui.progress(_('bundling'), count[0], unit=_('changesets')) - return x - for chunk in cl.group(nodes, clookup): yield chunk - efiles = len(changedfiles) - changecount = count[0] self.ui.progress(_('bundling'), None) - count = [0] - def mlookup(revlog, x): - count[0] += 1 - self.ui.progress(_('bundling'), count[0], - unit=_('manifests'), total=changecount) - return cl.node(revlog.linkrev(revlog.rev(x))) - + count[0] = 0 for chunk in mf.group(gennodelst(mf), mlookup): yield chunk self.ui.progress(_('bundling'), None) - for idx, fname in enumerate(sorted(changedfiles)): + count[0] = 0 + for fname in sorted(changedfiles): filerevlog = self.file(fname) if not len(filerevlog): raise util.Abort(_("empty or missing revlog for %s") % fname) + fstate[0] = fname first = True - def flookup(revlog, x): - self.ui.progress( - _('bundling'), idx, item=fname, - total=efiles, unit=_('files')) - return cl.node(revlog.linkrev(revlog.rev(x))) - for chunk in filerevlog.group(gennodelst(filerevlog), flookup): if first: if chunk == changegroup.closechunk(): break + count[0] += 1 yield changegroup.chunkheader(len(fname)) yield fname first = False