[PATCH 5 of 9] localrepo: changegroupsubset collects shallow changeset, manifest and file nodes
Faheem Mitha
faheem at email.unc.edu
Tue Jul 6 05:58:13 CDT 2010
On Tue, 06 Jul 2010 16:17:04 +0530, Vishakh H <vsh426 at gmail.com> wrote:
> # HG changeset patch
> # User Vishakh H <vsh426 at gmail.com>
> # Date 1278412035 -19800
> # Branch stable
> # Node ID e9de925ecfaf793340e787d8255f3a4571cfb813
> # Parent b3c06c23e6b618dc4ad6a94036d49c19432c2441
> localrepo: changegroupsubset collects shallow changeset, manifest and file nodes
>
> while generating groups of revisions, we collect the corresponsing nodes
corresponding
> using the collector functions. it is needed to ensure that we dont miss
don't
> nodes that are referenced by more than one changeset.
>
> this is very slow going through all revisions. otoh doing it in _changegroup
> is a bit redundant.
>
> diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
> --- a/mercurial/localrepo.py
> +++ b/mercurial/localrepo.py
> @@ -1304,7 +1304,7 @@
> bases = [nullid]
> msng_cl_lst, bases, heads = cl.nodesbetween(bases, heads)
>
> - if extranodes is None:
> + if extranodes is None and shallowroot is None:
> # can we go through the fast path ?
> heads.sort()
> allheads = self.heads()
> @@ -1348,6 +1348,15 @@
> msng_mnfst_set = {}
> # Nor do we know which filenodes are missing.
> msng_filenode_set = {}
> + # revs needed in shallow clone
> + if shallowroot is not None:
> + sh_cl = set([shallowroot])
> + sh_mnfst = [cl.read(shallowroot)[0]]
> + sh_filenode = {}
> + else:
> + sh_cl = None
> + sh_mnfst = None
> + sh_filenode = {}
>
> junk = mnfst.index[len(mnfst) - 1] # Get around a bug in lazyindex
> junk = None
> @@ -1382,7 +1391,9 @@
> # the first manifest that references it belongs to.
> def collect_msng_filenodes(mnfstnode):
> r = mnfst.rev(mnfstnode)
> - if r - 1 in mnfst.parentrevs(r):
> + if extranodes is None and shallowroot is None:
> + return
> + if r - 1 in mnfst.parentrevs(r) and mnfstnode not in sh_mnfst:
> # If the previous rev is one of the parents,
> # we only need to see a diff.
> deltamf = mnfst.readdelta(mnfstnode)
> @@ -1412,6 +1423,10 @@
> clnode = msng_mnfst_set[mnfstnode]
> ndset = msng_filenode_set.setdefault(f, {})
> ndset.setdefault(fnode, clnode)
> + if sh_mnfst is not None and mnfstnode in sh_mnfst:
> + # Get all important filenodes
> + for f in m:
> + sh_filenode.setdefault(f, []).append(m[f])
> return collect_msng_filenodes
>
> # We have a list of filenodes we think we need for a file, lets remove
> @@ -1446,12 +1461,19 @@
> if node not in nodes:
> nodes[node] = linknode
>
> + #find nodes to punch
> + def prune_shallow(nodes, sh_nodes):
> + if shallowroot is not None:
> + return [n for n in nodes if n not in sh_nodes]
> + return None
> +
> # Now that we have all theses utility functions to help out and
> # logically divide up the task, generate the group.
> def gengroup():
> # The set of changed files starts empty.
> changedfiles = {}
> - collect = changegroup.collector(cl, msng_mnfst_set, changedfiles)
> + collect = changegroup.collector(cl, msng_mnfst_set, changedfiles,
> + sh_cl, sh_mnfst)
>
> # Create a changenode group generator that will call our functions
> # back to lookup the owning changenode and collect information.
> @@ -1480,10 +1502,12 @@
> msng_mnfst_lst = msng_mnfst_set.keys()
> # Sort the manifestnodes by revision number.
> msng_mnfst_lst.sort(key=mnfst.rev)
> + sh_nodes = prune_shallow(msng_mnfst_lst, sh_mnfst)
> # Create a generator for the manifestnodes that calls our lookup
> # and data collection functions back.
> group = mnfst.group(msng_mnfst_lst, lookup_manifest_link,
> - filenode_collector(changedfiles))
> + filenode_collector(changedfiles),
> + shallownodes=sh_nodes)
> cnt = 0
> for chnk in group:
> yield chnk
> @@ -1523,11 +1547,14 @@
> yield fname
> # Sort the filenodes by their revision #
> msng_filenode_lst.sort(key=filerevlog.rev)
> + sh_nodes = prune_shallow(msng_filenode_lst,
> + sh_filenode.get(fname, []))
> # Create a group generator and only pass in a changenode
> # lookup function as we need to collect no information
> # from filenodes.
> group = filerevlog.group(msng_filenode_lst,
> - lookup_filenode_link_func(fname))
> + lookup_filenode_link_func(fname),
> + shallownodes=sh_nodes)
> for chnk in group:
> self.ui.progress(
> _('bundling files'), cnt, item=fname, unit=_('chunks'))
More information about the Mercurial-devel
mailing list