Mercurial > hg-stable
diff hgext/uncommit.py @ 42051:f4147ca63d39
uncommit: abort if an explicitly given file cannot be uncommitted (BC)
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.
author | Matt Harbison <matt_harbison@yahoo.com> |
---|---|
date | Fri, 29 Mar 2019 21:53:15 -0400 |
parents | 550a172a603b |
children | 566daffc607d |
line wrap: on
line diff
--- a/hgext/uncommit.py Mon Mar 25 12:33:41 2019 +0530 +++ b/hgext/uncommit.py Fri Mar 29 21:53:15 2019 -0400 @@ -33,6 +33,7 @@ registrar, rewriteutil, scmutil, + util, ) cmdtable = {} @@ -133,8 +134,34 @@ 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) + + badfiles = set(match.files()) - eligible + + # Naming a parent directory of an eligible file is OK, even + # if not everything tracked in that directory can be + # uncommitted. + if badfiles: + badfiles -= set([f for f in util.dirs(eligible)]) + + for f in sorted(badfiles): + if f in s.clean: + hint = _(b"file was not changed in working directory " + b"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: