Mercurial > public > mercurial-scm > hg
comparison mercurial/cmdutil.py @ 28607:a88959ae5938
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).
author | timeless <timeless@mozdev.org> |
---|---|
date | Thu, 17 Mar 2016 18:19:36 +0000 |
parents | cd10171d6c71 |
children | 62e73d42bd14 |
comparison
equal
deleted
inserted
replaced
28606:8cc51c5a9365 | 28607:a88959ae5938 |
---|---|
2402 ui.status(_("skipping missing subrepository: %s\n") | 2402 ui.status(_("skipping missing subrepository: %s\n") |
2403 % m.abs(subpath)) | 2403 % m.abs(subpath)) |
2404 | 2404 |
2405 return ret | 2405 return ret |
2406 | 2406 |
2407 def remove(ui, repo, m, prefix, after, force, subrepos): | 2407 def remove(ui, repo, m, prefix, after, force, subrepos, warnings=None): |
2408 join = lambda f: os.path.join(prefix, f) | 2408 join = lambda f: os.path.join(prefix, f) |
2409 ret = 0 | 2409 ret = 0 |
2410 s = repo.status(match=m, clean=True) | 2410 s = repo.status(match=m, clean=True) |
2411 modified, added, deleted, clean = s[0], s[1], s[3], s[6] | 2411 modified, added, deleted, clean = s[0], s[1], s[3], s[6] |
2412 | 2412 |
2413 wctx = repo[None] | 2413 wctx = repo[None] |
2414 | |
2415 if warnings is None: | |
2416 warnings = [] | |
2417 warn = True | |
2418 else: | |
2419 warn = False | |
2414 | 2420 |
2415 for subpath in sorted(wctx.substate): | 2421 for subpath in sorted(wctx.substate): |
2416 def matchessubrepo(matcher, subpath): | 2422 def matchessubrepo(matcher, subpath): |
2417 if matcher.exact(subpath): | 2423 if matcher.exact(subpath): |
2418 return True | 2424 return True |
2423 | 2429 |
2424 if subrepos or matchessubrepo(m, subpath): | 2430 if subrepos or matchessubrepo(m, subpath): |
2425 sub = wctx.sub(subpath) | 2431 sub = wctx.sub(subpath) |
2426 try: | 2432 try: |
2427 submatch = matchmod.subdirmatcher(subpath, m) | 2433 submatch = matchmod.subdirmatcher(subpath, m) |
2428 if sub.removefiles(submatch, prefix, after, force, subrepos): | 2434 if sub.removefiles(submatch, prefix, after, force, subrepos, |
2435 warnings): | |
2429 ret = 1 | 2436 ret = 1 |
2430 except error.LookupError: | 2437 except error.LookupError: |
2431 ui.status(_("skipping missing subrepository: %s\n") | 2438 warnings.append(_("skipping missing subrepository: %s\n") |
2432 % join(subpath)) | 2439 % join(subpath)) |
2433 | 2440 |
2434 # warn about failure to delete explicit files/dirs | 2441 # warn about failure to delete explicit files/dirs |
2435 deleteddirs = util.dirs(deleted) | 2442 deleteddirs = util.dirs(deleted) |
2436 for f in m.files(): | 2443 for f in m.files(): |
2444 if f in repo.dirstate or isdir or f == '.' or insubrepo(): | 2451 if f in repo.dirstate or isdir or f == '.' or insubrepo(): |
2445 continue | 2452 continue |
2446 | 2453 |
2447 if repo.wvfs.exists(f): | 2454 if repo.wvfs.exists(f): |
2448 if repo.wvfs.isdir(f): | 2455 if repo.wvfs.isdir(f): |
2449 ui.warn(_('not removing %s: no tracked files\n') | 2456 warnings.append(_('not removing %s: no tracked files\n') |
2450 % m.rel(f)) | 2457 % m.rel(f)) |
2451 else: | 2458 else: |
2452 ui.warn(_('not removing %s: file is untracked\n') | 2459 warnings.append(_('not removing %s: file is untracked\n') |
2453 % m.rel(f)) | 2460 % m.rel(f)) |
2454 # missing files will generate a warning elsewhere | 2461 # missing files will generate a warning elsewhere |
2455 ret = 1 | 2462 ret = 1 |
2456 | 2463 |
2457 if force: | 2464 if force: |
2458 list = modified + deleted + clean + added | 2465 list = modified + deleted + clean + added |
2459 elif after: | 2466 elif after: |
2460 list = deleted | 2467 list = deleted |
2461 for f in modified + added + clean: | 2468 for f in modified + added + clean: |
2462 ui.warn(_('not removing %s: file still exists\n') % m.rel(f)) | 2469 warnings.append(_('not removing %s: file still exists\n') % m.rel(f)) |
2463 ret = 1 | 2470 ret = 1 |
2464 else: | 2471 else: |
2465 list = deleted + clean | 2472 list = deleted + clean |
2466 for f in modified: | 2473 for f in modified: |
2467 ui.warn(_('not removing %s: file is modified (use -f' | 2474 warnings.append(_('not removing %s: file is modified (use -f' |
2468 ' to force removal)\n') % m.rel(f)) | 2475 ' to force removal)\n') % m.rel(f)) |
2469 ret = 1 | 2476 ret = 1 |
2470 for f in added: | 2477 for f in added: |
2471 ui.warn(_('not removing %s: file has been marked for add' | 2478 warnings.append(_('not removing %s: file has been marked for add' |
2472 ' (use forget to undo)\n') % m.rel(f)) | 2479 ' (use forget to undo)\n') % m.rel(f)) |
2473 ret = 1 | 2480 ret = 1 |
2474 | 2481 |
2475 for f in sorted(list): | 2482 for f in sorted(list): |
2476 if ui.verbose or not m.exact(f): | 2483 if ui.verbose or not m.exact(f): |
2481 for f in list: | 2488 for f in list: |
2482 if f in added: | 2489 if f in added: |
2483 continue # we never unlink added files on remove | 2490 continue # we never unlink added files on remove |
2484 util.unlinkpath(repo.wjoin(f), ignoremissing=True) | 2491 util.unlinkpath(repo.wjoin(f), ignoremissing=True) |
2485 repo[None].forget(list) | 2492 repo[None].forget(list) |
2493 | |
2494 if warn: | |
2495 for warning in warnings: | |
2496 ui.warn(warning) | |
2486 | 2497 |
2487 return ret | 2498 return ret |
2488 | 2499 |
2489 def cat(ui, repo, ctx, matcher, prefix, **opts): | 2500 def cat(ui, repo, ctx, matcher, prefix, **opts): |
2490 err = 1 | 2501 err = 1 |