Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/commands.py @ 6605:bf2bf986ff87
status: refactor status command
- directly calculate a list of states to show
- simplify repo.status call
- use zip to build file list
- only add relevant copies to copy dict
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Mon, 12 May 2008 11:37:56 -0500 |
parents | 41eb20cc1c02 |
children | 0697e7818d07 |
comparison
equal
deleted
inserted
replaced
6604:98b6e6f0e49b | 6605:bf2bf986ff87 |
---|---|
2622 ? = not tracked | 2622 ? = not tracked |
2623 I = ignored | 2623 I = ignored |
2624 = the previous added file was copied from here | 2624 = the previous added file was copied from here |
2625 """ | 2625 """ |
2626 | 2626 |
2627 all = opts['all'] | |
2628 node1, node2 = cmdutil.revpair(repo, opts.get('rev')) | 2627 node1, node2 = cmdutil.revpair(repo, opts.get('rev')) |
2629 | |
2630 matcher = cmdutil.match(repo, pats, opts) | |
2631 cwd = (pats and repo.getcwd()) or '' | 2628 cwd = (pats and repo.getcwd()) or '' |
2632 modified, added, removed, deleted, unknown, ignored, clean = [ | 2629 end = opts['print0'] and '\0' or '\n' |
2633 n for n in repo.status(node1, node2, matcher, | |
2634 list_ignored=opts['ignored'] | |
2635 or all and not ui.quiet, | |
2636 list_clean=opts['clean'] or all, | |
2637 list_unknown=opts['unknown'] | |
2638 or not (ui.quiet or | |
2639 opts['modified'] or | |
2640 opts['added'] or | |
2641 opts['removed'] or | |
2642 opts['deleted'] or | |
2643 opts['ignored']))] | |
2644 | |
2645 changetypes = (('modified', 'M', modified), | |
2646 ('added', 'A', added), | |
2647 ('removed', 'R', removed), | |
2648 ('deleted', '!', deleted), | |
2649 ('unknown', '?', unknown), | |
2650 ('ignored', 'I', ignored)) | |
2651 | |
2652 explicit_changetypes = changetypes + (('clean', 'C', clean),) | |
2653 | |
2654 copy = {} | 2630 copy = {} |
2655 showcopy = {} | 2631 states = 'modified added removed deleted unknown ignored clean'.split() |
2656 if ((all or opts.get('copies')) and not opts.get('no_status')): | 2632 show = [k for k in states if opts[k]] |
2633 if opts['all']: | |
2634 show += ui.quiet and (states[:4] + ['clean']) or states | |
2635 if not show: | |
2636 show = ui.quiet and states[:4] or states[:5] | |
2637 | |
2638 stat = repo.status(node1, node2, cmdutil.match(repo, pats, opts), | |
2639 'ignored' in show, 'clean' in show, 'unknown' in show) | |
2640 changestates = zip(states, 'MAR!?IC', stat) | |
2641 | |
2642 if (opts['all'] or opts['copies']) and not opts['no_status']: | |
2657 if opts.get('rev') == []: | 2643 if opts.get('rev') == []: |
2658 # fast path, more correct with merge parents | 2644 # fast path, more correct with merge parents |
2659 showcopy = copy = repo.dirstate.copies().copy() | 2645 copy = repo.dirstate.copies() |
2660 else: | 2646 else: |
2661 ctxn = repo.changectx(nullid) | 2647 ctxn = repo.changectx(nullid) |
2662 ctx1 = repo.changectx(node1) | 2648 ctx1 = repo.changectx(node1) |
2663 ctx2 = repo.changectx(node2) | 2649 ctx2 = repo.changectx(node2) |
2664 if node2 is None: | 2650 if node2 is None: |
2665 ctx2 = repo.workingctx() | 2651 ctx2 = repo.workingctx() |
2666 copy, diverge = copies.copies(repo, ctx1, ctx2, ctxn) | 2652 for k, v in copies.copies(repo, ctx1, ctx2, ctxn)[0].items(): |
2667 for k, v in copy.items(): | 2653 if v in stat.added: |
2668 copy[v] = k | 2654 copy[v] = k |
2669 | 2655 elif k in stat.added: |
2670 end = opts['print0'] and '\0' or '\n' | 2656 copy[k] = v |
2671 | 2657 |
2672 for opt, char, changes in ([ct for ct in explicit_changetypes | 2658 for state, char, files in changestates: |
2673 if all or opts[ct[0]]] | 2659 if state in show: |
2674 or changetypes): | |
2675 | |
2676 if opts['no_status']: | |
2677 format = "%%s%s" % end | |
2678 else: | |
2679 format = "%s %%s%s" % (char, end) | 2660 format = "%s %%s%s" % (char, end) |
2680 | 2661 if opts['no_status']: |
2681 for f in changes: | 2662 format = "%%s%s" % end |
2682 ui.write(format % repo.pathto(f, cwd)) | 2663 |
2683 if f in copy and (f in added or f in showcopy): | 2664 for f in files: |
2684 ui.write(' %s%s' % (repo.pathto(copy[f], cwd), end)) | 2665 ui.write(format % repo.pathto(f, cwd)) |
2666 if f in copy: | |
2667 ui.write(' %s%s' % (repo.pathto(copy[f], cwd), end)) | |
2685 | 2668 |
2686 def tag(ui, repo, name1, *names, **opts): | 2669 def tag(ui, repo, name1, *names, **opts): |
2687 """add one or more tags for the current or given revision | 2670 """add one or more tags for the current or given revision |
2688 | 2671 |
2689 Name a particular revision using <name>. | 2672 Name a particular revision using <name>. |