# HG changeset patch # User Pulkit Goyal # Date 2018-09-28 16:18:17 # Node ID ad9ca365738b3bf7fa484aba9d29d4d5c1ad6661 # Parent 1a7d901a0a0c6c93e738595b6b3ea59d3d04fdf2 narrow: factor out logic to create cg while widening into separate fn This patch takes out the logic which generates a changegroup for widening a narrow clone when ellipses are disabled. This is done because future patches will introduce a narrow_widen() wireprotocol command which will send a bundle2 with changegroup and will use this function. The new function for now returns just the changegroup for compatibility with existing code, but in future patches, when we establish a wireprotocol command and call this function from there, this will return the required bundle2. Differential Revision: https://phab.mercurial-scm.org/D4786 diff --git a/hgext/narrow/narrowbundle2.py b/hgext/narrow/narrowbundle2.py --- a/hgext/narrow/narrowbundle2.py +++ b/hgext/narrow/narrowbundle2.py @@ -51,6 +51,41 @@ def getrepocaps_narrow(orig, repo, **kwa caps[NARROWCAP] = ['v0'] return caps +def widen_bundle(repo, diffmatcher, common, known, cgversion, source, ellipses): + """generates changegroup for widening a narrow clone + + repo is the localrepository instance + diffmatcher is a differencemacther of '(newincludes, newexcludes) - + (oldincludes, oldexcludes)' + common is set of common revs between server and client + known is a set of revs known on the client side (used in ellipses) + cgversion is the changegroup version to send + source is the command which called this codepath + ellipses is boolean value telling whether to send ellipses data or not + + returns changegroup data of the changegroup built or return None if there + are no common revs + """ + # XXX: This patch will start sending bundle2 after couple of patches when + # called from the wireprotocol command + common = repo.revs("::%ln", common) + commonnodes = set() + cl = repo.changelog + for c in common: + commonnodes.add(cl.node(c)) + if commonnodes: + # XXX: we should only send the filelogs (and treemanifest). user + # already has the changelog and manifest + packer = changegroup.getbundler(cgversion, repo, + filematcher=diffmatcher, + fullnodes=commonnodes) + cgdata = packer.generate(set([nullid]), list(commonnodes), False, + source, changelog=False) + + return cgdata + + return None + def getbundlechangegrouppart_widen(bundler, repo, source, bundlecaps=None, b2caps=None, heads=None, common=None, **kwargs): @@ -79,20 +114,9 @@ def getbundlechangegrouppart_widen(bundl common = set(common or [nullid]) if (oldinclude != include or oldexclude != exclude): - common = repo.revs("::%ln", common) - commonnodes = set() - cl = repo.changelog - for c in common: - commonnodes.add(cl.node(c)) - if commonnodes: - # XXX: we should only send the filelogs (and treemanifest). user - # already has the changelog and manifest - packer = changegroup.getbundler(version, repo, - filematcher=diffmatch, - fullnodes=commonnodes) - cgdata = packer.generate(set([nullid]), list(commonnodes), False, - source, changelog=False) - + cgdata = widen_bundle(repo, diffmatch, common, [], version, + source, False) + if cgdata is not None: part = bundler.newpart('changegroup', data=cgdata) part.addparam('version', version) if 'treemanifest' in repo.requirements: