138 if hasattr(pat, 'read') and 'r' in mode: |
138 if hasattr(pat, 'read') and 'r' in mode: |
139 return pat |
139 return pat |
140 return open(make_filename(repo, r, pat, node, total, seqno, revwidth), |
140 return open(make_filename(repo, r, pat, node, total, seqno, revwidth), |
141 mode) |
141 mode) |
142 |
142 |
143 def dodiff(fp, ui, repo, files=None, node1=None, node2=None, match=util.always, changes=None): |
143 def dodiff(fp, ui, repo, node1, node2, files=None, match=util.always, |
|
144 changes=None, text=False): |
144 def date(c): |
145 def date(c): |
145 return time.asctime(time.gmtime(float(c[2].split(' ')[0]))) |
146 return time.asctime(time.gmtime(float(c[2].split(' ')[0]))) |
146 |
147 |
147 if not changes: |
148 if not changes: |
148 (c, a, d, u) = repo.changes(node1, node2, files, match = match) |
149 (c, a, d, u) = repo.changes(node1, node2, files, match = match) |
180 for f in c: |
181 for f in c: |
181 to = None |
182 to = None |
182 if f in mmap: |
183 if f in mmap: |
183 to = repo.file(f).read(mmap[f]) |
184 to = repo.file(f).read(mmap[f]) |
184 tn = read(f) |
185 tn = read(f) |
185 fp.write(mdiff.unidiff(to, date1, tn, date2, f, r)) |
186 fp.write(mdiff.unidiff(to, date1, tn, date2, f, r, text=text)) |
186 for f in a: |
187 for f in a: |
187 to = None |
188 to = None |
188 tn = read(f) |
189 tn = read(f) |
189 fp.write(mdiff.unidiff(to, date1, tn, date2, f, r)) |
190 fp.write(mdiff.unidiff(to, date1, tn, date2, f, r, text=text)) |
190 for f in d: |
191 for f in d: |
191 to = repo.file(f).read(mmap[f]) |
192 to = repo.file(f).read(mmap[f]) |
192 tn = None |
193 tn = None |
193 fp.write(mdiff.unidiff(to, date1, tn, date2, f, r)) |
194 fp.write(mdiff.unidiff(to, date1, tn, date2, f, r, text=text)) |
194 |
195 |
195 def show_changeset(ui, repo, rev=0, changenode=None, filelog=None, brinfo=None): |
196 def show_changeset(ui, repo, rev=0, changenode=None, filelog=None, brinfo=None): |
196 """show a single changeset or file revision""" |
197 """show a single changeset or file revision""" |
197 changelog = repo.changelog |
198 changelog = repo.changelog |
198 if filelog: |
199 if filelog: |
430 node = repo.changelog.lookup(opts['rev']) |
431 node = repo.changelog.lookup(opts['rev']) |
431 else: |
432 else: |
432 node = repo.dirstate.parents()[0] |
433 node = repo.dirstate.parents()[0] |
433 change = repo.changelog.read(node) |
434 change = repo.changelog.read(node) |
434 mmap = repo.manifest.read(change[0]) |
435 mmap = repo.manifest.read(change[0]) |
|
436 |
435 for src, abs, rel, exact in walk(repo, pats, opts): |
437 for src, abs, rel, exact in walk(repo, pats, opts): |
436 if abs not in mmap: |
438 if abs not in mmap: |
437 ui.warn("warning: %s is not in the repository!\n" % rel) |
439 ui.warn("warning: %s is not in the repository!\n" % rel) |
438 continue |
440 continue |
439 |
441 |
440 lines = repo.file(abs).annotate(mmap[abs]) |
442 f = repo.file(abs) |
|
443 if not opts['text'] and util.binary(f.read(mmap[abs])): |
|
444 ui.write("%s: binary file\n" % rel) |
|
445 continue |
|
446 |
|
447 lines = f.annotate(mmap[abs]) |
441 pieces = [] |
448 pieces = [] |
442 |
449 |
443 for o, f in opmap: |
450 for o, f in opmap: |
444 if opts[o]: |
451 if opts[o]: |
445 l = [f(n) for n, dummy in lines] |
452 l = [f(n) for n, dummy in lines] |
648 for src, abs, rel, exact in items: |
655 for src, abs, rel, exact in items: |
649 print fmt % (src, abs, rel, exactly[exact]) |
656 print fmt % (src, abs, rel, exactly[exact]) |
650 |
657 |
651 def diff(ui, repo, *pats, **opts): |
658 def diff(ui, repo, *pats, **opts): |
652 """diff working directory (or selected files)""" |
659 """diff working directory (or selected files)""" |
653 revs = [] |
660 node1, node2 = None, None |
654 if opts['rev']: |
661 revs = [repo.lookup(x) for x in opts['rev']] |
655 revs = map(lambda x: repo.lookup(x), opts['rev']) |
662 |
656 |
663 if len(revs) > 0: |
|
664 node1 = revs[0] |
|
665 if len(revs) > 1: |
|
666 node2 = revs[1] |
657 if len(revs) > 2: |
667 if len(revs) > 2: |
658 raise util.Abort("too many revisions to diff") |
668 raise util.Abort("too many revisions to diff") |
659 |
669 |
660 files = [] |
670 files = [] |
661 match = util.always |
671 match = util.always |
662 if pats: |
672 if pats: |
663 roots, match, results = makewalk(repo, pats, opts) |
673 roots, match, results = makewalk(repo, pats, opts) |
664 for src, abs, rel, exact in results: |
674 for src, abs, rel, exact in results: |
665 files.append(abs) |
675 files.append(abs) |
666 dodiff(sys.stdout, ui, repo, files, *revs, **{'match': match}) |
676 |
|
677 dodiff(sys.stdout, ui, repo, node1, node2, files, match=match, |
|
678 text=opts['text']) |
667 |
679 |
668 def doexport(ui, repo, changeset, seqno, total, revwidth, opts): |
680 def doexport(ui, repo, changeset, seqno, total, revwidth, opts): |
669 node = repo.lookup(changeset) |
681 node = repo.lookup(changeset) |
670 prev, other = repo.changelog.parents(node) |
682 prev, other = repo.changelog.parents(node) |
671 change = repo.changelog.read(node) |
683 change = repo.changelog.read(node) |
683 if other != hg.nullid: |
695 if other != hg.nullid: |
684 fp.write("# Parent %s\n" % hg.hex(other)) |
696 fp.write("# Parent %s\n" % hg.hex(other)) |
685 fp.write(change[4].rstrip()) |
697 fp.write(change[4].rstrip()) |
686 fp.write("\n\n") |
698 fp.write("\n\n") |
687 |
699 |
688 dodiff(fp, ui, repo, None, prev, node) |
700 dodiff(fp, ui, repo, prev, node, text=opts['text']) |
689 if fp != sys.stdout: fp.close() |
701 if fp != sys.stdout: fp.close() |
690 |
702 |
691 def export(ui, repo, *changesets, **opts): |
703 def export(ui, repo, *changesets, **opts): |
692 """dump the header and diffs for one or more changesets""" |
704 """dump the header and diffs for one or more changesets""" |
693 if not changesets: |
705 if not changesets: |
866 if filelog: |
878 if filelog: |
867 filenode = filelog.node(i) |
879 filenode = filelog.node(i) |
868 i = filelog.linkrev(filenode) |
880 i = filelog.linkrev(filenode) |
869 changenode = repo.changelog.node(i) |
881 changenode = repo.changelog.node(i) |
870 prev, other = repo.changelog.parents(changenode) |
882 prev, other = repo.changelog.parents(changenode) |
871 dodiff(sys.stdout, ui, repo, files, prev, changenode) |
883 dodiff(sys.stdout, ui, repo, prev, changenode, files) |
872 ui.write("\n\n") |
884 ui.write("\n\n") |
873 |
885 |
874 def manifest(ui, repo, rev=None): |
886 def manifest(ui, repo, rev=None): |
875 """output the latest or given revision of the project manifest""" |
887 """output the latest or given revision of the project manifest""" |
876 if rev: |
888 if rev: |
1284 ('X', 'exclude', [], 'exclude path from search')], |
1296 ('X', 'exclude', [], 'exclude path from search')], |
1285 "hg addremove [OPTION]... [FILE]..."), |
1297 "hg addremove [OPTION]... [FILE]..."), |
1286 "^annotate": |
1298 "^annotate": |
1287 (annotate, |
1299 (annotate, |
1288 [('r', 'rev', '', 'revision'), |
1300 [('r', 'rev', '', 'revision'), |
|
1301 ('a', 'text', None, 'treat all files as text'), |
1289 ('u', 'user', None, 'show user'), |
1302 ('u', 'user', None, 'show user'), |
1290 ('n', 'number', None, 'show revision number'), |
1303 ('n', 'number', None, 'show revision number'), |
1291 ('c', 'changeset', None, 'show changeset'), |
1304 ('c', 'changeset', None, 'show changeset'), |
1292 ('I', 'include', [], 'include path in search'), |
1305 ('I', 'include', [], 'include path in search'), |
1293 ('X', 'exclude', [], 'exclude path from search')], |
1306 ('X', 'exclude', [], 'exclude path from search')], |
1325 ('X', 'exclude', [], 'exclude path from search')], |
1338 ('X', 'exclude', [], 'exclude path from search')], |
1326 'debugwalk [OPTION]... [FILE]...'), |
1339 'debugwalk [OPTION]... [FILE]...'), |
1327 "^diff": |
1340 "^diff": |
1328 (diff, |
1341 (diff, |
1329 [('r', 'rev', [], 'revision'), |
1342 [('r', 'rev', [], 'revision'), |
|
1343 ('a', 'text', None, 'treat all files as text'), |
1330 ('I', 'include', [], 'include path in search'), |
1344 ('I', 'include', [], 'include path in search'), |
1331 ('X', 'exclude', [], 'exclude path from search')], |
1345 ('X', 'exclude', [], 'exclude path from search')], |
1332 'hg diff [-I] [-X] [-r REV1 [-r REV2]] [FILE]...'), |
1346 'hg diff [-I] [-X] [-r REV1 [-r REV2]] [FILE]...'), |
1333 "^export": |
1347 "^export": |
1334 (export, |
1348 (export, |
1335 [('o', 'output', "", 'output to file')], |
1349 [('o', 'output', "", 'output to file'), |
|
1350 ('a', 'text', None, 'treat all files as text')], |
1336 "hg export [-o OUTFILE] REV..."), |
1351 "hg export [-o OUTFILE] REV..."), |
1337 "forget": |
1352 "forget": |
1338 (forget, |
1353 (forget, |
1339 [('I', 'include', [], 'include path in search'), |
1354 [('I', 'include', [], 'include path in search'), |
1340 ('X', 'exclude', [], 'exclude path from search')], |
1355 ('X', 'exclude', [], 'exclude path from search')], |