diff --git a/mercurial/configitems.py b/mercurial/configitems.py --- a/mercurial/configitems.py +++ b/mercurial/configitems.py @@ -470,6 +470,9 @@ coreconfigitem('experimental', 'bundleco coreconfigitem('experimental', 'changegroup3', default=False, ) +coreconfigitem('experimental', 'cleanup-as-archived', + default=False, +) coreconfigitem('experimental', 'clientcompressionengines', default=list, ) diff --git a/mercurial/scmutil.py b/mercurial/scmutil.py --- a/mercurial/scmutil.py +++ b/mercurial/scmutil.py @@ -1016,6 +1016,7 @@ def cleanupnodes(repo, replacements, ope for phase, nodes in toadvance.items(): phases.advanceboundary(repo, tr, phase, nodes) + mayusearchived = repo.ui.config('experimental', 'cleanup-as-archived') # Obsolete or strip nodes if obsolete.isenabled(repo, obsolete.createmarkersopt): # If a node is already obsoleted, and we want to obsolete it @@ -1033,6 +1034,17 @@ def cleanupnodes(repo, replacements, ope if rels: obsolete.createmarkers(repo, rels, operation=operation, metadata=metadata) + elif phases.supportinternal(repo) and mayusearchived: + # this assume we do not have "unstable" nodes above the cleaned ones + allreplaced = set() + for ns in replacements.keys(): + allreplaced.update(ns) + if backup: + from . import repair # avoid import cycle + node = min(allreplaced, key=repo.changelog.rev) + repair.backupbundle(repo, allreplaced, allreplaced, node, + operation) + phases.retractboundary(repo, tr, phases.archived, allreplaced) else: from . import repair # avoid import cycle tostrip = list(n for ns in replacements for n in ns) diff --git a/tests/test-phase-archived.t b/tests/test-phase-archived.t --- a/tests/test-phase-archived.t +++ b/tests/test-phase-archived.t @@ -75,3 +75,69 @@ Test that bundle can unarchive a changes date: Thu Jan 01 00:00:00 1970 +0000 summary: root + +Test that history rewriting command can use the archived phase when allowed to +------------------------------------------------------------------------------ + + $ hg up 'desc(unbundletesting)' + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ echo bar >> a + $ hg commit --amend --config experimental.cleanup-as-archived=yes + $ hg log -G + @ changeset: 2:d1e73e428f29 + | tag: tip + | parent: 0:c1863a3840c6 + | user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: unbundletesting + | + o changeset: 0:c1863a3840c6 + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: root + + $ hg log -G --hidden + @ changeset: 2:d1e73e428f29 + | tag: tip + | parent: 0:c1863a3840c6 + | user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: unbundletesting + | + | o changeset: 1:883aadbbf309 + |/ user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: unbundletesting + | + o changeset: 0:c1863a3840c6 + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: root + + $ ls -1 .hg/strip-backup/ + 883aadbbf309-efc55adc-amend.hg + 883aadbbf309-efc55adc-backup.hg + $ hg unbundle .hg/strip-backup/883aadbbf309*amend.hg + adding changesets + adding manifests + adding file changes + added 0 changesets with 0 changes to 1 files + (run 'hg update' to get a working copy) + $ hg log -G + @ changeset: 2:d1e73e428f29 + | tag: tip + | parent: 0:c1863a3840c6 + | user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: unbundletesting + | + | o changeset: 1:883aadbbf309 + |/ user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: unbundletesting + | + o changeset: 0:c1863a3840c6 + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: root +