38 if not pats and cwd: |
38 if not pats and cwd: |
39 opts['include'] = [os.path.join(cwd, i) for i in opts['include']] |
39 opts['include'] = [os.path.join(cwd, i) for i in opts['include']] |
40 opts['exclude'] = [os.path.join(cwd, x) for x in opts['exclude']] |
40 opts['exclude'] = [os.path.join(cwd, x) for x in opts['exclude']] |
41 cwd = '' |
41 cwd = '' |
42 return util.cmdmatcher(repo.root, cwd, pats or ['.'], opts.get('include'), |
42 return util.cmdmatcher(repo.root, cwd, pats or ['.'], opts.get('include'), |
43 opts.get('exclude'), head) + (cwd,) |
43 opts.get('exclude'), head) |
44 |
44 |
45 def makewalk(repo, pats, opts, node=None, head=''): |
45 def makewalk(repo, pats, opts, node=None, head=''): |
46 files, matchfn, anypats, cwd = matchpats(repo, pats, opts, head) |
46 files, matchfn, anypats = matchpats(repo, pats, opts, head) |
47 exact = dict(zip(files, files)) |
47 exact = dict(zip(files, files)) |
48 def walk(): |
48 def walk(): |
49 for src, fn in repo.walk(node=node, files=files, match=matchfn): |
49 for src, fn in repo.walk(node=node, files=files, match=matchfn): |
50 yield src, fn, util.pathto(cwd, fn), fn in exact |
50 yield src, fn, util.pathto(repo.getcwd(), fn), fn in exact |
51 return files, matchfn, walk() |
51 return files, matchfn, walk() |
52 |
52 |
53 def walk(repo, pats, opts, node=None, head=''): |
53 def walk(repo, pats, opts, node=None, head=''): |
54 files, matchfn, results = makewalk(repo, pats, opts, node, head) |
54 files, matchfn, results = makewalk(repo, pats, opts, node, head) |
55 for r in results: |
55 for r in results: |
80 possible display |
80 possible display |
81 |
81 |
82 "iter", rev, None: in-order traversal of the revs earlier iterated |
82 "iter", rev, None: in-order traversal of the revs earlier iterated |
83 over with "add" - use to display data''' |
83 over with "add" - use to display data''' |
84 |
84 |
85 files, matchfn, anypats, cwd = matchpats(repo, pats, opts) |
85 files, matchfn, anypats = matchpats(repo, pats, opts) |
86 |
86 |
87 if repo.changelog.count() == 0: |
87 if repo.changelog.count() == 0: |
88 return [], False, matchfn |
88 return [], False, matchfn |
89 |
89 |
90 revs = map(int, revrange(ui, repo, opts['rev'] or ['tip:0'])) |
90 revs = map(int, revrange(ui, repo, opts['rev'] or ['tip:0'])) |
513 add, remove = [], [] |
513 add, remove = [], [] |
514 for src, abs, rel, exact in walk(repo, pats, opts): |
514 for src, abs, rel, exact in walk(repo, pats, opts): |
515 if src == 'f' and repo.dirstate.state(abs) == '?': |
515 if src == 'f' and repo.dirstate.state(abs) == '?': |
516 add.append(abs) |
516 add.append(abs) |
517 if ui.verbose or not exact: |
517 if ui.verbose or not exact: |
518 ui.status(_('adding %s\n') % rel) |
518 ui.status(_('adding %s\n') % ((pats and rel) or abs)) |
519 if repo.dirstate.state(abs) != 'r' and not os.path.exists(rel): |
519 if repo.dirstate.state(abs) != 'r' and not os.path.exists(rel): |
520 remove.append(abs) |
520 remove.append(abs) |
521 if ui.verbose or not exact: |
521 if ui.verbose or not exact: |
522 ui.status(_('removing %s\n') % rel) |
522 ui.status(_('removing %s\n') % ((pats and rel) or abs)) |
523 repo.add(add) |
523 repo.add(add) |
524 repo.remove(remove) |
524 repo.remove(remove) |
525 |
525 |
526 def annotate(ui, repo, *pats, **opts): |
526 def annotate(ui, repo, *pats, **opts): |
527 """show changeset information per file line |
527 """show changeset information per file line |
566 change = repo.changelog.read(node) |
566 change = repo.changelog.read(node) |
567 mmap = repo.manifest.read(change[0]) |
567 mmap = repo.manifest.read(change[0]) |
568 |
568 |
569 for src, abs, rel, exact in walk(repo, pats, opts): |
569 for src, abs, rel, exact in walk(repo, pats, opts): |
570 if abs not in mmap: |
570 if abs not in mmap: |
571 ui.warn(_("warning: %s is not in the repository!\n") % rel) |
571 ui.warn(_("warning: %s is not in the repository!\n") % |
|
572 ((pats and rel) or abs)) |
572 continue |
573 continue |
573 |
574 |
574 f = repo.file(abs) |
575 f = repo.file(abs) |
575 if not opts['text'] and util.binary(f.read(mmap[abs])): |
576 if not opts['text'] and util.binary(f.read(mmap[abs])): |
576 ui.write(_("%s: binary file\n") % rel) |
577 ui.write(_("%s: binary file\n") % ((pats and rel) or abs)) |
577 continue |
578 continue |
578 |
579 |
579 lines = f.annotate(mmap[abs]) |
580 lines = f.annotate(mmap[abs]) |
580 pieces = [] |
581 pieces = [] |
581 |
582 |
781 raise util.Abort(_("can't read commit message '%s': %s") % |
782 raise util.Abort(_("can't read commit message '%s': %s") % |
782 (logfile, inst.strerror)) |
783 (logfile, inst.strerror)) |
783 |
784 |
784 if opts['addremove']: |
785 if opts['addremove']: |
785 addremove(ui, repo, *pats, **opts) |
786 addremove(ui, repo, *pats, **opts) |
786 fns, match, anypats, cwd = matchpats(repo, pats, opts) |
787 fns, match, anypats = matchpats(repo, pats, opts) |
787 if pats: |
788 if pats: |
788 modified, added, removed, deleted, unknown = ( |
789 modified, added, removed, deleted, unknown = ( |
789 repo.changes(files=fns, match=match)) |
790 repo.changes(files=fns, match=match)) |
790 files = modified + added + removed |
791 files = modified + added + removed |
791 else: |
792 else: |
1120 if len(revs) > 1: |
1121 if len(revs) > 1: |
1121 node2 = revs[1] |
1122 node2 = revs[1] |
1122 if len(revs) > 2: |
1123 if len(revs) > 2: |
1123 raise util.Abort(_("too many revisions to diff")) |
1124 raise util.Abort(_("too many revisions to diff")) |
1124 |
1125 |
1125 fns, matchfn, anypats, cwd = matchpats(repo, pats, opts) |
1126 fns, matchfn, anypats = matchpats(repo, pats, opts) |
1126 |
1127 |
1127 dodiff(sys.stdout, ui, repo, node1, node2, fns, match=matchfn, |
1128 dodiff(sys.stdout, ui, repo, node1, node2, fns, match=matchfn, |
1128 text=opts['text']) |
1129 text=opts['text']) |
1129 |
1130 |
1130 def doexport(ui, repo, changeset, seqno, total, revwidth, opts): |
1131 def doexport(ui, repo, changeset, seqno, total, revwidth, opts): |
1201 forget = [] |
1202 forget = [] |
1202 for src, abs, rel, exact in walk(repo, pats, opts): |
1203 for src, abs, rel, exact in walk(repo, pats, opts): |
1203 if repo.dirstate.state(abs) == 'a': |
1204 if repo.dirstate.state(abs) == 'a': |
1204 forget.append(abs) |
1205 forget.append(abs) |
1205 if ui.verbose or not exact: |
1206 if ui.verbose or not exact: |
1206 ui.status(_('forgetting %s\n') % rel) |
1207 ui.status(_('forgetting %s\n') % ((pats and rel) or abs)) |
1207 repo.forget(forget) |
1208 repo.forget(forget) |
1208 |
1209 |
1209 def grep(ui, repo, pattern, *pats, **opts): |
1210 def grep(ui, repo, pattern, *pats, **opts): |
1210 """search for a pattern in specified files and revisions |
1211 """search for a pattern in specified files and revisions |
1211 |
1212 |
1542 if not node and repo.dirstate.state(abs) == '?': |
1543 if not node and repo.dirstate.state(abs) == '?': |
1543 continue |
1544 continue |
1544 if opts['fullpath']: |
1545 if opts['fullpath']: |
1545 ui.write(os.path.join(repo.root, abs), end) |
1546 ui.write(os.path.join(repo.root, abs), end) |
1546 else: |
1547 else: |
1547 ui.write(rel, end) |
1548 ui.write(((pats and rel) or abs), end) |
1548 |
1549 |
1549 def log(ui, repo, *pats, **opts): |
1550 def log(ui, repo, *pats, **opts): |
1550 """show revision history of entire repository or files |
1551 """show revision history of entire repository or files |
1551 |
1552 |
1552 Print the revision history of the specified files or the entire project. |
1553 Print the revision history of the specified files or the entire project. |
1896 If no arguments are given, all files in the repository are reverted. |
1897 If no arguments are given, all files in the repository are reverted. |
1897 """ |
1898 """ |
1898 node = opts['rev'] and repo.lookup(opts['rev']) or \ |
1899 node = opts['rev'] and repo.lookup(opts['rev']) or \ |
1899 repo.dirstate.parents()[0] |
1900 repo.dirstate.parents()[0] |
1900 |
1901 |
1901 files, choose, anypats, cwd = matchpats(repo, pats, opts) |
1902 files, choose, anypats = matchpats(repo, pats, opts) |
1902 modified, added, removed, deleted, unknown = repo.changes(match=choose) |
1903 modified, added, removed, deleted, unknown = repo.changes(match=choose) |
1903 repo.forget(added) |
1904 repo.forget(added) |
1904 repo.undelete(removed + deleted) |
1905 repo.undelete(removed + deleted) |
1905 |
1906 |
1906 return repo.update(node, False, True, choose, False) |
1907 return repo.update(node, False, True, choose, False) |
2030 R = removed |
2031 R = removed |
2031 ! = deleted, but still tracked |
2032 ! = deleted, but still tracked |
2032 ? = not tracked |
2033 ? = not tracked |
2033 """ |
2034 """ |
2034 |
2035 |
2035 files, matchfn, anypats, cwd = matchpats(repo, pats, opts) |
2036 files, matchfn, anypats = matchpats(repo, pats, opts) |
|
2037 cwd = (pats and repo.getcwd()) or '' |
2036 modified, added, removed, deleted, unknown = [ |
2038 modified, added, removed, deleted, unknown = [ |
2037 [util.pathto(cwd, x) for x in n] |
2039 [util.pathto(cwd, x) for x in n] |
2038 for n in repo.changes(files=files, match=matchfn)] |
2040 for n in repo.changes(files=files, match=matchfn)] |
2039 |
2041 |
2040 changetypes = [(_('modified'), 'M', modified), |
2042 changetypes = [(_('modified'), 'M', modified), |