[PATCH shelve-ext] shelve: make unshelve not crash when there are missing files (issue4176)

Augie Fackler raf at durin42.com
Thu Jan 19 16:54:08 EST 2017


On Thu, Jan 19, 2017 at 09:51:24AM -0800, Kostia Balytskyi wrote:
> # HG changeset patch
> # User Kostia Balytskyi <ikostia at fb.com>
> # Date 1484848120 28800
> #      Thu Jan 19 09:48:40 2017 -0800
> # Node ID 2a1e998e369d2c5dc828ba805beceb15459746cd
> # Parent  9f264adbe75bfae8551dc0e6e0fce8d43fc7b43a
> shelve: make unshelve not crash when there are missing files (issue4176)

Queued for stable, thanks.

>
> This patch makes it possible to unshelve while having missing files
> in your repo as long as shelved changes don't touch those missing files.
> It also makes error message better otherwise.
>
> diff --git a/hgext/shelve.py b/hgext/shelve.py
> --- a/hgext/shelve.py
> +++ b/hgext/shelve.py
> @@ -650,7 +650,7 @@ def _commitworkingcopychanges(ui, repo,
>      # contains unknown files that are part of the pending change
>      s = repo.status()
>      addedbefore = frozenset(s.added)
> -    if not (s.modified or s.added or s.removed or s.deleted):
> +    if not (s.modified or s.added or s.removed):
>          return tmpwctx, addedbefore
>      ui.status(_("temporarily committing pending changes "
>                  "(restore with 'hg unshelve --abort')\n"))
> @@ -729,6 +729,17 @@ def _finishunshelve(repo, oldtiprev, tr)
>      repo.unfiltered().changelog.strip(oldtiprev, tr)
>      _aborttransaction(repo)
>
> +def _checkunshelveuntrackedproblems(ui, repo, shelvectx):
> +    """Check potential problems which may result from working
> +    copy having untracked changes."""
> +    wcdeleted = set(repo.status().deleted)
> +    shelvetouched = set(shelvectx.files())
> +    intersection = wcdeleted.intersection(shelvetouched)
> +    if intersection:
> +        m = _("shelved change touches missing files")
> +        hint = _("run hg status to see which files are missing")
> +        raise error.Abort(m, hint=hint)
> +
>  @command('unshelve',
>           [('a', 'abort', None,
>             _('abort an incomplete unshelve operation')),
> @@ -857,7 +868,7 @@ def _dounshelve(ui, repo, *shelved, **op
>                                                           tmpwctx)
>
>          repo, shelvectx = _unshelverestorecommit(ui, repo, basename, oldquiet)
> -
> +        _checkunshelveuntrackedproblems(ui, repo, shelvectx)
>          branchtorestore = ''
>          if shelvectx.branch() != shelvectx.p1().branch():
>              branchtorestore = shelvectx.branch()
> diff --git a/tests/test-shelve.t b/tests/test-shelve.t
> --- a/tests/test-shelve.t
> +++ b/tests/test-shelve.t
> @@ -1710,3 +1710,30 @@ Unshelve respects --keep even if user in
>    $ hg shelve --list
>    default         (*s ago)    changes to: 1 (glob)
>    $ cd ..
> +
> +Unshelving when there are deleted files does not crash (issue4176)
> +  $ hg init unshelve-deleted-file && cd unshelve-deleted-file
> +  $ echo a > a && echo b > b && hg ci -Am ab
> +  adding a
> +  adding b
> +  $ echo aa > a && hg shelve
> +  shelved as default
> +  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
> +  $ rm b
> +  $ hg st
> +  ! b
> +  $ hg unshelve
> +  unshelving change 'default'
> +  $ hg shelve
> +  shelved as default
> +  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
> +  $ rm a && echo b > b
> +  $ hg st
> +  ! a
> +  $ hg unshelve
> +  unshelving change 'default'
> +  abort: shelved change touches missing files
> +  (run hg status to see which files are missing)
> +  [255]
> +  $ hg st
> +  ! a
> _______________________________________________
> 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