changegroupsubset: accept list of per-revlog nodes to include
This will allow strip to include in the temporary changegroup some extra
file/manifest revisions that should be restored after the truncations.
This code doesn't allow specification of changelog nodes since I won't
need that right now, the code wouldn't be tested and it's probably
possible to do something similar enough by using the bases/heads
arguments.
--- a/mercurial/localrepo.py Sat Jan 19 18:01:16 2008 -0200
+++ b/mercurial/localrepo.py Sat Jan 19 18:01:16 2008 -0200
@@ -1510,7 +1510,7 @@
for node in nodes:
self.ui.debug("%s\n" % hex(node))
- def changegroupsubset(self, bases, heads, source):
+ def changegroupsubset(self, bases, heads, source, extranodes=None):
"""This function generates a changegroup consisting of all the nodes
that are descendents of any of the bases, and ancestors of any of
the heads.
@@ -1520,7 +1520,15 @@
is non-trivial.
Another wrinkle is doing the reverse, figuring out which changeset in
- the changegroup a particular filenode or manifestnode belongs to."""
+ the changegroup a particular filenode or manifestnode belongs to.
+
+ The caller can specify some nodes that must be included in the
+ changegroup using the extranodes argument. It should be a dict
+ where the keys are the filenames (or 1 for the manifest), and the
+ values are lists of (node, linknode) tuples, where node is a wanted
+ node and linknode is the changelog node that should be transmitted as
+ the linkrev.
+ """
self.hook('preoutgoing', throw=True, source=source)
@@ -1713,6 +1721,15 @@
return msngset[fnode]
return lookup_filenode_link
+ # Add the nodes that were explicitly requested.
+ def add_extra_nodes(name, nodes):
+ if not extranodes or name not in extranodes:
+ return
+
+ for node, linknode in extranodes[name]:
+ if node not in nodes:
+ nodes[node] = linknode
+
# Now that we have all theses utility functions to help out and
# logically divide up the task, generate the group.
def gengroup():
@@ -1728,6 +1745,7 @@
# The list of manifests has been collected by the generator
# calling our functions back.
prune_manifests()
+ add_extra_nodes(1, msng_mnfst_set)
msng_mnfst_lst = msng_mnfst_set.keys()
# Sort the manifestnodes by revision number.
msng_mnfst_lst.sort(cmp_by_rev_func(mnfst))
@@ -1743,6 +1761,13 @@
msng_mnfst_lst = None
msng_mnfst_set.clear()
+ if extranodes:
+ for fname in extranodes:
+ if isinstance(fname, int):
+ continue
+ add_extra_nodes(fname,
+ msng_filenode_set.setdefault(fname, {}))
+ changedfiles[fname] = 1
changedfiles = changedfiles.keys()
changedfiles.sort()
# Go through all our files in order sorted by name.