# HG changeset patch # User Boris Feld <boris.f...@octobus.net> # Date 1539697680 -7200 # Tue Oct 16 15:48:00 2018 +0200 # Branch stable # Node ID 4285aa379de0ffdfb68c6a2920a0d09f037dfa2e # Parent 13c23396c7fe1633a2336b29e3a32b9b76274f28 # EXP-Topic archived-phase-UX # Available At https://bitbucket.org/octobus/mercurial-devel/ # hg pull https://bitbucket.org/octobus/mercurial-devel/ -r 4285aa379de0 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 + _______________________________________________ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel