Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/commands.py @ 632:8b8f710bb658
Provides output option to cat command
# HG changeset patch
# User thananck@yahoo.com
# Node ID c838b9c2c71b1d64b8bde786f6470b30f23962de
# Parent 7369ec5d93f2ffd490a43970edd9adf8d2bbe269
Provides output option to cat command
expand function in commands.doexport is moved to toplevel and renamed
to make_filename. The 'cat' command now accecpts --output <pattern>
switch to specify the destination file.
Index: hg/mercurial/commands.py
===================================================================
author | thananck@yahoo.com |
---|---|
date | Tue, 05 Jul 2005 18:23:56 -0800 |
parents | a58af3932cee |
children | da5378d39269 |
comparison
equal
deleted
inserted
replaced
631:a287f6cd9c6b | 632:8b8f710bb658 |
---|---|
71 for rev in xrange(start, end, step): | 71 for rev in xrange(start, end, step): |
72 yield str(rev) | 72 yield str(rev) |
73 else: | 73 else: |
74 yield spec | 74 yield spec |
75 | 75 |
76 def make_filename(repo, r, pat, node=None, | |
77 total=None, seqno=None, revwidth=None): | |
78 node_expander = { | |
79 'H': lambda: hg.hex(node), | |
80 'R': lambda: str(r.rev(node)), | |
81 'h': lambda: hg.short(node), | |
82 } | |
83 expander = { | |
84 '%': lambda: '%', | |
85 'b': lambda: os.path.basename(repo.root), | |
86 } | |
87 | |
88 if node: expander.update(node_expander) | |
89 if node and revwidth is not None: | |
90 expander['r'] = lambda: str(r.rev(node)).zfill(revwidth) | |
91 if total is not None: expander['N'] = lambda: str(total) | |
92 if seqno is not None: expander['n'] = lambda: str(seqno) | |
93 if total is not None and seqno is not None: | |
94 expander['n'] = lambda:str(seqno).zfill(len(str(total))) | |
95 | |
96 newname = [] | |
97 patlen = len(pat) | |
98 i = 0 | |
99 while i < patlen: | |
100 c = pat[i] | |
101 if c == '%': | |
102 i += 1 | |
103 c = pat[i] | |
104 c = expander[c]() | |
105 newname.append(c) | |
106 i += 1 | |
107 return ''.join(newname) | |
108 | |
76 def dodiff(fp, ui, repo, files = None, node1 = None, node2 = None): | 109 def dodiff(fp, ui, repo, files = None, node1 = None, node2 = None): |
77 def date(c): | 110 def date(c): |
78 return time.asctime(time.gmtime(float(c[2].split(' ')[0]))) | 111 return time.asctime(time.gmtime(float(c[2].split(' ')[0]))) |
79 | 112 |
80 (c, a, d, u) = repo.changes(node1, node2, files) | 113 (c, a, d, u) = repo.changes(node1, node2, files) |
308 pieces.append([ "%*s" % (m, x) for x in l]) | 341 pieces.append([ "%*s" % (m, x) for x in l]) |
309 | 342 |
310 for p,l in zip(zip(*pieces), lines): | 343 for p,l in zip(zip(*pieces), lines): |
311 u.write(" ".join(p) + ": " + l[1]) | 344 u.write(" ".join(p) + ": " + l[1]) |
312 | 345 |
313 def cat(ui, repo, file, rev = []): | 346 def cat(ui, repo, file, rev = [], **opts): |
314 """output the latest or given revision of a file""" | 347 """output the latest or given revision of a file""" |
315 r = repo.file(relpath(repo, [file])[0]) | 348 r = repo.file(relpath(repo, [file])[0]) |
316 n = r.tip() | 349 n = r.tip() |
317 if rev: n = r.lookup(rev) | 350 if rev: n = r.lookup(rev) |
318 sys.stdout.write(r.read(n)) | 351 if opts['output'] and opts['output'] != '-': |
352 try: | |
353 outname = make_filename(repo, r, opts['output'], node=n) | |
354 fp = open(outname, 'wb') | |
355 except KeyError, inst: | |
356 ui.warn("error: invlaid format spec '%%%s' in output file name\n" % | |
357 inst.args[0]) | |
358 sys.exit(1); | |
359 else: | |
360 fp = sys.stdout | |
361 fp.write(r.read(n)) | |
319 | 362 |
320 def clone(ui, source, dest = None, **opts): | 363 def clone(ui, source, dest = None, **opts): |
321 """make a copy of an existing repository""" | 364 """make a copy of an existing repository""" |
322 source = ui.expandpath(source) | 365 source = ui.expandpath(source) |
323 | 366 |
475 def doexport(ui, repo, changeset, seqno, total, revwidth, opts): | 518 def doexport(ui, repo, changeset, seqno, total, revwidth, opts): |
476 node = repo.lookup(changeset) | 519 node = repo.lookup(changeset) |
477 prev, other = repo.changelog.parents(node) | 520 prev, other = repo.changelog.parents(node) |
478 change = repo.changelog.read(node) | 521 change = repo.changelog.read(node) |
479 | 522 |
480 def expand(name): | |
481 expansions = { | |
482 '%': lambda: '%', | |
483 'H': lambda: hg.hex(node), | |
484 'N': lambda: str(total), | |
485 'R': lambda: str(repo.changelog.rev(node)), | |
486 'b': lambda: os.path.basename(repo.root), | |
487 'h': lambda: hg.short(node), | |
488 'n': lambda: str(seqno).zfill(len(str(total))), | |
489 'r': lambda: str(repo.changelog.rev(node)).zfill(revwidth), | |
490 } | |
491 newname = [] | |
492 namelen = len(name) | |
493 i = 0 | |
494 while i < namelen: | |
495 c = name[i] | |
496 if c == '%': | |
497 i += 1 | |
498 c = name[i] | |
499 c = expansions[c]() | |
500 newname.append(c) | |
501 i += 1 | |
502 return ''.join(newname) | |
503 | |
504 if opts['output'] and opts['output'] != '-': | 523 if opts['output'] and opts['output'] != '-': |
505 try: | 524 try: |
506 fp = open(expand(opts['output']), 'wb') | 525 outname = make_filename(repo, repo.changelog, opts['output'], |
526 node=node, total=total, seqno=seqno, | |
527 revwidth=revwidth) | |
528 fp = open(outname, 'wb') | |
507 except KeyError, inst: | 529 except KeyError, inst: |
508 ui.warn("error: invalid format spec '%%%s' in output file name\n" % | 530 ui.warn("error: invalid format spec '%%%s' in output file name\n" % |
509 inst.args[0]) | 531 inst.args[0]) |
510 sys.exit(1) | 532 sys.exit(1) |
511 else: | 533 else: |
1045 [('r', 'revision', '', 'revision'), | 1067 [('r', 'revision', '', 'revision'), |
1046 ('u', 'user', None, 'show user'), | 1068 ('u', 'user', None, 'show user'), |
1047 ('n', 'number', None, 'show revision number'), | 1069 ('n', 'number', None, 'show revision number'), |
1048 ('c', 'changeset', None, 'show changeset')], | 1070 ('c', 'changeset', None, 'show changeset')], |
1049 'hg annotate [-u] [-c] [-n] [-r id] [files]'), | 1071 'hg annotate [-u] [-c] [-n] [-r id] [files]'), |
1050 "cat": (cat, [], 'hg cat <file> [rev]'), | 1072 "cat": (cat, [('o', 'output', "", 'output to file')], 'hg cat [-o outfile] file> [rev]'), |
1051 "^clone": (clone, [('U', 'noupdate', None, 'skip update after cloning')], | 1073 "^clone": (clone, [('U', 'noupdate', None, 'skip update after cloning')], |
1052 'hg clone [options] <source> [dest]'), | 1074 'hg clone [options] <source> [dest]'), |
1053 "^commit|ci": (commit, | 1075 "^commit|ci": (commit, |
1054 [('t', 'text', "", 'commit text'), | 1076 [('t', 'text', "", 'commit text'), |
1055 ('A', 'addremove', None, 'run add/remove during commit'), | 1077 ('A', 'addremove', None, 'run add/remove during commit'), |