[PATCH 6 of 7] strip: introduce a soft strip option
Boris Feld
boris.feld at octobus.net
Wed Jan 2 17:35:54 EST 2019
# HG changeset patch
# User Boris Feld <boris.feld at octobus.net>
# Date 1539697680 -7200
# Tue Oct 16 15:48:00 2018 +0200
# Node ID a82909c0da7cc07ea1a46690ffc08e45ebc14af6
# Parent 65488c7d2e933cdb2ab1c36b3887a8a67a24fc60
# EXP-Topic archived-phase-UX
# Available At https://bitbucket.org/octobus/mercurial-devel/
# hg pull https://bitbucket.org/octobus/mercurial-devel/ -r a82909c0da7c
strip: introduce a soft strip option
This is the first user-accessible way to use the archived phase introduced in
4.8. This implements a feature implemented during the Stockholm sprint. The
archived phase behave as stripping, changesets are no longer accessible, but
pulling/unbundling them will make then reappear. The only notable difference
is that unlike hard stripping, soft stripping does not affect obsmarkers.
Adding flag to strip is a good way to provide access to the feature without
taking a too big risk on the final UI we want.
The next changeset will make use of the archived phase for history rewriting
command. However, having a way to manually trigger the feature first seemed
better.
Using the archived phase is faster and less traumatic for the repository.
diff --git a/hgext/strip.py b/hgext/strip.py
--- a/hgext/strip.py
+++ b/hgext/strip.py
@@ -76,7 +76,8 @@ def _findupdatetarget(repo, nodes):
return unode
-def strip(ui, repo, revs, update=True, backup=True, force=None, bookmarks=None):
+def strip(ui, repo, revs, update=True, backup=True, force=None, bookmarks=None,
+ soft=False):
with repo.wlock(), repo.lock():
if update:
@@ -85,7 +86,10 @@ def strip(ui, repo, revs, update=True, b
hg.clean(repo, urev)
repo.dirstate.write(repo.currenttransaction())
- repair.strip(ui, repo, revs, backup)
+ if soft:
+ repair.softstrip(ui, repo, revs, backup)
+ else:
+ repair.strip(ui, repo, revs, backup)
repomarks = repo._bookmarks
if bookmarks:
@@ -110,7 +114,10 @@ def strip(ui, repo, revs, update=True, b
('k', 'keep', None, _("do not modify working directory during "
"strip")),
('B', 'bookmark', [], _("remove revs only reachable from given"
- " bookmark"), _('BOOKMARK'))],
+ " bookmark"), _('BOOKMARK')),
+ ('', 'soft', [],
+ _("simply drop changesets from visible history (EXPERIMENTAL)")),
+ ],
_('hg strip [-k] [-f] [-B bookmark] [-r] REV...'),
helpcategory=command.CATEGORY_MAINTENANCE)
def stripcmd(ui, repo, *revs, **opts):
@@ -235,6 +242,7 @@ def stripcmd(ui, repo, *revs, **opts):
strip(ui, repo, revs, backup=backup, update=update,
- force=opts.get('force'), bookmarks=bookmarks)
+ force=opts.get('force'), bookmarks=bookmarks,
+ soft=opts['soft'])
return 0
diff --git a/mercurial/repair.py b/mercurial/repair.py
--- a/mercurial/repair.py
+++ b/mercurial/repair.py
@@ -252,6 +252,24 @@ def strip(ui, repo, nodelist, backup=Tru
# extensions can use it
return backupfile
+def softstrip(ui, repo, nodelist, backup=True, topic='backup'):
+ """perform a "soft" strip using the archived phase"""
+ tostrip = [c.node() for c in repo.set('sort(%ln::)', nodelist)]
+ if not tostrip:
+ return None
+
+ newbmtarget, updatebm = _bookmarkmovements(repo, tostrip)
+ if backup:
+ node = tostrip[0]
+ backupfile = _createstripbackup(repo, tostrip, node, topic)
+
+ with repo.transaction('strip') as tr:
+ phases.retractboundary(repo, tr, phases.archived, tostrip)
+ bmchanges = [(m, repo[newbmtarget].node()) for m in updatebm]
+ repo._bookmarks.applychanges(repo, tr, bmchanges)
+ return backupfile
+
+
def _bookmarkmovements(repo, tostrip):
# compute necessary bookmark movement
bm = repo._bookmarks
diff --git a/tests/test-phase-archived.t b/tests/test-phase-archived.t
new file mode 100644
--- /dev/null
+++ b/tests/test-phase-archived.t
@@ -0,0 +1,77 @@
+=========================================================
+Test features and behaviors related to the archived phase
+=========================================================
+
+ $ cat << EOF >> $HGRCPATH
+ > [format]
+ > internal-phase=yes
+ > [extensions]
+ > strip=
+ > [experimental]
+ > EOF
+
+ $ hg init repo
+ $ cd repo
+ $ echo root > a
+ $ hg add a
+ $ hg ci -m 'root'
+
+Test that bundle can unarchive a changeset
+------------------------------------------
+
+ $ echo foo >> a
+ $ hg st
+ M a
+ $ hg ci -m 'unbundletesting'
+ $ hg log -G
+ @ changeset: 1:883aadbbf309
+ | tag: tip
+ | 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 strip --soft --rev '.'
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ saved backup bundle to $TESTTMP/repo/.hg/strip-backup/883aadbbf309-efc55adc-backup.hg
+ $ hg log -G
+ @ changeset: 0:c1863a3840c6
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: root
+
+ $ hg log -G --hidden
+ o changeset: 1:883aadbbf309
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: unbundletesting
+ |
+ @ changeset: 0:c1863a3840c6
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: root
+
+ $ hg unbundle .hg/strip-backup/883aadbbf309-efc55adc-backup.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
+ o changeset: 1:883aadbbf309
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: unbundletesting
+ |
+ @ changeset: 0:c1863a3840c6
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: root
+
More information about the Mercurial-devel
mailing list