[PATCH] shelve: adds restoring newly created branch (issue5048)
timeless
timeless at gmail.com
Wed Feb 17 15:02:16 EST 2016
Please update `hg help shelve` and `hg help unshelve` to document this.
Also, I'd suggest adding (BC) in the commit, since this is a behavior change.
On Wed, Feb 17, 2016 at 8:17 AM, liscju <piotr.listkiewicz at gmail.com> wrote:
> # HG changeset patch
> # User liscju <piotr.listkiewicz at gmail.com>
> # Date 1455067407 -3600
> # Wed Feb 10 02:23:27 2016 +0100
> # Node ID da5e9a27089d31988dfd2d8cf62fc63805aa13d7
> # Parent a036e1ae1fbe88ab99cb861ebfc2e4da7a3912ca
> shelve: adds restoring newly created branch (issue5048)
>
> Before this patch shelve never preserved branch information,
> so after applying unshelve branch was the same as it was
> on working copy no matter in which branch shelve took place.
>
> This patch makes shelve remember branch in which shelve takes
> place and restoring it in unshelve if shelve takes place
> in newly created branch. In other words, restoring information
> takes place when shelve is made on working copy that is
> prepared for a branch change.
>
> diff -r a036e1ae1fbe -r da5e9a27089d hgext/shelve.py
> --- a/hgext/shelve.py Sun Feb 07 00:49:31 2016 -0600
> +++ b/hgext/shelve.py Wed Feb 10 02:23:27 2016 +0100
> @@ -148,6 +148,8 @@
> pendingctx = fp.readline().strip()
> parents = [bin(h) for h in fp.readline().split()]
> stripnodes = [bin(h) for h in fp.readline().split()]
> + restorebranch = fp.readline().strip() == 'True'
> + origshelvebranch = fp.readline().strip()
> finally:
> fp.close()
>
> @@ -157,11 +159,14 @@
> obj.pendingctx = repo[bin(pendingctx)]
> obj.parents = parents
> obj.stripnodes = stripnodes
> + obj.restorebranch = restorebranch
> + obj.origshelvebranch = origshelvebranch
>
> return obj
>
> @classmethod
> - def save(cls, repo, name, originalwctx, pendingctx, stripnodes):
> + def save(cls, repo, name, originalwctx, pendingctx, stripnodes,
> + restorebranch, origshelvebranch):
> fp = repo.vfs(cls._filename, 'wb')
> fp.write('%i\n' % cls._version)
> fp.write('%s\n' % name)
> @@ -169,6 +174,8 @@
> fp.write('%s\n' % hex(pendingctx.node()))
> fp.write('%s\n' % ' '.join([hex(p) for p in repo.dirstate.parents()]))
> fp.write('%s\n' % ' '.join([hex(n) for n in stripnodes]))
> + fp.write('%s\n' % restorebranch)
> + fp.write('%s\n' % origshelvebranch)
> fp.close()
>
> @classmethod
> @@ -556,6 +563,8 @@
> state.stripnodes.append(shelvectx.node())
>
> mergefiles(ui, repo, state.wctx, shelvectx)
> + if state.restorebranch:
> + repo.dirstate.setbranch(state.origshelvebranch)
>
> repair.strip(ui, repo, state.stripnodes, backup=False, topic='shelve')
> shelvedstate.clear(repo)
> @@ -701,6 +710,8 @@
> ui.quiet = oldquiet
>
> shelvectx = repo['tip']
> + origshelvebranch = shelvectx.branch()
> + restorebranch = shelvectx.branch() != shelvectx.parents()[0].branch()
>
> # If the shelve is not immediately on top of the commit
> # we'll be merging with, rebase it to be on top.
> @@ -718,7 +729,8 @@
>
> stripnodes = [repo.changelog.node(rev)
> for rev in xrange(oldtiprev, len(repo))]
> - shelvedstate.save(repo, basename, pctx, tmpwctx, stripnodes)
> + shelvedstate.save(repo, basename, pctx, tmpwctx, stripnodes,
> + restorebranch, origshelvebranch)
>
> util.rename(repo.join('rebasestate'),
> repo.join('unshelverebasestate'))
> @@ -734,6 +746,8 @@
> shelvectx = tmpwctx
>
> mergefiles(ui, repo, pctx, shelvectx)
> + if restorebranch:
> + repo.dirstate.setbranch(origshelvebranch)
>
> # Forget any files that were unknown before the shelve, unknown before
> # unshelve started, but are now added.
> diff -r a036e1ae1fbe -r da5e9a27089d tests/test-shelve.t
> --- a/tests/test-shelve.t Sun Feb 07 00:49:31 2016 -0600
> +++ b/tests/test-shelve.t Wed Feb 10 02:23:27 2016 +0100
> @@ -1314,3 +1314,107 @@
> $ hg commit -qm "Remove unknown"
>
> $ cd ..
> +
> +When i shelve commit on newly created branch i expect
> +that after unshelve newly created branch will be preserved.
> +
> + $ hg init shelve_on_new_branch_simple
> + $ cd shelve_on_new_branch_simple
> + $ echo "aaa" >> a
> + $ hg commit -A -m "a"
> + adding a
> + $ hg branch
> + default
> + $ hg branch test
> + marked working directory as branch test
> + (branches are permanent and global, did you want a bookmark?)
> + $ echo "bbb" >> a
> + $ hg status
> + M a
> + $ hg shelve
> + shelved as default
> + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
> + $ hg branch
> + default
> + $ echo "bbb" >> b
> + $ hg status
> + ? b
> + $ hg unshelve
> + unshelving change 'default'
> + $ hg status
> + M a
> + ? b
> + $ hg branch
> + test
> +
> +When i shelve commit on newly created branch, make
> +some changes, unshelve it and running into merge
> +conflicts i expect that after fixing them and
> +running unshelve --continue newly created branch
> +will be preserved.
> +
> + $ hg init shelve_on_new_branch_conflict
> + $ cd shelve_on_new_branch_conflict
> + $ echo "aaa" >> a
> + $ hg commit -A -m "a"
> + adding a
> + $ hg branch
> + default
> + $ hg branch test
> + marked working directory as branch test
> + (branches are permanent and global, did you want a bookmark?)
> + $ echo "bbb" >> a
> + $ hg status
> + M a
> + $ hg shelve
> + shelved as default
> + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
> + $ hg branch
> + default
> + $ echo "ccc" >> a
> + $ hg status
> + M a
> + $ hg unshelve
> + unshelving change 'default'
> + temporarily committing pending changes (restore with 'hg unshelve --abort')
> + rebasing shelved changes
> + rebasing 2:425c97ef07f3 "changes to: a" (tip)
> + merging a
> + warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
> + unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
> + [1]
> + $ echo "aaabbbccc" > a
> + $ rm a.orig
> + $ hg resolve --mark a
> + (no more unresolved files)
> + continue: hg unshelve --continue
> + $ hg unshelve --continue
> + rebasing 2:425c97ef07f3 "changes to: a" (tip)
> + unshelve of 'default' complete
> + $ cat a
> + aaabbbccc
> + $ hg status
> + M a
> + $ hg branch
> + test
> + $ hg commit -m "test-commit"
> +
> +When i shelve on test branch, update to default branch
> +and unshelve i expect that it will not preserve previous
> +test branch.
> +
> + $ echo "xxx" > b
> + $ hg add b
> + $ hg shelve
> + shelved as test
> + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
> + $ hg update -r default
> + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
> + $ hg unshelve
> + unshelving change 'test'
> + rebasing shelved changes
> + rebasing 2:357525f34729 "changes to: test-commit" (tip)
> + $ hg status
> + A b
> + $ hg branch
> + default
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
More information about the Mercurial-devel
mailing list