[PATCH STABLE V2] rebase: fix rebase aborts when 'tip-1' is public (issue4082)
Augie Fackler
raf at durin42.com
Tue Nov 5 12:33:56 CST 2013
On Tue, Nov 05, 2013 at 10:14:51AM -0800, Durham Goode wrote:
> # HG changeset patch
> # User Durham Goode <durham at fb.com>
> # Date 1383623940 28800
> # Mon Nov 04 19:59:00 2013 -0800
> # Branch stable
> # Node ID 4e5cb8149929ed1b2afa1fc44564429a31a9fc51
> # Parent 7c4cf8367673e3100cda62927b096cdd9497a409
> rebase: fix rebase aborts when 'tip-1' is public (issue4082)
Looks superficially reasonable, but I'd like someone else to take a
look at this too.
>
> When aborting a rebase where tip-1 is public, rebase would fail to undo the merge
> state. This caused unexpected dirstate parents and also caused unshelve to
> become unabortable (since it uses rebase under the hood).
>
> The problem was that rebase uses -2 as a marker rev, and when it checked for
> immutableness during the abort, -2 got resolved to the second to last entry in
> the phase cache.
>
> Adds a test for the fix. Add exception to phase code to prevent this in the
> future.
>
> diff --git a/hgext/rebase.py b/hgext/rebase.py
> --- a/hgext/rebase.py
> +++ b/hgext/rebase.py
> @@ -692,7 +692,7 @@
>
> def abort(repo, originalwd, target, state):
> 'Restore the repository to its original state'
> - dstates = [s for s in state.values() if s != nullrev]
> + dstates = [s for s in state.values() if s > nullrev]
> immutable = [d for d in dstates if not repo[d].mutable()]
> cleanup = True
> if immutable:
> diff --git a/mercurial/phases.py b/mercurial/phases.py
> --- a/mercurial/phases.py
> +++ b/mercurial/phases.py
> @@ -185,6 +185,8 @@
> # be replaced without us being notified.
> if rev == nullrev:
> return public
> + if rev < nullrev:
> + raise ValueError(_('cannot lookup negative revision'))
> if self._phaserevs is None or rev >= len(self._phaserevs):
> self._phaserevs = self.getphaserevs(repo, rebuild=True)
> return self._phaserevs[rev]
> diff --git a/tests/test-rebase-abort.t b/tests/test-rebase-abort.t
> --- a/tests/test-rebase-abort.t
> +++ b/tests/test-rebase-abort.t
> @@ -181,3 +181,46 @@
>
>
> $ cd ..
> +
> +rebase abort should not leave working copy in a merge state if tip-1 is public
> +(issue4082)
> +
> + $ hg init abortpublic
> + $ cd abortpublic
> + $ echo a > a && hg ci -Aqm a
> + $ hg book master
> + $ hg book foo
> + $ echo b > b && hg ci -Aqm b
> + $ hg up -q master
> + $ echo c > c && hg ci -Aqm c
> + $ hg phase -p -r .
> + $ hg up -q foo
> + $ echo C > c && hg ci -Aqm C
> + $ hg log -G --template "{rev} {desc} {bookmarks}"
> + @ 3 C foo
> + |
> + | o 2 c master
> + | |
> + o | 1 b
> + |/
> + o 0 a
> +
> +
> + $ hg rebase -d master -r foo
> + merging c
> + warning: conflicts during merge.
> + merging c incomplete! (edit conflicts, then use 'hg resolve --mark')
> + unresolved conflicts (see hg resolve, then hg rebase --continue)
> + [1]
> + $ hg rebase --abort
> + rebase aborted
> + $ hg log -G --template "{rev} {desc} {bookmarks}"
> + @ 3 C foo
> + |
> + | o 2 c master
> + | |
> + o | 1 b
> + |/
> + o 0 a
> +
> + $ cd ..
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel
More information about the Mercurial-devel
mailing list