##// END OF EJS Templates
interfaces: convert `repository.irevisiondelta` from zope `Attribute` attrs...
interfaces: convert `repository.irevisiondelta` from zope `Attribute` attrs This is the same transformation as b455dfddfed0 did for dirstate.

File last commit:

r49941:532b649c stable
r53366:2aada52e default
Show More
test-rebase-inmemory.t
1048 lines | 23.6 KiB | text/troff | Tads3Lexer
/ tests / test-rebase-inmemory.t
#require symlink execbit
$ cat << EOF >> $HGRCPATH
> [phases]
> publish=False
> [extensions]
> amend=
> rebase=
> debugdrawdag=$TESTDIR/drawdag.py
> strip=
> [rebase]
> experimental.inmemory=1
> [diff]
> git=1
> [alias]
> tglog = log -G --template "{rev}: {node|short} '{desc}'\n"
> EOF
Rebase a simple DAG:
$ hg init repo1
$ cd repo1
$ hg debugdrawdag <<'EOS'
> c b
> |/
> d
> |
> a
> EOS
$ hg up -C a
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg tglog
o 3: 814f6bd05178 'c'
|
| o 2: db0e82a16a62 'b'
|/
o 1: 02952614a83d 'd'
|
@ 0: b173517d0057 'a'
$ hg cat -r 3 c
c (no-eol)
$ hg cat -r 2 b
b (no-eol)
$ hg rebase --debug -r b -d c | grep rebasing
rebasing in memory
rebasing 2:db0e82a16a62 b "b"
$ hg tglog
o 3: ca58782ad1e4 'b'
|
o 2: 814f6bd05178 'c'
|
o 1: 02952614a83d 'd'
|
@ 0: b173517d0057 'a'
$ hg cat -r 3 b
b (no-eol)
$ hg cat -r 2 c
c (no-eol)
$ cd ..
Case 2:
$ hg init repo2
$ cd repo2
$ hg debugdrawdag <<'EOS'
> c b
> |/
> d
> |
> a
> EOS
Add a symlink and executable file:
$ hg up -C c
3 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ ln -s somefile e
$ echo f > f
$ chmod +x f
$ hg add e f
$ hg amend -q
$ hg up -Cq a
Write files to the working copy, and ensure they're still there after the rebase
$ echo "abc" > a
$ ln -s def b
$ echo "ghi" > c
$ echo "jkl" > d
$ echo "mno" > e
$ hg tglog
o 3: f56b71190a8f 'c'
|
| o 2: db0e82a16a62 'b'
|/
o 1: 02952614a83d 'd'
|
@ 0: b173517d0057 'a'
$ hg cat -r 3 c
c (no-eol)
$ hg cat -r 2 b
b (no-eol)
$ hg cat -r 3 e
somefile (no-eol)
$ hg rebase --debug -s b -d a | grep rebasing
rebasing in memory
rebasing 2:db0e82a16a62 b "b"
$ hg tglog
o 3: fc055c3b4d33 'b'
|
| o 2: f56b71190a8f 'c'
| |
| o 1: 02952614a83d 'd'
|/
@ 0: b173517d0057 'a'
$ hg cat -r 2 c
c (no-eol)
$ hg cat -r 3 b
b (no-eol)
$ hg rebase --debug -s 1 -d 3 | grep rebasing
rebasing in memory
rebasing 1:02952614a83d d "d"
rebasing 2:f56b71190a8f "c"
$ hg tglog
o 3: 753feb6fd12a 'c'
|
o 2: 09c044d2cb43 'd'
|
o 1: fc055c3b4d33 'b'
|
@ 0: b173517d0057 'a'
Ensure working copy files are still there:
$ cat a
abc
$ readlink.py b
b -> def
$ cat e
mno
Ensure symlink and executable files were rebased properly:
$ hg up -Cq 3
$ readlink.py e
e -> somefile
$ ls -l f | cut -c -10
-rwxr-xr-x
Rebase the working copy parent
$ hg up -C 3
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg rebase -r 3 -d 0 --debug | grep rebasing
rebasing in memory
rebasing 3:753feb6fd12a tip "c"
$ hg tglog
@ 3: 844a7de3e617 'c'
|
| o 2: 09c044d2cb43 'd'
| |
| o 1: fc055c3b4d33 'b'
|/
o 0: b173517d0057 'a'
Test reporting of path conflicts
$ hg rm a
$ mkdir a
$ touch a/a
$ hg ci -Am "a/a"
adding a/a
$ hg tglog
@ 4: daf7dfc139cb 'a/a'
|
o 3: 844a7de3e617 'c'
|
| o 2: 09c044d2cb43 'd'
| |
| o 1: fc055c3b4d33 'b'
|/
o 0: b173517d0057 'a'
$ hg rebase -r . -d 2
rebasing 4:daf7dfc139cb tip "a/a"
saved backup bundle to $TESTTMP/repo2/.hg/strip-backup/daf7dfc139cb-fdbfcf4f-rebase.hg
$ hg tglog
@ 4: c6ad37a4f250 'a/a'
|
| o 3: 844a7de3e617 'c'
| |
o | 2: 09c044d2cb43 'd'
| |
o | 1: fc055c3b4d33 'b'
|/
o 0: b173517d0057 'a'
$ echo foo > foo
$ hg ci -Aqm "added foo"
$ hg up '.^'
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ echo bar > bar
$ hg ci -Aqm "added bar"
$ hg rm a/a
$ echo a > a
$ hg ci -Aqm "added a back!"
$ hg tglog
@ 7: 855e9797387e 'added a back!'
|
o 6: d14530e5e3e6 'added bar'
|
| o 5: 9b94b9373deb 'added foo'
|/
o 4: c6ad37a4f250 'a/a'
|
| o 3: 844a7de3e617 'c'
| |
o | 2: 09c044d2cb43 'd'
| |
o | 1: fc055c3b4d33 'b'
|/
o 0: b173517d0057 'a'
$ hg rebase -r . -d 5
rebasing 7:855e9797387e tip "added a back!"
saved backup bundle to $TESTTMP/repo2/.hg/strip-backup/855e9797387e-81ee4c5d-rebase.hg
$ hg tglog
@ 7: bb3f02be2688 'added a back!'
|
| o 6: d14530e5e3e6 'added bar'
| |
o | 5: 9b94b9373deb 'added foo'
|/
o 4: c6ad37a4f250 'a/a'
|
| o 3: 844a7de3e617 'c'
| |
o | 2: 09c044d2cb43 'd'
| |
o | 1: fc055c3b4d33 'b'
|/
o 0: b173517d0057 'a'
$ mkdir -p c/subdir
$ echo c > c/subdir/file.txt
$ hg add c/subdir/file.txt
$ hg ci -m 'c/subdir/file.txt'
$ hg rebase -r . -d 3 -n
starting dry-run rebase; repository will not be changed
rebasing 8:e147e6e3c490 tip "c/subdir/file.txt"
abort: error: 'c/subdir/file.txt' conflicts with file 'c' in 3.
[255]
FIXME: shouldn't need this, but when we hit path conflicts in dryrun mode, we
don't clean up rebasestate.
$ hg rebase --abort
rebase aborted
$ hg rebase -r 3 -d . -n
starting dry-run rebase; repository will not be changed
rebasing 3:844a7de3e617 "c"
abort: error: file 'c' cannot be written because 'c/' is a directory in e147e6e3c490 (containing 1 entries: c/subdir/file.txt)
[255]
$ cd ..
Test path auditing (issue5818)
$ mkdir lib_
$ ln -s lib_ lib
$ hg init repo
$ cd repo
$ mkdir -p ".$TESTTMP/lib"
$ touch ".$TESTTMP/lib/a"
$ hg add ".$TESTTMP/lib/a"
$ hg ci -m 'a'
$ touch ".$TESTTMP/lib/b"
$ hg add ".$TESTTMP/lib/b"
$ hg ci -m 'b'
$ hg up -q '.^'
$ touch ".$TESTTMP/lib/c"
$ hg add ".$TESTTMP/lib/c"
$ hg ci -m 'c'
created new head
$ hg rebase -s 1 -d .
rebasing 1:* "b" (glob)
saved backup bundle to $TESTTMP/repo/.hg/strip-backup/*-rebase.hg (glob)
$ cd ..
Test dry-run rebasing
$ hg init repo3
$ cd repo3
$ echo a>a
$ hg ci -Aqma
$ echo b>b
$ hg ci -Aqmb
$ echo c>c
$ hg ci -Aqmc
$ echo d>d
$ hg ci -Aqmd
$ echo e>e
$ hg ci -Aqme
$ hg up 1 -q
$ echo f>f
$ hg ci -Amf
adding f
created new head
$ echo g>g
$ hg ci -Aqmg
$ hg log -G --template "{rev}:{short(node)} {person(author)}\n{firstline(desc)} {topic}\n\n"
@ 6:baf10c5166d4 test
| g
|
o 5:6343ca3eff20 test
| f
|
| o 4:e860deea161a test
| | e
| |
| o 3:055a42cdd887 test
| | d
| |
| o 2:177f92b77385 test
|/ c
|
o 1:d2ae7f538514 test
| b
|
o 0:cb9a9f314b8b test
a
Make sure it throws error while passing --continue or --abort with --dry-run
$ hg rebase -s 2 -d 6 -n --continue
abort: cannot specify both --continue and --dry-run
[10]
$ hg rebase -s 2 -d 6 -n --abort
abort: cannot specify both --abort and --dry-run
[10]
When nothing to rebase
$ hg reb -r . -d '.^' -n
starting dry-run rebase; repository will not be changed
nothing to rebase
[1]
Check dryrun gives correct results when there is no conflict in rebasing
$ hg rebase -s 2 -d 6 -n
starting dry-run rebase; repository will not be changed
rebasing 2:177f92b77385 "c"
rebasing 3:055a42cdd887 "d"
rebasing 4:e860deea161a "e"
dry-run rebase completed successfully; run without -n/--dry-run to perform this rebase
$ hg diff
$ hg status
$ hg log -G --template "{rev}:{short(node)} {person(author)}\n{firstline(desc)} {topic}\n\n"
@ 6:baf10c5166d4 test
| g
|
o 5:6343ca3eff20 test
| f
|
| o 4:e860deea161a test
| | e
| |
| o 3:055a42cdd887 test
| | d
| |
| o 2:177f92b77385 test
|/ c
|
o 1:d2ae7f538514 test
| b
|
o 0:cb9a9f314b8b test
a
Check dryrun working with --collapse when there is no conflict
$ hg rebase -s 2 -d 6 -n --collapse
starting dry-run rebase; repository will not be changed
rebasing 2:177f92b77385 "c"
rebasing 3:055a42cdd887 "d"
rebasing 4:e860deea161a "e"
dry-run rebase completed successfully; run without -n/--dry-run to perform this rebase
Check dryrun gives correct results when there is conflict in rebasing
Make a conflict:
$ hg up 6 -q
$ echo conflict>e
$ hg ci -Aqm "conflict with e"
$ hg log -G --template "{rev}:{short(node)} {person(author)}\n{firstline(desc)} {topic}\n\n"
@ 7:d2c195b28050 test
| conflict with e
|
o 6:baf10c5166d4 test
| g
|
o 5:6343ca3eff20 test
| f
|
| o 4:e860deea161a test
| | e
| |
| o 3:055a42cdd887 test
| | d
| |
| o 2:177f92b77385 test
|/ c
|
o 1:d2ae7f538514 test
| b
|
o 0:cb9a9f314b8b test
a
$ hg rebase -s 2 -d 7 -n
starting dry-run rebase; repository will not be changed
rebasing 2:177f92b77385 "c"
rebasing 3:055a42cdd887 "d"
rebasing 4:e860deea161a "e"
merging e
hit a merge conflict
[1]
$ hg diff
$ hg status
$ hg log -G --template "{rev}:{short(node)} {person(author)}\n{firstline(desc)} {topic}\n\n"
@ 7:d2c195b28050 test
| conflict with e
|
o 6:baf10c5166d4 test
| g
|
o 5:6343ca3eff20 test
| f
|
| o 4:e860deea161a test
| | e
| |
| o 3:055a42cdd887 test
| | d
| |
| o 2:177f92b77385 test
|/ c
|
o 1:d2ae7f538514 test
| b
|
o 0:cb9a9f314b8b test
a
Check dryrun working with --collapse when there is conflicts
$ hg rebase -s 2 -d 7 -n --collapse
starting dry-run rebase; repository will not be changed
rebasing 2:177f92b77385 "c"
rebasing 3:055a42cdd887 "d"
rebasing 4:e860deea161a "e"
merging e
hit a merge conflict
[1]
In-memory rebase that fails due to merge conflicts
$ hg rebase -s 2 -d 7
rebasing 2:177f92b77385 "c"
rebasing 3:055a42cdd887 "d"
rebasing 4:e860deea161a "e"
merging e
hit merge conflicts; rebasing that commit again in the working copy
merging e
warning: conflicts while merging e! (edit, then use 'hg resolve --mark')
unresolved conflicts (see 'hg resolve', then 'hg rebase --continue')
[240]
$ hg rebase --abort
saved backup bundle to $TESTTMP/repo3/.hg/strip-backup/c1e524d4287c-f91f82e1-backup.hg
rebase aborted
Retrying without in-memory merge won't lose working copy changes
$ cd ..
$ hg clone repo3 repo3-dirty -q
$ cd repo3-dirty
$ echo dirty > a
$ hg rebase -s 2 -d 7
rebasing 2:177f92b77385 "c"
rebasing 3:055a42cdd887 "d"
rebasing 4:e860deea161a "e"
merging e
hit merge conflicts; rebasing that commit again in the working copy
transaction abort!
rollback completed
abort: uncommitted changes
[20]
$ cat a
dirty
$ hg status -v
M a
Retrying without in-memory merge won't lose merge state
$ cd ..
$ hg clone repo3 repo3-merge-state -q
$ cd repo3-merge-state
$ hg merge 4
merging e
warning: conflicts while merging e! (edit, then use 'hg resolve --mark')
2 files updated, 0 files merged, 0 files removed, 1 files unresolved
use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
[1]
$ hg resolve -l
U e
$ hg rebase -s 2 -d 7
abort: outstanding uncommitted merge
(use 'hg commit' or 'hg merge --abort')
[20]
$ hg resolve -l
U e
==========================
Test for --confirm option|
==========================
$ cd ..
$ hg clone repo3 repo4 -q
$ cd repo4
$ hg strip 7 -q
$ hg log -G --template "{rev}:{short(node)} {person(author)}\n{firstline(desc)} {topic}\n\n"
@ 6:baf10c5166d4 test
| g
|
o 5:6343ca3eff20 test
| f
|
| o 4:e860deea161a test
| | e
| |
| o 3:055a42cdd887 test
| | d
| |
| o 2:177f92b77385 test
|/ c
|
o 1:d2ae7f538514 test
| b
|
o 0:cb9a9f314b8b test
a
Check it gives error when both --dryrun and --confirm is used:
$ hg rebase -s 2 -d . --confirm --dry-run
abort: cannot specify both --confirm and --dry-run
[10]
$ hg rebase -s 2 -d . --confirm --abort
abort: cannot specify both --abort and --confirm
[10]
$ hg rebase -s 2 -d . --confirm --continue
abort: cannot specify both --continue and --confirm
[10]
Test --confirm option when there are no conflicts:
$ hg rebase -s 2 -d . --keep --config ui.interactive=True --confirm << EOF
> n
> EOF
starting in-memory rebase
rebasing 2:177f92b77385 "c"
rebasing 3:055a42cdd887 "d"
rebasing 4:e860deea161a "e"
rebase completed successfully
apply changes (yn)? n
$ hg log -G --template "{rev}:{short(node)} {person(author)}\n{firstline(desc)} {topic}\n\n"
@ 6:baf10c5166d4 test
| g
|
o 5:6343ca3eff20 test
| f
|
| o 4:e860deea161a test
| | e
| |
| o 3:055a42cdd887 test
| | d
| |
| o 2:177f92b77385 test
|/ c
|
o 1:d2ae7f538514 test
| b
|
o 0:cb9a9f314b8b test
a
$ hg rebase -s 2 -d . --keep --config ui.interactive=True --confirm << EOF
> y
> EOF
starting in-memory rebase
rebasing 2:177f92b77385 "c"
rebasing 3:055a42cdd887 "d"
rebasing 4:e860deea161a "e"
rebase completed successfully
apply changes (yn)? y
$ hg log -G --template "{rev}:{short(node)} {person(author)}\n{firstline(desc)} {topic}\n\n"
o 9:9fd28f55f6dc test
| e
|
o 8:12cbf031f469 test
| d
|
o 7:c83b1da5b1ae test
| c
|
@ 6:baf10c5166d4 test
| g
|
o 5:6343ca3eff20 test
| f
|
| o 4:e860deea161a test
| | e
| |
| o 3:055a42cdd887 test
| | d
| |
| o 2:177f92b77385 test
|/ c
|
o 1:d2ae7f538514 test
| b
|
o 0:cb9a9f314b8b test
a
Test --confirm option when there is a conflict
$ hg up tip -q
$ echo ee>e
$ hg ci --amend -m "conflict with e" -q
$ hg log -G --template "{rev}:{short(node)} {person(author)}\n{firstline(desc)} {topic}\n\n"
@ 9:906d72f66a59 test
| conflict with e
|
o 8:12cbf031f469 test
| d
|
o 7:c83b1da5b1ae test
| c
|
o 6:baf10c5166d4 test
| g
|
o 5:6343ca3eff20 test
| f
|
| o 4:e860deea161a test
| | e
| |
| o 3:055a42cdd887 test
| | d
| |
| o 2:177f92b77385 test
|/ c
|
o 1:d2ae7f538514 test
| b
|
o 0:cb9a9f314b8b test
a
$ hg rebase -s 4 -d . --keep --confirm
starting in-memory rebase
rebasing 4:e860deea161a "e"
merging e
hit a merge conflict
[1]
$ hg log -G --template "{rev}:{short(node)} {person(author)}\n{firstline(desc)} {topic}\n\n"
@ 9:906d72f66a59 test
| conflict with e
|
o 8:12cbf031f469 test
| d
|
o 7:c83b1da5b1ae test
| c
|
o 6:baf10c5166d4 test
| g
|
o 5:6343ca3eff20 test
| f
|
| o 4:e860deea161a test
| | e
| |
| o 3:055a42cdd887 test
| | d
| |
| o 2:177f92b77385 test
|/ c
|
o 1:d2ae7f538514 test
| b
|
o 0:cb9a9f314b8b test
a
Test a metadata-only in-memory merge
$ cd $TESTTMP
$ hg init no_exception
$ cd no_exception
# Produce the following graph:
# o 'add +x to foo.txt'
# | o r1 (adds bar.txt, just for something to rebase to)
# |/
# o r0 (adds foo.txt, no +x)
$ echo hi > foo.txt
$ hg ci -qAm r0
$ echo hi > bar.txt
$ hg ci -qAm r1
$ hg co -qr ".^"
$ chmod +x foo.txt
$ hg ci -qAm 'add +x to foo.txt'
issue5960: this was raising an AttributeError exception
$ hg rebase -r . -d 1
rebasing 2:539b93e77479 tip "add +x to foo.txt"
saved backup bundle to $TESTTMP/no_exception/.hg/strip-backup/*.hg (glob)
$ hg diff -c tip
diff --git a/foo.txt b/foo.txt
old mode 100644
new mode 100755
Test rebasing a commit with copy information, but no content changes
$ cd ..
$ hg clone -q repo1 merge-and-rename
$ cd merge-and-rename
$ cat << EOF >> .hg/hgrc
> [experimental]
> evolution.createmarkers=True
> evolution.allowunstable=True
> EOF
$ hg co -q 1
$ hg mv d e
$ hg ci -qm 'rename d to e'
$ hg co -q 3
$ hg merge -q 4
$ hg ci -m 'merge'
$ hg co -q 2
$ mv d e
$ hg addremove -qs 0
$ hg ci -qm 'untracked rename of d to e'
$ hg debugobsolete -q `hg log -T '{node}' -r 4` `hg log -T '{node}' -r .`
1 new orphan changesets
$ hg tglog
@ 6: 676538af172d 'untracked rename of d to e'
|
| * 5: 574d92ad16fc 'merge'
| |\
| | x 4: 2c8b5dad7956 'rename d to e'
| | |
| o | 3: ca58782ad1e4 'b'
|/ /
o / 2: 814f6bd05178 'c'
|/
o 1: 02952614a83d 'd'
|
o 0: b173517d0057 'a'
$ hg rebase -b 5 -d tip
rebasing 3:ca58782ad1e4 "b"
rebasing 5:574d92ad16fc "merge"
note: not rebasing 5:574d92ad16fc "merge", its destination already has all its changes
$ cd ..
Test rebasing a commit with copy information
$ hg init rebase-rename
$ cd rebase-rename
$ echo a > a
$ hg ci -Aqm 'add a'
$ echo a2 > a
$ hg ci -m 'modify a'
$ hg co -q 0
$ hg mv a b
$ hg ci -qm 'rename a to b'
$ hg rebase -d 1
rebasing 2:b977edf6f839 tip "rename a to b"
merging a and b to b
saved backup bundle to $TESTTMP/rebase-rename/.hg/strip-backup/b977edf6f839-0864f570-rebase.hg
$ hg st --copies --change .
A b
a
R a
$ cd ..
Test rebasing a commit with copy information, where the target is empty
$ hg init rebase-rename-empty
$ cd rebase-rename-empty
$ echo a > a
$ hg ci -Aqm 'add a'
$ cat > a
$ hg ci -m 'make a empty'
$ hg co -q 0
$ hg mv a b
$ hg ci -qm 'rename a to b'
$ hg rebase -d 1
rebasing 2:b977edf6f839 tip "rename a to b"
merging a and b to b
saved backup bundle to $TESTTMP/rebase-rename-empty/.hg/strip-backup/b977edf6f839-0864f570-rebase.hg
$ hg st --copies --change .
A b
a
R a
$ cd ..
Rebase across a copy with --collapse
$ hg init rebase-rename-collapse
$ cd rebase-rename-collapse
$ echo a > a
$ hg ci -Aqm 'add a'
$ hg mv a b
$ hg ci -m 'rename a to b'
$ hg co -q 0
$ echo a2 > a
$ hg ci -qm 'modify a'
$ hg rebase -r . -d 1 --collapse
rebasing 2:41c4ea50d4cf tip "modify a"
merging b and a to b
saved backup bundle to $TESTTMP/rebase-rename-collapse/.hg/strip-backup/41c4ea50d4cf-b90b7994-rebase.hg
$ cd ..
Test rebasing when the file we are merging in destination is empty
$ hg init test
$ cd test
$ echo a > foo
$ hg ci -Aqm 'added a to foo'
$ rm foo
$ touch foo
$ hg di
diff --git a/foo b/foo
--- a/foo
+++ b/foo
@@ -1,1 +0,0 @@
-a
$ hg ci -m "make foo an empty file"
$ hg up '.^'
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ echo b > foo
$ hg di
diff --git a/foo b/foo
--- a/foo
+++ b/foo
@@ -1,1 +1,1 @@
-a
+b
$ hg ci -m "add b to foo"
created new head
$ hg rebase -r . -d 1 --config ui.merge=internal:merge3
rebasing 2:fb62b706688e tip "add b to foo"
merging foo
hit merge conflicts; rebasing that commit again in the working copy
merging foo
warning: conflicts while merging foo! (edit, then use 'hg resolve --mark')
unresolved conflicts (see 'hg resolve', then 'hg rebase --continue')
[240]
$ cd $TESTTMP
Test rebasing when we're in the middle of a rebase already
$ hg init test_issue6214
$ cd test_issue6214
$ echo r0 > r0
$ hg ci -qAm 'r0'
$ echo hi > foo
$ hg ci -qAm 'hi from foo'
$ hg co -q '.^'
$ echo bye > foo
$ hg ci -qAm 'bye from foo'
$ hg co -q '.^'
$ echo unrelated > some_other_file
$ hg ci -qAm 'some unrelated changes'
$ hg log -G -T'{rev}: {desc}\n{files%"{file}\n"}'
@ 3: some unrelated changes
| some_other_file
| o 2: bye from foo
|/ foo
| o 1: hi from foo
|/ foo
o 0: r0
r0
$ hg rebase -r 2 -d 1 -t:merge3
rebasing 2:b4d249fbf8dd "bye from foo"
merging foo
hit merge conflicts; rebasing that commit again in the working copy
merging foo
warning: conflicts while merging foo! (edit, then use 'hg resolve --mark')
unresolved conflicts (see 'hg resolve', then 'hg rebase --continue')
[240]
$ hg rebase -r 3 -d 1 -t:merge3
abort: rebase in progress
(use 'hg rebase --continue', 'hg rebase --abort', or 'hg rebase --stop')
[20]
$ hg resolve --list
U foo
$ hg resolve --all --re-merge -t:other
(no more unresolved files)
continue: hg rebase --continue
$ hg rebase --continue
rebasing 2:b4d249fbf8dd "bye from foo"
saved backup bundle to $TESTTMP/test_issue6214/.hg/strip-backup/b4d249fbf8dd-299ec25c-rebase.hg
$ hg log -G -T'{rev}: {desc}\n{files%"{file}\n"}'
o 3: bye from foo
| foo
| @ 2: some unrelated changes
| | some_other_file
o | 1: hi from foo
|/ foo
o 0: r0
r0
$ cd ..
Changesets that become empty should not be committed. Merges are not empty by
definition.
$ hg init keep_merge
$ cd keep_merge
$ echo base > base; hg add base; hg ci -m base
$ echo test > test; hg add test; hg ci -m a
$ hg up 0 -q
$ echo test > test; hg add test; hg ci -m b -q
$ hg up 0 -q
$ echo test > test; hg add test; hg ci -m c -q
$ hg up 1 -q
$ hg merge 2 -q
$ hg ci -m merge
$ hg up null -q
$ hg tglog
o 4: 59c8292117b1 'merge'
|\
| | o 3: 531f80391e4a 'c'
| | |
| o | 2: 0194f1db184a 'b'
| |/
o / 1: 6f252845ea45 'a'
|/
o 0: d20a80d4def3 'base'
$ hg rebase -s 2 -d 3
rebasing 2:0194f1db184a "b"
note: not rebasing 2:0194f1db184a "b", its destination already has all its changes
rebasing 4:59c8292117b1 tip "merge"
saved backup bundle to $TESTTMP/keep_merge/.hg/strip-backup/0194f1db184a-aee31d03-rebase.hg
$ hg tglog
o 3: 506e2454484b 'merge'
|\
| o 2: 531f80391e4a 'c'
| |
o | 1: 6f252845ea45 'a'
|/
o 0: d20a80d4def3 'base'
Test that update_hash_refs works.
$ hg co 0
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ echo update_hash_refs > update_hash_refs
$ hg add update_hash_refs
$ hg ci -m 'this will change hash'
created new head
$ echo changed >> update_hash_refs
$ hg ci -m "this starts as the child of `hg log -r . -T'{node|short}'` but not 506e2454484b. Also, ffffffffffffffff"
$ hg tglog
@ 5: a8b42cbbde83 'this starts as the child of 98789aa60148 but not 506e2454484b. Also, ffffffffffffffff'
|
o 4: 98789aa60148 'this will change hash'
|
| o 3: 506e2454484b 'merge'
| |\
+---o 2: 531f80391e4a 'c'
| |
| o 1: 6f252845ea45 'a'
|/
o 0: d20a80d4def3 'base'
$ hg rebase -r '.^::' -d 3
rebasing 4:98789aa60148 "this will change hash"
rebasing 5:a8b42cbbde83 tip "this starts as the child of 98789aa60148 but not 506e2454484b. Also, ffffffffffffffff"
saved backup bundle to $TESTTMP/keep_merge/.hg/strip-backup/98789aa60148-da3f4c2c-rebase.hg
$ hg tglog
@ 5: 0fd2912e6cc1 'this starts as the child of c16c25696fe7 but not 506e2454484b. Also, ffffffffffffffff'
|
o 4: c16c25696fe7 'this will change hash'
|
o 3: 506e2454484b 'merge'
|\
| o 2: 531f80391e4a 'c'
| |
o | 1: 6f252845ea45 'a'
|/
o 0: d20a80d4def3 'base'
Add an explicit test for rewrite_hash_refs when the detected prefix is
ambiguous. Here's the super low-tech way I found this collision, if the hashing
scheme ever changes:
# hg init
# echo test0 > test
# hg ci -qAm 'test0' -u 'test' -d '0 0'
# i=1
# while [[ $(chg log -r . -T'{shortest(node, 6)}' | wc -c) -eq 6 ]]; do
# chg co -r 0000000000
# echo "test$i" > test
# chg ci -qAm "test$i" -u test -d '0 0'
# (( ++i ))
# done
$ hg co -q 0000000000
$ echo test5281 > test
$ hg ci -qAm 'test5281'
$ hg co -q 000000000
$ echo test9912 > test
$ hg ci -qAm 'test9912'
$ hg co -q 4
$ echo contents > some_file
$ hg ci -qAm 'The previous two (parentless) commits had a hash prefix of b04363. Check that rewrite_hash_refs will not fail because of that.'
$ hg rebase -r . -d 5
rebasing 8:5c4cdabf5769 tip "The previous two (parentless) commits had a hash prefix of b04363. Check that rewrite_hash_refs will not fail because of that."
saved backup bundle to $TESTTMP/keep_merge/.hg/strip-backup/5c4cdabf5769-335e1828-rebase.hg
$ cd ..
Test (virtual) working directory without changes, created by merge conflict
resolution. There was a regression where the file was incorrectly detected as
changed although the file contents were the same as in the parent.
$ hg init nofilechanges
$ cd nofilechanges
$ echo a > a; hg add a; hg ci -m a
$ echo foo > test; hg add test; hg ci -m b
$ hg up 0 -q
$ echo bar > test; hg add test; hg ci -m c
created new head
$ hg rebase -d 2 -d 1 --tool :local
rebasing 2:ca2749322ee5 tip "c"
note: not rebasing 2:ca2749322ee5 tip "c", its destination already has all its changes
saved backup bundle to $TESTTMP/nofilechanges/.hg/strip-backup/ca2749322ee5-6dc7e94b-rebase.hg