[PATCH] uncommit: abort if an explicitly given file is uncommittable
Josef 'Jeff' Sipek
jeffpc at josefsipek.net
Sat Mar 30 05:00:00 EDT 2019
On Sat, Mar 30, 2019 at 00:25:48 -0400, Matt Harbison wrote:
> # HG changeset patch
> # User Matt Harbison <matt_harbison at yahoo.com>
> # Date 1553910795 14400
> # Fri Mar 29 21:53:15 2019 -0400
> # Node ID 25c902e210625bf71459da835ef4e5558fbab7dc
> # Parent eec20025ada33889233e553c5825aac36b708f6c
> uncommit: abort if an explicitly given file is uncommittable
Shouldn't this technically say "... is non-uncommittable" or something like
that? :)
Jeff.
>
> I've gotten burned several times by this in the last few days. The former tests
> look simple enough, but if a good file and a bad file are given, the bad files
> are silently ignored. Some commands like `forget` will warn about bogus files,
> but that would likely get lost in the noise of an interactive uncommit. The
> commit command aborts if a bad file is given, so this seems more consistent for
> commands that alter the repository.
>
> diff --git a/hgext/uncommit.py b/hgext/uncommit.py
> --- a/hgext/uncommit.py
> +++ b/hgext/uncommit.py
> @@ -133,8 +133,28 @@ def uncommit(ui, repo, *pats, **opts):
> if len(old.parents()) > 1:
> raise error.Abort(_("cannot uncommit merge changeset"))
>
> + match = scmutil.match(old, pats, opts)
> +
> + # Check all explicitly given files; abort if there's a problem.
> + if match.files():
> + s = old.status(old.p1(), match, listclean=True)
> + eligible = set(s.added) | set(s.modified) | set(s.removed)
> +
> + for f in match.files():
> + if f not in eligible:
> + if f in s.clean:
> + hint = _(
> + b"file was not changed in working directory parent")
> + elif repo.wvfs.exists(f):
> + hint = _(
> + b"file was untracked in working directory parent")
> + else:
> + hint = _(b"file does not exist")
> +
> + raise error.Abort(_(b'cannot uncommit "%s"')
> + % scmutil.getuipathfn(repo)(f), hint=hint)
> +
> with repo.transaction('uncommit'):
> - match = scmutil.match(old, pats, opts)
> keepcommit = pats
> if not keepcommit:
> if opts.get('keep') is not None:
> diff --git a/tests/test-uncommit.t b/tests/test-uncommit.t
> --- a/tests/test-uncommit.t
> +++ b/tests/test-uncommit.t
> @@ -102,14 +102,16 @@ Recommit
> $ hg heads -T '{rev}:{node} {desc}'
> 5:0c07a3ccda771b25f1cb1edbd02e683723344ef1 new change abcde (no-eol)
>
> -Uncommit of non-existent and unchanged files has no effect
> +Uncommit of non-existent and unchanged files aborts
> $ hg uncommit nothinghere
> - nothing to uncommit
> - [1]
> + abort: cannot uncommit "nothinghere"
> + (file does not exist)
> + [255]
> $ hg status
> $ hg uncommit file-abc
> - nothing to uncommit
> - [1]
> + abort: cannot uncommit "file-abc"
> + (file was not changed in working directory parent)
> + [255]
> $ hg status
>
> Try partial uncommit, also moves bookmark
> @@ -513,3 +515,12 @@ Copy a->b1 and a->b2, then rename b1->c
> date: Thu Jan 01 00:00:00 1970 +0000
> summary: add a
>
> +Removes can be uncommitted
> +
> + $ hg ci -m 'modified b'
> + $ hg rm b
> + $ hg ci -m 'remove b'
> + $ hg uncommit b
> + note: keeping empty commit
> + $ hg status
> + R b
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
--
Computer Science is no more about computers than astronomy is about
telescopes.
- Edsger Dijkstra
More information about the Mercurial-devel
mailing list