merge: store ACTION_KEEP_ABSENT when we are keeping the file absent locally
If a file is not present on the local side, and it's unchanged between other
merge parent and ancestor, we don't use any action, neither we had a if-else
branch for that condition. This leads to bid-merge missing that there is a
such action possible which can be performed.
As test changes demonstrate, we now choose the locally deleted side instead
of choosing the remote one consistently. This is also wrong behavior which is
resulted because of missing possible action. It will be fixed in next patch.
This whole logic is not acurrate as we should prompt user on what to do
when this kind of criss-cross merge is in play.
Differential Revision: https://phab.mercurial-scm.org/D8940
$ cat >> $HGRCPATH <<EOF
> [extensions]
> rebase=
> mq=
>
> [phases]
> publish=False
>
> [alias]
> tglog = log -G --template "{rev}: '{desc}' {branches}\n"
> theads = heads --template "{rev}: '{desc}' {branches}\n"
> EOF
$ hg init a
$ cd a
$ echo a > a
$ hg ci -Am A
adding a
$ hg branch branch1
marked working directory as branch branch1
(branches are permanent and global, did you want a bookmark?)
$ hg ci -m 'branch1'
$ echo b > b
$ hg ci -Am B
adding b
$ hg up -q 0
$ hg branch branch2
marked working directory as branch branch2
$ hg ci -m 'branch2'
$ echo c > C
$ hg ci -Am C
adding C
$ hg up -q 2
$ hg branch -f branch2
marked working directory as branch branch2
$ echo d > d
$ hg ci -Am D
adding d
created new head
$ echo e > e
$ hg ci -Am E
adding e
$ hg update default
0 files updated, 0 files merged, 3 files removed, 0 files unresolved
$ hg branch branch3
marked working directory as branch branch3
$ hg ci -m 'branch3'
$ echo f > f
$ hg ci -Am F
adding f
$ cd ..
Rebase part of branch2 (5-6) onto branch3 (8):
$ hg clone -q -u . a a1
$ cd a1
$ hg tglog
@ 8: 'F' branch3
|
o 7: 'branch3' branch3
|
| o 6: 'E' branch2
| |
| o 5: 'D' branch2
| |
| | o 4: 'C' branch2
| | |
+---o 3: 'branch2' branch2
| |
| o 2: 'B' branch1
| |
| o 1: 'branch1' branch1
|/
o 0: 'A'
$ hg branches
branch3 8:4666b71e8e32
branch2 6:5097051d331d
branch1 2:0a03079c47fd (inactive)
default 0:1994f17a630e (inactive)
$ hg theads
8: 'F' branch3
6: 'E' branch2
4: 'C' branch2
2: 'B' branch1
0: 'A'
$ hg rebase -s 5 -d 8
rebasing 5:635859577d0b "D"
rebasing 6:5097051d331d "E"
saved backup bundle to $TESTTMP/a1/.hg/strip-backup/635859577d0b-89160bff-rebase.hg
$ hg branches
branch3 8:466cdfb14b62
branch2 4:e4fdb121d036
branch1 2:0a03079c47fd
default 0:1994f17a630e (inactive)
$ hg theads
8: 'E' branch3
4: 'C' branch2
2: 'B' branch1
0: 'A'
$ hg tglog
o 8: 'E' branch3
|
o 7: 'D' branch3
|
@ 6: 'F' branch3
|
o 5: 'branch3' branch3
|
| o 4: 'C' branch2
| |
| o 3: 'branch2' branch2
|/
| o 2: 'B' branch1
| |
| o 1: 'branch1' branch1
|/
o 0: 'A'
$ cd ..
Rebase head of branch3 (8) onto branch2 (6):
$ hg clone -q -u . a a2
$ cd a2
$ hg tglog
@ 8: 'F' branch3
|
o 7: 'branch3' branch3
|
| o 6: 'E' branch2
| |
| o 5: 'D' branch2
| |
| | o 4: 'C' branch2
| | |
+---o 3: 'branch2' branch2
| |
| o 2: 'B' branch1
| |
| o 1: 'branch1' branch1
|/
o 0: 'A'
$ hg rebase -s 8 -d 6
rebasing 8:4666b71e8e32 "F" (tip)
saved backup bundle to $TESTTMP/a2/.hg/strip-backup/4666b71e8e32-fc1c4e96-rebase.hg
$ hg branches
branch2 8:6b4bdc1b5ac0
branch3 7:653b9feb4616
branch1 2:0a03079c47fd (inactive)
default 0:1994f17a630e (inactive)
$ hg theads
8: 'F' branch2
7: 'branch3' branch3
4: 'C' branch2
2: 'B' branch1
0: 'A'
$ hg tglog
@ 8: 'F' branch2
|
| o 7: 'branch3' branch3
| |
o | 6: 'E' branch2
| |
o | 5: 'D' branch2
| |
| | o 4: 'C' branch2
| | |
| | o 3: 'branch2' branch2
| |/
o | 2: 'B' branch1
| |
o | 1: 'branch1' branch1
|/
o 0: 'A'
$ hg verify -q
$ cd ..
Rebase entire branch3 (7-8) onto branch2 (6):
$ hg clone -q -u . a a3
$ cd a3
$ hg tglog
@ 8: 'F' branch3
|
o 7: 'branch3' branch3
|
| o 6: 'E' branch2
| |
| o 5: 'D' branch2
| |
| | o 4: 'C' branch2
| | |
+---o 3: 'branch2' branch2
| |
| o 2: 'B' branch1
| |
| o 1: 'branch1' branch1
|/
o 0: 'A'
$ hg rebase -s 7 -d 6
rebasing 7:653b9feb4616 "branch3"
note: not rebasing 7:653b9feb4616 "branch3", its destination already has all its changes
rebasing 8:4666b71e8e32 "F" (tip)
saved backup bundle to $TESTTMP/a3/.hg/strip-backup/653b9feb4616-3c88de16-rebase.hg
$ hg branches
branch2 7:6b4bdc1b5ac0
branch1 2:0a03079c47fd (inactive)
default 0:1994f17a630e (inactive)
$ hg theads
7: 'F' branch2
4: 'C' branch2
2: 'B' branch1
0: 'A'
$ hg tglog
@ 7: 'F' branch2
|
o 6: 'E' branch2
|
o 5: 'D' branch2
|
| o 4: 'C' branch2
| |
| o 3: 'branch2' branch2
| |
o | 2: 'B' branch1
| |
o | 1: 'branch1' branch1
|/
o 0: 'A'
$ hg verify -q
Stripping multiple branches in one go bypasses the fast-case code to
update the branch cache.
$ hg strip 2
0 files updated, 0 files merged, 4 files removed, 0 files unresolved
saved backup bundle to $TESTTMP/a3/.hg/strip-backup/0a03079c47fd-11b7c407-backup.hg
$ hg tglog
o 3: 'C' branch2
|
o 2: 'branch2' branch2
|
| @ 1: 'branch1' branch1
|/
o 0: 'A'
$ hg branches
branch2 3:e4fdb121d036
branch1 1:63379ac49655
default 0:1994f17a630e (inactive)
$ hg theads
3: 'C' branch2
1: 'branch1' branch1
0: 'A'
Fast path branchcache code should not be invoked if branches stripped is not
the same as branches remaining.
$ hg init b
$ cd b
$ hg branch branch1
marked working directory as branch branch1
(branches are permanent and global, did you want a bookmark?)
$ hg ci -m 'branch1'
$ hg branch branch2
marked working directory as branch branch2
$ hg ci -m 'branch2'
$ hg branch -f branch1
marked working directory as branch branch1
$ echo a > A
$ hg ci -Am A
adding A
created new head
$ hg tglog
@ 2: 'A' branch1
|
o 1: 'branch2' branch2
|
o 0: 'branch1' branch1
$ hg theads
2: 'A' branch1
1: 'branch2' branch2
$ hg strip 2
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
saved backup bundle to $TESTTMP/a3/b/.hg/strip-backup/a5b4b27ed7b4-a3b6984e-backup.hg
$ hg theads
1: 'branch2' branch2
0: 'branch1' branch1
Make sure requesting to strip a revision already stripped does not confuse things.
Try both orders.
$ cd ..
$ hg init c
$ cd c
$ echo a > a
$ hg ci -Am A
adding a
$ echo b > b
$ hg ci -Am B
adding b
$ echo c > c
$ hg ci -Am C
adding c
$ echo d > d
$ hg ci -Am D
adding d
$ echo e > e
$ hg ci -Am E
adding e
$ hg tglog
@ 4: 'E'
|
o 3: 'D'
|
o 2: 'C'
|
o 1: 'B'
|
o 0: 'A'
$ hg strip 3 4
0 files updated, 0 files merged, 2 files removed, 0 files unresolved
saved backup bundle to $TESTTMP/a3/c/.hg/strip-backup/67a385d4e6f2-b9243789-backup.hg
$ hg theads
2: 'C'
$ hg strip 2 1
0 files updated, 0 files merged, 2 files removed, 0 files unresolved
saved backup bundle to $TESTTMP/a3/c/.hg/strip-backup/6c81ed0049f8-a687065f-backup.hg
$ hg theads
0: 'A'
Make sure rebase does not break for phase/filter related reason
----------------------------------------------------------------
(issue3858)
$ cd ..
$ cat >> $HGRCPATH << EOF
> [ui]
> logtemplate={rev} {desc} {phase}\n
> EOF
$ hg init c4
$ cd c4
$ echo a > a
$ hg ci -Am A
adding a
$ echo b > b
$ hg ci -Am B
adding b
$ hg up 0
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ echo c > c
$ hg ci -Am C
adding c
created new head
$ hg up 1
1 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg merge
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ hg ci -m d
$ hg up 2
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ echo e > e
$ hg ci -Am E
adding e
created new head
$ hg merge 3
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ hg ci -m F
$ hg up 3
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ echo g > g
$ hg ci -Am G
adding g
created new head
$ echo h > h
$ hg ci -Am H
adding h
$ hg up 5
1 files updated, 0 files merged, 2 files removed, 0 files unresolved
$ echo i > i
$ hg ci -Am I
adding i
Turn most changeset public
$ hg ph -p 7
$ hg heads
8 I draft
7 H public
$ hg log -G
@ 8 I draft
|
| o 7 H public
| |
| o 6 G public
| |
o | 5 F draft
|\|
o | 4 E draft
| |
| o 3 d public
|/|
o | 2 C public
| |
| o 1 B public
|/
o 0 A public
$ cat > $TESTTMP/checkeditform.sh <<EOF
> env | grep HGEDITFORM
> true
> EOF
$ HGEDITOR="sh $TESTTMP/checkeditform.sh" hg rebase --dest 7 --source 5 -e
rebasing 5:361a99976cc9 "F"
HGEDITFORM=rebase.merge
rebasing 8:326cfedc031c "I" (tip)
HGEDITFORM=rebase.normal
saved backup bundle to $TESTTMP/a3/c4/.hg/strip-backup/361a99976cc9-35e980d0-rebase.hg