diff --git a/hgext/mq.py b/hgext/mq.py --- a/hgext/mq.py +++ b/hgext/mq.py @@ -1043,8 +1043,7 @@ class queue(object): repo.dirstate.write() self.removeundo(repo) - for rev in revs: - repair.strip(self.ui, repo, rev, backup) + repair.strip(self.ui, repo, revs, backup) # strip may have unbundled a set of backed up revisions after # the actual strip self.removeundo(repo) diff --git a/mercurial/repair.py b/mercurial/repair.py --- a/mercurial/repair.py +++ b/mercurial/repair.py @@ -54,10 +54,13 @@ def _collectbrokencsets(repo, files, str return s -def strip(ui, repo, node, backup="all"): +def strip(ui, repo, nodelist, backup="all"): cl = repo.changelog # TODO delete the undo files, and handle undo of merge sets - striprev = cl.rev(node) + if isinstance(nodelist, str): + nodelist = [nodelist] + striplist = [cl.rev(node) for node in nodelist] + striprev = min(striplist) keeppartialbundle = backup == 'strip' @@ -68,8 +71,10 @@ def strip(ui, repo, node, backup="all"): # the list of heads and bases of the set of interesting revisions. # (head = revision in the set that has no descendant in the set; # base = revision in the set that has no ancestor in the set) - tostrip = set(cl.descendants(striprev)) - tostrip.add(striprev) + tostrip = set(striplist) + for rev in striplist: + for desc in cl.descendants(rev): + tostrip.add(desc) files = _collectfiles(repo, striprev) saverevs = _collectbrokencsets(repo, files, striprev) @@ -88,6 +93,7 @@ def strip(ui, repo, node, backup="all"): descendants = set(cl.descendants(*saverevs)) saverevs.difference_update(descendants) savebases = [cl.node(r) for r in saverevs] + stripbases = [cl.node(r) for r in tostrip] bm = repo._bookmarks updatebm = [] @@ -99,7 +105,7 @@ def strip(ui, repo, node, backup="all"): # create a changegroup for all the branches we need to keep backupfile = None if backup == "all": - backupfile = _bundle(repo, [node], cl.heads(), node, 'backup') + backupfile = _bundle(repo, stripbases, cl.heads(), node, 'backup') repo.ui.status(_("saved backup bundle to %s\n") % backupfile) if saveheads or savebases: # do not compress partial bundle if we remove it from disk later diff --git a/tests/test-mq-strip.t b/tests/test-mq-strip.t --- a/tests/test-mq-strip.t +++ b/tests/test-mq-strip.t @@ -311,7 +311,6 @@ 2 different branches: 2 strips $ hg strip 2 4 0 files updated, 0 files merged, 0 files removed, 0 files unresolved saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) - saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) $ hg glog @ changeset: 2:65bd5f99a4a3 | tag: tip @@ -421,3 +420,13 @@ Verify strip protects against stripping $ hg status M bar ? b + $ cd .. + +stripping many nodes on a complex graph (issue3299) + + $ hg init issue3299 + $ cd issue3299 + $ hg debugbuilddag '@a.:a@b.:b.:x