[PATCH v3] shelve: make unshelve be able to abort in any case
Kostia Balytskyi
ikostia at fb.com
Tue Jul 12 13:13:31 EDT 2016
If this one looks ok to people, I will send a v4 with CorruptedState(Hint, Exception) instead of CorruptedState(HintException).
On 7/12/16, 6:04 PM, "Mercurial-devel on behalf of Kostia Balytskyi" <mercurial-devel-bounces at mercurial-scm.org on behalf of ikostia at fb.com> wrote:
># HG changeset patch
># User Kostia Balytskyi <ikostia at fb.com>
># Date 1468340243 -3600
># Tue Jul 12 17:17:23 2016 +0100
># Node ID 5dbbeae9e7657cec9775db60977570e7efb5ed18
># Parent 2550604f5ec736d4e603b04f6fe746468c0efd3b
>shelve: make unshelve be able to abort in any case
>
>diff --git a/hgext/shelve.py b/hgext/shelve.py
>--- a/hgext/shelve.py
>+++ b/hgext/shelve.py
>@@ -170,16 +170,21 @@ class shelvedstate(object):
> parents = [nodemod.bin(h) for h in fp.readline().split()]
> stripnodes = [nodemod.bin(h) for h in fp.readline().split()]
> branchtorestore = fp.readline().strip()
>+ except (IOError, ValueError, TypeError) as err:
>+ raise error.CorruptedState(err.message)
> finally:
> fp.close()
>
>- obj = cls()
>- obj.name = name
>- obj.wctx = repo[nodemod.bin(wctx)]
>- obj.pendingctx = repo[nodemod.bin(pendingctx)]
>- obj.parents = parents
>- obj.stripnodes = stripnodes
>- obj.branchtorestore = branchtorestore
>+ try:
>+ obj = cls()
>+ obj.name = name
>+ obj.wctx = repo[nodemod.bin(wctx)]
>+ obj.pendingctx = repo[nodemod.bin(pendingctx)]
>+ obj.parents = parents
>+ obj.stripnodes = stripnodes
>+ obj.branchtorestore = branchtorestore
>+ except (TypeError, error.RepoLookupError) as err:
>+ raise error.CorruptedState(err.message)
>
> return obj
>
>@@ -663,9 +668,24 @@ def _dounshelve(ui, repo, *shelved, **op
> try:
> state = shelvedstate.load(repo)
> except IOError as err:
>- if err.errno != errno.ENOENT:
>+ if err.errno == errno.ENOENT:
>+ cmdutil.wrongtooltocontinue(repo, _('unshelve'))
>+ else:
> raise
>- cmdutil.wrongtooltocontinue(repo, _('unshelve'))
>+ except error.CorruptedState as err:
>+ ui.debug(err.message + '\n')
>+ if continuef:
>+ msg = _('could not read shelved state file')
>+ hint = _('please run hg unshelve --abort to abort unshelve '
>+ 'operation')
>+ raise error.Abort(msg, hint=hint)
>+ elif abortf:
>+ msg = _('could not read shelved state file, your working copy '
>+ 'may be in an unexpected state\nplease update to some '
>+ 'commit\n')
>+ ui.warn(msg)
>+ shelvedstate.clear(repo)
>+ return
>
> if abortf:
> return unshelveabort(ui, repo, state, opts)
>diff --git a/mercurial/error.py b/mercurial/error.py
>--- a/mercurial/error.py
>+++ b/mercurial/error.py
>@@ -235,3 +235,6 @@ class InvalidBundleSpecification(Excepti
>
> class UnsupportedBundleSpecification(Exception):
> """error raised when a bundle specification is not supported."""
>+
>+class CorruptedState(HintException):
>+ """error raised when a command is not able to read its state from file"""
>diff --git a/tests/test-shelve.t b/tests/test-shelve.t
>--- a/tests/test-shelve.t
>+++ b/tests/test-shelve.t
>@@ -1585,3 +1585,40 @@ On non bare shelve the branch informatio
> ? b
> $ hg branch
> default
>+ $ cd ..
>+
>+Prepare unshleve with a corrupted shelvedstate
>+ $ hg init r1 && cd r1
>+ $ echo text1 > file && hg add file
>+ $ hg shelve
>+ shelved as default
>+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
>+ $ echo text2 > file && hg ci -Am text1
>+ adding file
>+ $ hg unshelve
>+ unshelving change 'default'
>+ rebasing shelved changes
>+ rebasing 1:396ea74229f9 "(changes in empty repository)" (tip)
>+ merging file
>+ warning: conflicts while merging file! (edit, then use 'hg resolve --mark')
>+ unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
>+ [1]
>+ $ echo somethingsomething > .hg/shelvedstate
>+
>+Unshelve --continue fails with appropriate message if shelvedstate is corrupted
>+ $ hg unshelve --continue
>+ abort: could not read shelved state file
>+ (please run hg unshelve --abort to abort unshelve operation)
>+ [255]
>+
>+Unshelve --abort works with a corrupted shelvedstate
>+ $ hg unshelve --abort
>+ could not read shelved state file, your working copy may be in an unexpected state
>+ please update to some commit
>+
>+Unshelve --abort fails with appropriate message if there's no unshelve in
>+progress
>+ $ hg unshelve --abort
>+ abort: no unshelve in progress
>+ [255]
>+ $ cd ..
>_______________________________________________
>Mercurial-devel mailing list
>Mercurial-devel at mercurial-scm.org
>https://urldefense.proofpoint.com/v2/url?u=https-3A__www.mercurial-2Dscm.org_mailman_listinfo_mercurial-2Ddevel&d=CwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=Pp-gQYFgs4tKlSFPF5kfCw&m=WD6ZmwZ3Xb86_eIJu9dqh-ZZ7fXxIEft3Ny3wQjajkA&s=4ElAiQ2Cw-_O2llxeEeibtlcHcG8R8wXXqA6nTPxaN8&e=
More information about the Mercurial-devel
mailing list