Mercurial > hg > mercurial-crew-with-dirclash
comparison mercurial/commands.py @ 4950:30847b8af7ca
dirstate: add __contains__ and make __getitem__ more useful
dirstate.state(f) == '?' -> f not in dirstate
dirstate.state(f) -> dirstate[f]
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Sat, 21 Jul 2007 16:02:09 -0500 |
parents | 6fd953d5faea |
children | 9a2a73ea6135 |
comparison
equal
deleted
inserted
replaced
4949:fc61495ea9cf | 4950:30847b8af7ca |
---|---|
31 for src, abs, rel, exact in cmdutil.walk(repo, pats, opts): | 31 for src, abs, rel, exact in cmdutil.walk(repo, pats, opts): |
32 if exact: | 32 if exact: |
33 if ui.verbose: | 33 if ui.verbose: |
34 ui.status(_('adding %s\n') % rel) | 34 ui.status(_('adding %s\n') % rel) |
35 names.append(abs) | 35 names.append(abs) |
36 elif repo.dirstate.state(abs) == '?': | 36 elif abs not in repo.dirstate: |
37 ui.status(_('adding %s\n') % rel) | 37 ui.status(_('adding %s\n') % rel) |
38 names.append(abs) | 38 names.append(abs) |
39 if not opts.get('dry_run'): | 39 if not opts.get('dry_run'): |
40 repo.add(names) | 40 repo.add(names) |
41 | 41 |
454 raise util.Abort(_("no match under directory %s!") | 454 raise util.Abort(_("no match under directory %s!") |
455 % rf) | 455 % rf) |
456 elif not (stat.S_ISREG(mode) or stat.S_ISLNK(mode)): | 456 elif not (stat.S_ISREG(mode) or stat.S_ISLNK(mode)): |
457 raise util.Abort(_("can't commit %s: " | 457 raise util.Abort(_("can't commit %s: " |
458 "unsupported file type!") % rf) | 458 "unsupported file type!") % rf) |
459 elif repo.dirstate.state(f) == '?': | 459 elif f not in repo.dirstate: |
460 raise util.Abort(_("file %s not tracked!") % rf) | 460 raise util.Abort(_("file %s not tracked!") % rf) |
461 else: | 461 else: |
462 files = [] | 462 files = [] |
463 try: | 463 try: |
464 repo.commit(files, message, opts['user'], opts['date'], match, | 464 repo.commit(files, message, opts['user'], opts['date'], match, |
480 # rel: ossep | 480 # rel: ossep |
481 # return: hgsep | 481 # return: hgsep |
482 def okaytocopy(abs, rel, exact): | 482 def okaytocopy(abs, rel, exact): |
483 reasons = {'?': _('is not managed'), | 483 reasons = {'?': _('is not managed'), |
484 'r': _('has been marked for remove')} | 484 'r': _('has been marked for remove')} |
485 state = repo.dirstate.state(abs) | 485 state = repo.dirstate[abs] |
486 reason = reasons.get(state) | 486 reason = reasons.get(state) |
487 if reason: | 487 if reason: |
488 if exact: | 488 if exact: |
489 ui.warn(_('%s: not copying - file %s\n') % (rel, reason)) | 489 ui.warn(_('%s: not copying - file %s\n') % (rel, reason)) |
490 else: | 490 else: |
508 ui.warn(_('%s: not overwriting - %s collides with %s\n') % | 508 ui.warn(_('%s: not overwriting - %s collides with %s\n') % |
509 (reltarget, repo.pathto(abssrc, cwd), | 509 (reltarget, repo.pathto(abssrc, cwd), |
510 repo.pathto(prevsrc, cwd))) | 510 repo.pathto(prevsrc, cwd))) |
511 return | 511 return |
512 if (not opts['after'] and os.path.exists(target) or | 512 if (not opts['after'] and os.path.exists(target) or |
513 opts['after'] and repo.dirstate.state(abstarget) not in '?ar'): | 513 opts['after'] and repo.dirstate[abstarget] in 'mn'): |
514 if not opts['force']: | 514 if not opts['force']: |
515 ui.warn(_('%s: not overwriting - file exists\n') % | 515 ui.warn(_('%s: not overwriting - file exists\n') % |
516 reltarget) | 516 reltarget) |
517 return | 517 return |
518 if not opts['after'] and not opts.get('dry_run'): | 518 if not opts['after'] and not opts.get('dry_run'): |
523 else: | 523 else: |
524 targetdir = os.path.dirname(target) or '.' | 524 targetdir = os.path.dirname(target) or '.' |
525 if not os.path.isdir(targetdir) and not opts.get('dry_run'): | 525 if not os.path.isdir(targetdir) and not opts.get('dry_run'): |
526 os.makedirs(targetdir) | 526 os.makedirs(targetdir) |
527 try: | 527 try: |
528 restore = repo.dirstate.state(abstarget) == 'r' | 528 restore = repo.dirstate[abstarget] == 'r' |
529 if restore and not opts.get('dry_run'): | 529 if restore and not opts.get('dry_run'): |
530 repo.undelete([abstarget], wlock) | 530 repo.undelete([abstarget], wlock) |
531 try: | 531 try: |
532 if not opts.get('dry_run'): | 532 if not opts.get('dry_run'): |
533 util.copyfile(src, target) | 533 util.copyfile(src, target) |
545 return | 545 return |
546 if ui.verbose or not exact: | 546 if ui.verbose or not exact: |
547 ui.status(_('copying %s to %s\n') % (relsrc, reltarget)) | 547 ui.status(_('copying %s to %s\n') % (relsrc, reltarget)) |
548 targets[abstarget] = abssrc | 548 targets[abstarget] = abssrc |
549 if abstarget != origsrc: | 549 if abstarget != origsrc: |
550 if repo.dirstate.state(origsrc) == 'a': | 550 if repo.dirstate[origsrc] == 'a': |
551 if not ui.quiet: | 551 if not ui.quiet: |
552 ui.warn(_("%s has not been committed yet, so no copy " | 552 ui.warn(_("%s has not been committed yet, so no copy " |
553 "data will be stored for %s.\n") | 553 "data will be stored for %s.\n") |
554 % (repo.pathto(origsrc, cwd), reltarget)) | 554 % (repo.pathto(origsrc, cwd), reltarget)) |
555 if abstarget not in repo.dirstate and not opts.get('dry_run'): | 555 if abstarget not in repo.dirstate and not opts.get('dry_run'): |
716 repo.dirstate.rebuild(rev, files) | 716 repo.dirstate.rebuild(rev, files) |
717 | 717 |
718 def debugcheckstate(ui, repo): | 718 def debugcheckstate(ui, repo): |
719 """validate the correctness of the current dirstate""" | 719 """validate the correctness of the current dirstate""" |
720 parent1, parent2 = repo.dirstate.parents() | 720 parent1, parent2 = repo.dirstate.parents() |
721 dc = repo.dirstate | |
722 m1 = repo.changectx(parent1).manifest() | 721 m1 = repo.changectx(parent1).manifest() |
723 m2 = repo.changectx(parent2).manifest() | 722 m2 = repo.changectx(parent2).manifest() |
724 errors = 0 | 723 errors = 0 |
725 for f in dc: | 724 for f in repo.dirstate: |
726 state = repo.dirstate.state(f) | 725 state = repo.dirstate[f] |
727 if state in "nr" and f not in m1: | 726 if state in "nr" and f not in m1: |
728 ui.warn(_("%s in state %s, but not in manifest1\n") % (f, state)) | 727 ui.warn(_("%s in state %s, but not in manifest1\n") % (f, state)) |
729 errors += 1 | 728 errors += 1 |
730 if state in "a" and f in m1: | 729 if state in "a" and f in m1: |
731 ui.warn(_("%s in state %s, but also in manifest1\n") % (f, state)) | 730 ui.warn(_("%s in state %s, but also in manifest1\n") % (f, state)) |
733 if state in "m" and f not in m1 and f not in m2: | 732 if state in "m" and f not in m1 and f not in m2: |
734 ui.warn(_("%s in state %s, but not in either manifest\n") % | 733 ui.warn(_("%s in state %s, but not in either manifest\n") % |
735 (f, state)) | 734 (f, state)) |
736 errors += 1 | 735 errors += 1 |
737 for f in m1: | 736 for f in m1: |
738 state = repo.dirstate.state(f) | 737 state = repo.dirstate[f] |
739 if state not in "nrm": | 738 if state not in "nrm": |
740 ui.warn(_("%s in manifest1, but listed as state %s") % (f, state)) | 739 ui.warn(_("%s in manifest1, but listed as state %s") % (f, state)) |
741 errors += 1 | 740 errors += 1 |
742 if errors: | 741 if errors: |
743 error = _(".hg/dirstate inconsistent with current parent's manifest") | 742 error = _(".hg/dirstate inconsistent with current parent's manifest") |
785 finally: | 784 finally: |
786 wlock.release() | 785 wlock.release() |
787 | 786 |
788 def debugstate(ui, repo): | 787 def debugstate(ui, repo): |
789 """show the contents of the current dirstate""" | 788 """show the contents of the current dirstate""" |
790 dc = repo.dirstate | 789 dc = repo.dirstate._map |
791 for file_ in dc: | 790 k = dc.keys() |
791 k.sort() | |
792 for file_ in k: | |
792 if dc[file_][3] == -1: | 793 if dc[file_][3] == -1: |
793 # Pad or slice to locale representation | 794 # Pad or slice to locale representation |
794 locale_len = len(time.strftime("%x %X", time.localtime(0))) | 795 locale_len = len(time.strftime("%x %X", time.localtime(0))) |
795 timestr = 'unset' | 796 timestr = 'unset' |
796 timestr = timestr[:locale_len] + ' '*(locale_len - len(timestr)) | 797 timestr = timestr[:locale_len] + ' '*(locale_len - len(timestr)) |
1756 for src, abs, rel, exact in cmdutil.walk(repo, pats, opts, node=node, | 1757 for src, abs, rel, exact in cmdutil.walk(repo, pats, opts, node=node, |
1757 badmatch=util.always, | 1758 badmatch=util.always, |
1758 default='relglob'): | 1759 default='relglob'): |
1759 if src == 'b': | 1760 if src == 'b': |
1760 continue | 1761 continue |
1761 if not node and repo.dirstate.state(abs) == '?': | 1762 if not node and abs not in repo.dirstate: |
1762 continue | 1763 continue |
1763 if opts['fullpath']: | 1764 if opts['fullpath']: |
1764 ui.write(os.path.join(repo.root, abs), end) | 1765 ui.write(os.path.join(repo.root, abs), end) |
1765 else: | 1766 else: |
1766 ui.write(((pats and rel) or abs), end) | 1767 ui.write(((pats and rel) or abs), end) |
2214 elif abs in added: | 2215 elif abs in added: |
2215 if opts['force']: | 2216 if opts['force']: |
2216 forget.append(abs) | 2217 forget.append(abs) |
2217 continue | 2218 continue |
2218 reason = _('has been marked for add (use -f to force removal)') | 2219 reason = _('has been marked for add (use -f to force removal)') |
2219 elif repo.dirstate.state(abs) == '?': | 2220 elif abs not in repo.dirstate: |
2220 reason = _('is not managed') | 2221 reason = _('is not managed') |
2221 elif opts['after'] and not exact and abs not in deleted: | 2222 elif opts['after'] and not exact and abs not in deleted: |
2222 continue | 2223 continue |
2223 elif abs in removed: | 2224 elif abs in removed: |
2224 continue | 2225 continue |