2017-12-11 09:39:46 +03:00
|
|
|
#require symlink execbit
|
2018-06-19 22:15:18 +03:00
|
|
|
|
|
|
|
$ enable amend morestatus purge rebase
|
|
|
|
$ setconfig morestatus.show=True
|
|
|
|
$ setconfig diff.git=True
|
2018-06-20 01:31:17 +03:00
|
|
|
$ setconfig rebase.singletransaction=True
|
2018-06-19 22:15:18 +03:00
|
|
|
$ setconfig rebase.experimental.inmemory=True
|
|
|
|
|
|
|
|
$ cat <<EOF >> $HGRCPATH
|
2017-12-11 09:39:46 +03:00
|
|
|
> [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)
|
2017-12-12 09:16:13 +03:00
|
|
|
$ hg rebase --debug -r b -d c | grep rebasing
|
2017-12-11 09:39:46 +03:00
|
|
|
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)
|
|
|
|
|
|
|
|
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)
|
2017-12-12 09:16:13 +03:00
|
|
|
$ hg rebase --debug -s b -d a | grep rebasing
|
2017-12-11 09:39:46 +03:00
|
|
|
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)
|
2017-12-12 09:16:13 +03:00
|
|
|
$ hg rebase --debug -s 1 -d 3 | grep rebasing
|
2017-12-11 09:39:46 +03:00
|
|
|
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
|
2018-03-30 02:29:48 +03:00
|
|
|
$ cd ..
|
|
|
|
|
|
|
|
Make a change that only changes the flags of a file and ensure it rebases
|
|
|
|
cleanly.
|
|
|
|
$ hg clone repo2 repo3
|
|
|
|
updating to branch default
|
|
|
|
6 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
$ cd repo3
|
|
|
|
$ hg tglog
|
|
|
|
@ 3: 753feb6fd12a 'c'
|
|
|
|
|
|
|
|
|
o 2: 09c044d2cb43 'd'
|
|
|
|
|
|
|
|
|
o 1: fc055c3b4d33 'b'
|
|
|
|
|
|
|
|
|
o 0: b173517d0057 'a'
|
|
|
|
|
|
|
|
$ chmod +x a
|
|
|
|
$ hg commit -m "change a's flags"
|
|
|
|
$ hg up 0
|
|
|
|
1 files updated, 0 files merged, 5 files removed, 0 files unresolved
|
|
|
|
$ hg rebase -r 4 -d .
|
|
|
|
rebasing 4:0666f6a71f74 "change a's flags" (tip)
|
|
|
|
saved backup bundle to $TESTTMP/repo1/repo3/.hg/strip-backup/0666f6a71f74-a2618702-rebase.hg
|
|
|
|
$ hg up -q tip
|
|
|
|
$ ls -l a | cut -c -10
|
|
|
|
-rwxr-xr-x
|
|
|
|
$ cd ..
|
2017-12-11 09:39:46 +03:00
|
|
|
|
2018-06-24 22:11:41 +03:00
|
|
|
Rebase the working copy parent:
|
2018-03-30 02:29:48 +03:00
|
|
|
$ cd repo2
|
2017-12-11 09:39:46 +03:00
|
|
|
$ hg up -C 3
|
|
|
|
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
2018-02-03 02:33:37 +03:00
|
|
|
$ hg rebase -r 3 -d 0 --debug | egrep 'rebasing|disabling'
|
2018-06-24 22:11:41 +03:00
|
|
|
rebasing in-memory
|
2017-12-11 09:39:46 +03:00
|
|
|
rebasing 3:753feb6fd12a "c" (tip)
|
|
|
|
$ hg tglog
|
|
|
|
@ 3: 844a7de3e617 'c'
|
|
|
|
|
|
|
|
|
| o 2: 09c044d2cb43 'd'
|
|
|
|
| |
|
|
|
|
| o 1: fc055c3b4d33 'b'
|
|
|
|
|/
|
|
|
|
o 0: b173517d0057 'a'
|
|
|
|
|
2018-06-24 22:11:41 +03:00
|
|
|
Rerun with merge conflicts, demonstrating switching to on-disk merge:
|
rebase: fix a bug where rebases would wrongly be restarted
Summary:
If `rebase.experimental.inmemory` was enabled, but you ended up merging on-disk (e.g. you rebased the working copy parent), and you got merge conflicts, and didn't immediately solve them, hg would discard any work you did and restart the rebase unnecessarily.
The bug here is basically that `rbsrt.inmemory` field can be set to False later, because we make further calculations once we define the `rebaseset`. In that case `InterventionRequired` will get raised if the user didn't solve conflicts, but we'll catch it, thinking something went wrong "in-memory", and abort/rerun the rebase. I was too hasty in adding the "catch all exceptions and retry" block.
I solved this two ways -- first, move the rbsrt definition here and explicitly check the state in the Exception catch. Second, add an explicit catch for InterventionRequired and explain why with a comment.
Further refactoring of the rebase code will help here, I think, so we can consolidate all of this logic.
Reviewed By: DurhamG
Differential Revision: D6817683
fbshipit-source-id: eb8baba86ec0deb59a1e0b1cf9ffb02f056ecd92
2018-01-26 21:49:16 +03:00
|
|
|
$ hg up 2
|
|
|
|
2 files updated, 0 files merged, 3 files removed, 0 files unresolved
|
|
|
|
$ echo 'e' > c
|
|
|
|
$ hg add
|
|
|
|
adding c
|
|
|
|
$ hg com -m 'e -> c'
|
|
|
|
$ hg up 1
|
|
|
|
0 files updated, 0 files merged, 2 files removed, 0 files unresolved
|
|
|
|
$ hg tglog
|
|
|
|
o 4: 6af061510c70 'e -> c'
|
|
|
|
|
|
|
|
|
| o 3: 844a7de3e617 'c'
|
|
|
|
| |
|
|
|
|
o | 2: 09c044d2cb43 'd'
|
|
|
|
| |
|
|
|
|
@ | 1: fc055c3b4d33 'b'
|
|
|
|
|/
|
|
|
|
o 0: b173517d0057 'a'
|
|
|
|
|
|
|
|
$ hg rebase -r 3 -d 4
|
|
|
|
rebasing 3:844a7de3e617 "c"
|
|
|
|
merging c
|
2018-04-07 00:34:37 +03:00
|
|
|
hit merge conflicts; using on-disk merge instead (in-memory merge does not support merge conflicts)
|
rebase: fix a bug where rebases would wrongly be restarted
Summary:
If `rebase.experimental.inmemory` was enabled, but you ended up merging on-disk (e.g. you rebased the working copy parent), and you got merge conflicts, and didn't immediately solve them, hg would discard any work you did and restart the rebase unnecessarily.
The bug here is basically that `rbsrt.inmemory` field can be set to False later, because we make further calculations once we define the `rebaseset`. In that case `InterventionRequired` will get raised if the user didn't solve conflicts, but we'll catch it, thinking something went wrong "in-memory", and abort/rerun the rebase. I was too hasty in adding the "catch all exceptions and retry" block.
I solved this two ways -- first, move the rbsrt definition here and explicitly check the state in the Exception catch. Second, add an explicit catch for InterventionRequired and explain why with a comment.
Further refactoring of the rebase code will help here, I think, so we can consolidate all of this logic.
Reviewed By: DurhamG
Differential Revision: D6817683
fbshipit-source-id: eb8baba86ec0deb59a1e0b1cf9ffb02f056ecd92
2018-01-26 21:49:16 +03:00
|
|
|
rebasing 3:844a7de3e617 "c"
|
|
|
|
merging c
|
|
|
|
warning: conflicts while merging c! (edit, then use 'hg resolve --mark')
|
|
|
|
unresolved conflicts (see hg resolve, then hg rebase --continue)
|
|
|
|
[1]
|
2018-02-03 02:33:37 +03:00
|
|
|
$ hg rebase --abort
|
|
|
|
rebase aborted
|
|
|
|
|
|
|
|
Test inmemorydisallowedpaths carve-out:
|
|
|
|
$ cat <<EOF >> $HGRCPATH
|
|
|
|
> [rebase]
|
|
|
|
> experimental.inmemorydisallowedpaths=c|g
|
|
|
|
> EOF
|
2018-06-24 22:11:41 +03:00
|
|
|
$ hg up -Cq 3
|
2018-02-03 02:33:37 +03:00
|
|
|
$ echo 'g' > g
|
|
|
|
$ hg add -q g
|
|
|
|
$ hg com -qm g
|
|
|
|
$ hg up -qC 4
|
|
|
|
$ echo 'h' > h
|
|
|
|
$ hg add -q h
|
|
|
|
$ hg com -qm h
|
|
|
|
$ hg up 0
|
|
|
|
0 files updated, 0 files merged, 4 files removed, 0 files unresolved
|
|
|
|
$ hg tglog
|
|
|
|
o 6: 02554e3f8526 'h'
|
|
|
|
|
|
|
|
|
| o 5: e8cedfb0cf72 'g'
|
|
|
|
| |
|
|
|
|
o | 4: 6af061510c70 'e -> c'
|
|
|
|
| |
|
|
|
|
| o 3: 844a7de3e617 'c'
|
|
|
|
| |
|
|
|
|
o | 2: 09c044d2cb43 'd'
|
|
|
|
| |
|
|
|
|
o | 1: fc055c3b4d33 'b'
|
|
|
|
|/
|
|
|
|
@ 0: b173517d0057 'a'
|
|
|
|
|
|
|
|
$ hg rebase -r 5 -d 0 --debug | grep disabling
|
|
|
|
disabling IMM because: path matched inmemory_disallowed_paths: g
|
|
|
|
$ hg rebase -s 3 -d 0 --debug | grep disabling
|
|
|
|
disabling IMM because: path matched inmemory_disallowed_paths: c
|
|
|
|
$ hg tglog
|
|
|
|
o 6: f3a876323b82 'g'
|
|
|
|
|
|
|
|
|
| o 5: 02554e3f8526 'h'
|
|
|
|
| |
|
|
|
|
| o 4: 6af061510c70 'e -> c'
|
|
|
|
| |
|
|
|
|
+---o 3: 844a7de3e617 'c'
|
|
|
|
| |
|
|
|
|
| o 2: 09c044d2cb43 'd'
|
|
|
|
| |
|
|
|
|
| o 1: fc055c3b4d33 'b'
|
|
|
|
|/
|
|
|
|
@ 0: b173517d0057 'a'
|
|
|
|
|
|
|
|
$ hg rebase -r 5 -d 0 --debug | grep disabling
|
|
|
|
[1]
|
2018-04-02 22:11:53 +03:00
|
|
|
|
2018-06-24 22:11:41 +03:00
|
|
|
Allow the working copy parent to be rebased with IMM:
|
2018-04-02 22:11:53 +03:00
|
|
|
$ cat <<EOF >> .hg/hgrc
|
|
|
|
> [rebase]
|
|
|
|
> experimental.inmemorywarning=rebasing in-memory!
|
|
|
|
> EOF
|
|
|
|
$ hg up -C 6
|
|
|
|
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
$ hg rebase -r . -d 5
|
|
|
|
rebasing in-memory!
|
|
|
|
rebasing 6:f19e4c5309bc "h" (tip)
|
|
|
|
saved backup bundle to $TESTTMP/repo1/repo2/.hg/strip-backup/f19e4c5309bc-e3db5525-rebase.hg
|
|
|
|
$ hg tglog
|
|
|
|
@ 6: 0b514f19a9ab 'h'
|
|
|
|
|
|
|
|
|
o 5: f3a876323b82 'g'
|
|
|
|
|
|
|
|
|
| o 4: 6af061510c70 'e -> c'
|
|
|
|
| |
|
|
|
|
+---o 3: 844a7de3e617 'c'
|
|
|
|
| |
|
|
|
|
| o 2: 09c044d2cb43 'd'
|
|
|
|
| |
|
|
|
|
| o 1: fc055c3b4d33 'b'
|
|
|
|
|/
|
|
|
|
o 0: b173517d0057 'a'
|
|
|
|
|
|
|
|
|
|
|
|
Ensure if we rebase the WCP, we still require the working copy to be clean up
|
|
|
|
front:
|
|
|
|
$ echo 'd' > i
|
|
|
|
$ hg add i
|
|
|
|
$ hg rebase -r . -d 0
|
|
|
|
abort: uncommitted changes
|
|
|
|
[255]
|
|
|
|
$ hg up -Cq .
|
2018-06-19 22:15:18 +03:00
|
|
|
$ hg st
|
|
|
|
? c.orig
|
|
|
|
? i
|