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'),