topics: update current topic to the topic of newly rebased commit (issue5551)
The rebase code passes branchmerge equals to True while updating to the rebased
commit. We need to make sure topic is preserved even after rebase and hence we
need to update the topic even when branchmerge argument is set to True. But
there is a twist in the tale, merge also uses this part of code and we allow to
update topic when brancmerge is True, in merge cases the topic after merge will
the topic of the destination commit, not the topic of working directory parent.
So we need the function to have information about whether a rebase is going on,
and we do it by wrapping the rebase command and storing some value in the
config. This is a bit hacky but works for now. This patch fixes issue related to
loosing of topic while rebase.
Thanks to Boris Feld for the rigourous tests.
$ . "$TESTDIR/testlib/topic_setup.sh"
Initial setup
$ cat << EOF >> $HGRCPATH
> [ui]
> logtemplate = {rev} {branch} \{{get(namespaces, "topics")}} {phase} {desc|firstline}\n
> [experimental]
> evolution=createmarkers,exchange,allowunstable
> EOF
$ hg init main
$ cd main
$ hg branch other
marked working directory as branch other
(branches are permanent and global, did you want a bookmark?)
$ echo aaa > aaa
$ hg add aaa
$ hg commit -m c_a
$ echo aaa > bbb
$ hg add bbb
$ hg commit -m c_b
$ hg branch foo
marked working directory as branch foo
$ echo aaa > ccc
$ hg add ccc
$ hg commit -m c_c
$ echo aaa > ddd
$ hg add ddd
$ hg commit -m c_d
$ echo aaa > eee
$ hg add eee
$ hg commit -m c_e
$ echo aaa > fff
$ hg add fff
$ hg commit -m c_f
$ hg log -G
@ 5 foo {} draft c_f
|
o 4 foo {} draft c_e
|
o 3 foo {} draft c_d
|
o 2 foo {} draft c_c
|
o 1 other {} draft c_b
|
o 0 other {} draft c_a
Check that topic without any parent does not crash --list
---------------------------------------------------------
$ hg up other
0 files updated, 0 files merged, 4 files removed, 0 files unresolved
$ hg stack
### branch: other
b2@ c_b (current)
b1: c_a
$ hg phase --public 'branch("other")'
$ hg up foo
4 files updated, 0 files merged, 0 files removed, 0 files unresolved
Simple test
-----------
'hg stack' list all changeset in the topic
$ hg branch
foo
$ hg stack
### branch: foo
b4@ c_f (current)
b3: c_e
b2: c_d
b1: c_c
^ c_b
Test "t#" reference
-------------------
$ hg up b2
0 files updated, 0 files merged, 2 files removed, 0 files unresolved
$ hg up foo
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg up b42
abort: cannot resolve "b42": branch "foo" has only 4 changesets
[255]
$ hg up b2
0 files updated, 0 files merged, 2 files removed, 0 files unresolved
$ hg summary
parent: 3:f61adbacd17a
c_d
branch: foo
commit: (clean)
update: 2 new changesets (update)
phases: 4 draft
Case with some of the branch unstable
------------------------------------
$ echo bbb > ddd
$ hg commit --amend
$ hg log -G
@ 7 foo {} draft c_d
|
| o 5 foo {} draft c_f
| |
| o 4 foo {} draft c_e
| |
| x 3 foo {} draft c_d
|/
o 2 foo {} draft c_c
|
o 1 other {} public c_b
|
o 0 other {} public c_a
$ hg stack
### branch: foo
b4$ c_f (unstable)
b3$ c_e (unstable)
b2@ c_d (current)
b1: c_c
^ c_b
$ hg up b3
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg stack
### branch: foo
b4$ c_f (unstable)
b3$ c_e (current unstable)
b2: c_d
b1: c_c
^ c_b
$ hg up b2
1 files updated, 0 files merged, 1 files removed, 0 files unresolved
Also test the revset:
$ hg log -r 'stack()'
abort: no active topic to list
[255]
Case with multiple heads on the topic
-------------------------------------
Make things linear again
$ hg rebase -s 'desc(c_e)' -d 'desc(c_d) - obsolete()'
rebasing 4:4f2a69f6d380 "c_e"
rebasing 5:913c298d8b0a "c_f"
$ hg log -G
o 9 foo {} draft c_f
|
o 8 foo {} draft c_e
|
@ 7 foo {} draft c_d
|
o 2 foo {} draft c_c
|
o 1 other {} public c_b
|
o 0 other {} public c_a
Create the second branch
$ hg up 'desc(c_d)'
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ echo aaa > ggg
$ hg add ggg
$ hg commit -m c_g
created new head
$ echo aaa > hhh
$ hg add hhh
$ hg commit -m c_h
$ hg log -G
@ 11 foo {} draft c_h
|
o 10 foo {} draft c_g
|
| o 9 foo {} draft c_f
| |
| o 8 foo {} draft c_e
|/
o 7 foo {} draft c_d
|
o 2 foo {} draft c_c
|
o 1 other {} public c_b
|
o 0 other {} public c_a
Test output
$ hg stack
### branch: foo (2 heads)
b6: c_f
b5: c_e
b2^ c_d (base)
b4@ c_h (current)
b3: c_g
b2: c_d
b1: c_c
^ c_b
Case with multiple heads on the topic with unstability involved
---------------------------------------------------------------
We amend the message to make sure the display base pick the right changeset
$ hg up 'desc(c_d)'
0 files updated, 0 files merged, 2 files removed, 0 files unresolved
$ echo ccc > ddd
$ hg commit --amend -m 'c_D'
$ hg rebase -d . -s 'desc(c_g)'
rebasing 10:2ebb6e48ab8a "c_g"
rebasing 11:634f38e27a1d "c_h"
$ hg log -G
o 15 foo {} draft c_h
|
o 14 foo {} draft c_g
|
@ 13 foo {} draft c_D
|
| o 9 foo {} draft c_f
| |
| o 8 foo {} draft c_e
| |
| x 7 foo {} draft c_d
|/
o 2 foo {} draft c_c
|
o 1 other {} public c_b
|
o 0 other {} public c_a
$ hg stack
### branch: foo (2 heads)
b6$ c_f (unstable)
b5$ c_e (unstable)
b2^ c_D (base)
b4: c_h
b3: c_g
b2@ c_D (current)
b1: c_c
^ c_b