# HG changeset patch # User Alexis S. L. Carvalho # Date 1200772876 7200 # Node ID afa1e6122be7cb89fef60c55364ee247222b10ff # Parent afb7bdf11a61a7d8fc7dedcd7d0395184cba7a0e 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. diff -r afb7bdf11a61 -r afa1e6122be7 mercurial/localrepo.py --- 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.