remove: queue warnings until after status messages (
issue5140) (API)
Before this change, warnings were interspersed with (and easily drowned out by)
status messages.
API:
abstractsubrepo.removefiles has an extra argument warnings,
into which callees should append their warnings.
Note: Callees should not assume that there will be items in the list,
today, I'm lazily including any other subrepos warnings, but
that may change.
cmdutil.remove has an extra optional argument warnings,
into which it will place warnings.
If warnings is omitted, warnings will be reported via ui.warn()
as before this change (albeit, after any status messages).
--- a/mercurial/cmdutil.py Mon Mar 21 04:01:29 2016 +0000
+++ b/mercurial/cmdutil.py Thu Mar 17 18:19:36 2016 +0000
@@ -2404,7 +2404,7 @@
return ret
-def remove(ui, repo, m, prefix, after, force, subrepos):
+def remove(ui, repo, m, prefix, after, force, subrepos, warnings=None):
join = lambda f: os.path.join(prefix, f)
ret = 0
s = repo.status(match=m, clean=True)
@@ -2412,6 +2412,12 @@
wctx = repo[None]
+ if warnings is None:
+ warnings = []
+ warn = True
+ else:
+ warn = False
+
for subpath in sorted(wctx.substate):
def matchessubrepo(matcher, subpath):
if matcher.exact(subpath):
@@ -2425,10 +2431,11 @@
sub = wctx.sub(subpath)
try:
submatch = matchmod.subdirmatcher(subpath, m)
- if sub.removefiles(submatch, prefix, after, force, subrepos):
+ if sub.removefiles(submatch, prefix, after, force, subrepos,
+ warnings):
ret = 1
except error.LookupError:
- ui.status(_("skipping missing subrepository: %s\n")
+ warnings.append(_("skipping missing subrepository: %s\n")
% join(subpath))
# warn about failure to delete explicit files/dirs
@@ -2446,10 +2453,10 @@
if repo.wvfs.exists(f):
if repo.wvfs.isdir(f):
- ui.warn(_('not removing %s: no tracked files\n')
+ warnings.append(_('not removing %s: no tracked files\n')
% m.rel(f))
else:
- ui.warn(_('not removing %s: file is untracked\n')
+ warnings.append(_('not removing %s: file is untracked\n')
% m.rel(f))
# missing files will generate a warning elsewhere
ret = 1
@@ -2459,16 +2466,16 @@
elif after:
list = deleted
for f in modified + added + clean:
- ui.warn(_('not removing %s: file still exists\n') % m.rel(f))
+ warnings.append(_('not removing %s: file still exists\n') % m.rel(f))
ret = 1
else:
list = deleted + clean
for f in modified:
- ui.warn(_('not removing %s: file is modified (use -f'
+ warnings.append(_('not removing %s: file is modified (use -f'
' to force removal)\n') % m.rel(f))
ret = 1
for f in added:
- ui.warn(_('not removing %s: file has been marked for add'
+ warnings.append(_('not removing %s: file has been marked for add'
' (use forget to undo)\n') % m.rel(f))
ret = 1
@@ -2484,6 +2491,10 @@
util.unlinkpath(repo.wjoin(f), ignoremissing=True)
repo[None].forget(list)
+ if warn:
+ for warning in warnings:
+ ui.warn(warning)
+
return ret
def cat(ui, repo, ctx, matcher, prefix, **opts):
--- a/mercurial/subrepo.py Mon Mar 21 04:01:29 2016 +0000
+++ b/mercurial/subrepo.py Thu Mar 17 18:19:36 2016 +0000
@@ -575,11 +575,13 @@
def forget(self, match, prefix):
return ([], [])
- def removefiles(self, matcher, prefix, after, force, subrepos):
+ def removefiles(self, matcher, prefix, after, force, subrepos, warnings):
"""remove the matched files from the subrepository and the filesystem,
possibly by force and/or after the file has been removed from the
filesystem. Return 0 on success, 1 on any warning.
"""
+ warnings.append(_("warning: removefiles not implemented (%s)")
+ % self._path)
return 1
def revert(self, substate, *pats, **opts):
@@ -991,7 +993,7 @@
self.wvfs.reljoin(prefix, self._path), True)
@annotatesubrepoerror
- def removefiles(self, matcher, prefix, after, force, subrepos):
+ def removefiles(self, matcher, prefix, after, force, subrepos, warnings):
return cmdutil.remove(self.ui, self._repo, matcher,
self.wvfs.reljoin(prefix, self._path),
after, force, subrepos)
--- a/tests/test-remove.t Mon Mar 21 04:01:29 2016 +0000
+++ b/tests/test-remove.t Thu Mar 17 18:19:36 2016 +0000
@@ -277,8 +277,8 @@
$ rm test/bar
$ remove -A test
+ removing test/bar (glob)
not removing test/foo: file still exists (glob)
- removing test/bar (glob)
exit code: 1
R test/bar
./foo