[PATCH 2 of 2 V2] strip: take branch into account when selecting update target (issue5540)
Matt Harbison
mharbison72 at gmail.com
Sat Oct 7 01:01:08 EDT 2017
On Fri, 06 Oct 2017 12:17:17 -0400, Paul Morelle
<paul.morelle at octobus.net> wrote:
> # HG changeset patch
> # User Paul Morelle <paul.morelle at octobus.net>
> # Date 1507212785 -7200
> # Thu Oct 05 16:13:05 2017 +0200
> # Node ID 18c8fa9b75ba1c7b0dfd984cf78d35d0a467ab24
> # Parent ae82f66cd58f85264e756f7a718ae9fbae5f17db
> # EXP-Topic issue-5540
> # Available At https://bitbucket.org/octobus/mercurial-devel/
> # hg pull https://bitbucket.org/octobus/mercurial-devel/ -r
> 18c8fa9b75ba
> strip: take branch into account when selecting update target (issue5540)
>
> Test contributed by Matt Harbison
>
> Keep the same behavior in most cases (i.e. first parent of the first
> root of
> stripped changsets), but if the branch differs from wdir's, try to find
> another
> parent of stripped commits that is on the same branch.
>
> diff -r ae82f66cd58f -r 18c8fa9b75ba hgext/strip.py
> --- a/hgext/strip.py Thu Oct 05 15:11:34 2017 +0200
> +++ b/hgext/strip.py Thu Oct 05 16:13:05 2017 +0200
> @@ -60,10 +60,18 @@
> def _find_update_target(repo, revs):
> urev, p2 = repo.changelog.parents(revs[0])
> + current_branch = repo[None].branch()
> if (util.safehasattr(repo, 'mq') and p2 != nullid
> and p2 in [x.node for x in repo.mq.applied]):
> urev = p2
> + elif current_branch != repo[urev].branch():
> + revset = "(parents(%ln::parents(wdir())) -
> %ln::parents(wdir()))" \
> + + " and branch(%s)"
> + branch_targets = repo.revs(revset, revs, revs, current_branch)
> + if branch_targets:
> + cl = repo.changelog
> + urev = min(cl.node(r) for r in branch_targets)
Should this be max() instead of min(), to get the node closest to wdir?
Updating way back might be surprising. I didn't try making a more
elaborate test, so maybe not. I'm thinking, for example, developer A
keeps pulling and merging from developer B, both using the same named
branch. Then strip the first merge.
> return urev
> diff -r ae82f66cd58f -r 18c8fa9b75ba tests/test-strip.t
> --- a/tests/test-strip.t Thu Oct 05 15:11:34 2017 +0200
> +++ b/tests/test-strip.t Thu Oct 05 16:13:05 2017 +0200
> @@ -941,6 +941,146 @@
> abort: boom
> [255]
> +test stripping a working directory parent doesn't switch named branches
> +
> + $ hg log -G
> + @ changeset: 1:eca11cf91c71
> + | tag: tip
> + | user: test
> + | date: Thu Jan 01 00:00:00 1970 +0000
> + | summary: commitB
> + |
> + o changeset: 0:105141ef12d0
> + user: test
> + date: Thu Jan 01 00:00:00 1970 +0000
> + summary: commitA
> +
> +
> + $ hg branch new-branch
> + marked working directory as branch new-branch
> + (branches are permanent and global, did you want a bookmark?)
> + $ hg ci -m "start new branch"
> + $ echo 'foo' > foo.txt
> + $ hg ci -Aqm foo
> + $ hg up default
> + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
> + $ echo 'bar' > bar.txt
> + $ hg ci -Aqm bar
> + $ hg up new-branch
> + 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
> + $ hg merge default
> + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
> + (branch merge, don't forget to commit)
> + $ hg ci -m merge
> + $ hg log -G
> + @ changeset: 5:4cf5e92caec2
> + |\ branch: new-branch
> + | | tag: tip
> + | | parent: 3:f62c6c09b707
> + | | parent: 4:35358f982181
> + | | user: test
> + | | date: Thu Jan 01 00:00:00 1970 +0000
> + | | summary: merge
> + | |
> + | o changeset: 4:35358f982181
> + | | parent: 1:eca11cf91c71
> + | | user: test
> + | | date: Thu Jan 01 00:00:00 1970 +0000
> + | | summary: bar
> + | |
> + o | changeset: 3:f62c6c09b707
> + | | branch: new-branch
> + | | user: test
> + | | date: Thu Jan 01 00:00:00 1970 +0000
> + | | summary: foo
> + | |
> + o | changeset: 2:b1d33a8cadd9
> + |/ branch: new-branch (glob)
Windows doesn't like this glob, and Linux seems OK without it too.
> + | user: test
> + | date: Thu Jan 01 00:00:00 1970 +0000
> + | summary: start new branch
> + |
> + o changeset: 1:eca11cf91c71
> + | user: test
> + | date: Thu Jan 01 00:00:00 1970 +0000
> + | summary: commitB
> + |
> + o changeset: 0:105141ef12d0
> + user: test
> + date: Thu Jan 01 00:00:00 1970 +0000
> + summary: commitA
> +
> +
> + $ hg strip -r 35358f982181
If I comment out the commit for the merge above the DAG and use --force on
this strip, it updates to eca11cf91c71. I'd expect it to still update to
f62c6c09b707, since that's the same named branch.
> + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
> + saved backup bundle to
> $TESTTMP/issue4736/.hg/strip-backup/35358f982181-a6f020aa-backup.hg
> (glob)
> + $ hg log -G
> + @ changeset: 3:f62c6c09b707
> + | branch: new-branch
> + | tag: tip
> + | user: test
> + | date: Thu Jan 01 00:00:00 1970 +0000
> + | summary: foo
> + |
> + o changeset: 2:b1d33a8cadd9
> + | branch: new-branch
> + | user: test
> + | date: Thu Jan 01 00:00:00 1970 +0000
> + | summary: start new branch
> + |
> + o changeset: 1:eca11cf91c71
> + | user: test
> + | date: Thu Jan 01 00:00:00 1970 +0000
> + | summary: commitB
> + |
> + o changeset: 0:105141ef12d0
> + user: test
> + date: Thu Jan 01 00:00:00 1970 +0000
> + summary: commitA
> +
More information about the Mercurial-devel
mailing list