[PATCH 1 of 2 RESENT] strip: introduce a soft strip option
Gregory Szorc
gregory.szorc at gmail.com
Mon Feb 25 21:32:52 EST 2019
I have queued this series!
I think there's room to work on the terminology and the user-facing bits.
But this feature is experimental and this all can be worked on later.
I think the most important user-facing issue is differentiating "archived"
changesets in `hg log` output. In the test added in this commit, `hg log -G
--hidden` doesn't at all indicate that a changeset is archived. With
obsolete changesets, we use "x" for the node character. Should we recycle
this symbol for archived changesets or use something else? We should at
least add a label to the changeset so the templating layer can color things
differently, if it doesn't already do so. (I suspect it does since phases
translate to labels.)
I think we'll also want some output when changesets are promoted from
archived back to something visible. The last test in this patch
demonstrates that nothing special is printed and the `hg unbundle`
operation looks like a no-op! We'll probably want to do something similar
to the messaging we now print during `hg pull` regarding phase changes.
This is a great feature and it will vastly improve performance for people
not using evolve. I look forward to seeing it stabilized!
On Wed, Feb 13, 2019 at 6:38 AM Boris Feld <boris.feld at octobus.net> wrote:
> # HG changeset patch
> # User Boris Feld <boris.feld at octobus.net>
> # Date 1539697680 -7200
> # Tue Oct 16 15:48:00 2018 +0200
> # Node ID 61ec4a834e2c88056ff47c0d3a7ff3bcb0f0d912
> # Parent 61415361e90684a8c7a031413e9182f51937c2e7
> # EXP-Topic archived-phase-UX
> # Available At https://bitbucket.org/octobus/mercurial-devel/
> # hg pull https://bitbucket.org/octobus/mercurial-devel/ -r
> 61ec4a834e2c
> 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 discussed during the Stockholm sprint, using
> the archived phase for hiding changesets.
>
> The archived phase behaves exactly as stripping: changesets are no longer
> visible, but pulling/unbundling them will make then reappear. The only
> notable
> difference is that unlike hard stripping, soft stripping does not affect
> obsmarkers.
>
> The next changeset will make use of the archived phase for history
> rewriting
> command. However, having a way to manually trigger the feature first seems
> a
> necessary step before exposing users to this phase; there is a way to
> un-archived changesets (unbundling), so there must be a way to archive them
> again.
>
> Adding a 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 flag is experimental so
> it
> won't be exposed by default.
>
> Using the archived phase is faster and less traumatic for the repository
> than
> actually stripping changesets.
>
> 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', None,
> + _("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
> +
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.mercurial-scm.org/pipermail/mercurial-devel/attachments/20190225/ae09f47a/attachment.html>
More information about the Mercurial-devel
mailing list