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