[PATCH] shelve: don't delete "." when resolving all conflicts in its favour (issue4398)

Augie Fackler raf at durin42.com
Wed Oct 8 09:02:11 CDT 2014


On Wed, Oct 08, 2014 at 08:23:32AM -0400, Jordi Gutiérrez Hermoso wrote:
> # HG changeset patch
> # User Jordi Gutiérrez Hermoso <jordigh at octave.org>
> # Date 1412768831 14400
> #      Wed Oct 08 07:47:11 2014 -0400
> # Node ID 825f51a02a12e5b15763e2082ed5da5d967086c4
> # Parent  564ae7d2ec9bee86b00a6ba817271ac0b19deca7
> shelve: don't delete "." when resolving all conflicts in its favour (issue4398)

Looks good. Queued for stable since it's a bugfix.

>
> When unshelving and facing a conflict, if we resolve all conflicts in
> favour of the committed changes instead of the shelved changes, then
> the ensuing implicit rebase is a no-op. That is, there is nothing to
> rebase. In this case, there are no extra intermediate shelve commits
> to strip either. Prior to this change, the commit being unshelved to
> would be marked for destruction in a rather catastrophic way.
>
> The relevant part of the test case failed as follows:
>
>     $ hg unshelve -c
>     unshelve of 'default' complete
>     $ hg diff
>     warning: ignoring unknown working parent 33f7f61e6c5e!
>     diff --git a/a/a b/a/a
>     new file mode 100644
>     --- /dev/null
>            b/a/a
>     @@ -0,0   1,3 @@
>       a
>       c
>       x
>     $ hg status
>     warning: ignoring unknown working parent 33f7f61e6c5e!
>     M a/a
>     ? a/a.orig
>     ? foo/foo
>     $ hg summary
>     warning: ignoring unknown working parent 33f7f61e6c5e!
>     parent: -1:000000000000  (no revision checked out)
>     branch: default
>     commit: 1 modified, 2 unknown (new branch head)
>     update: 4 new changesets (update)
>
> With this change, this test case now passes.
>
> diff --git a/hgext/shelve.py b/hgext/shelve.py
> --- a/hgext/shelve.py
> +++ b/hgext/shelve.py
> @@ -449,10 +449,12 @@ def unshelvecontinue(ui, repo, state, op
>          if not shelvectx in state.pendingctx.children():
>              # rebase was a no-op, so it produced no child commit
>              shelvectx = state.pendingctx
> +        else:
> +            # only strip the shelvectx if the rebase produced it
> +            state.stripnodes.append(shelvectx.node())
>
>          mergefiles(ui, repo, state.wctx, shelvectx)
>
> -        state.stripnodes.append(shelvectx.node())
>          repair.strip(ui, repo, state.stripnodes, backup=False, topic='shelve')
>          shelvedstate.clear(repo)
>          unshelvecleanup(ui, repo, state.name, opts)
> diff --git a/tests/test-shelve.t b/tests/test-shelve.t
> --- a/tests/test-shelve.t
> +++ b/tests/test-shelve.t
> @@ -687,6 +687,49 @@ unshelve and conflicts with tracked and
>    g
>    $ hg shelve --delete default
>
> +Recreate some conflict again
> +
> +  $ cd ../repo
> +  $ hg up -C -r 3
> +  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
> +  (leaving bookmark test)
> +  $ echo y >> a/a
> +  $ hg shelve
> +  shelved as default
> +  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
> +  $ hg up test
> +  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
> +  (activating bookmark test)
> +  $ hg unshelve
> +  unshelving change 'default'
> +  rebasing shelved changes
> +  merging a/a
> +  warning: conflicts during merge.
> +  merging a/a incomplete! (edit conflicts, then use 'hg resolve --mark')
> +  unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
> +  [1]
> +
> +Test that resolving all conflicts in one direction (so that the rebase
> +is a no-op), works (issue4398)
> +
> +  $ hg revert -a -r .
> +  reverting a/a
> +  $ hg resolve -m a/a
> +  (no more unresolved files)
> +  $ hg unshelve -c
> +  unshelve of 'default' complete
> +  $ hg diff
> +  $ hg status
> +  ? a/a.orig
> +  ? foo/foo
> +  $ hg summary
> +  parent: 4:33f7f61e6c5e tip
> +   create conflict
> +  branch: default
> +  bookmarks: *test
> +  commit: 2 unknown (clean)
> +  update: (current)
> +
>    $ hg shelve --delete --stat
>    abort: options '--delete' and '--stat' may not be used together
>    [255]
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel


More information about the Mercurial-devel mailing list