rewriting: add an option for rewrite commands to use the archived phase
Using the archived phase for cleanup provide the same effect than stripping,
but in a faster, append-only way.
We keep the feature experimental for now until it gets a bit more testing.
--- a/mercurial/configitems.py Tue Oct 16 15:48:00 2018 +0200
+++ b/mercurial/configitems.py Wed Jan 02 03:07:52 2019 +0100
@@ -470,6 +470,9 @@
coreconfigitem('experimental', 'changegroup3',
default=False,
)
+coreconfigitem('experimental', 'cleanup-as-archived',
+ default=False,
+)
coreconfigitem('experimental', 'clientcompressionengines',
default=list,
)
--- a/mercurial/scmutil.py Tue Oct 16 15:48:00 2018 +0200
+++ b/mercurial/scmutil.py Wed Jan 02 03:07:52 2019 +0100
@@ -1016,6 +1016,7 @@
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 @@
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)
--- a/tests/test-phase-archived.t Tue Oct 16 15:48:00 2018 +0200
+++ b/tests/test-phase-archived.t Wed Jan 02 03:07:52 2019 +0100
@@ -75,3 +75,69 @@
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
+