192 if rev in seen: continue |
192 if rev in seen: continue |
193 seen[rev] = 1 |
193 seen[rev] = 1 |
194 yield str(rev) |
194 yield str(rev) |
195 |
195 |
196 def make_filename(repo, r, pat, node=None, |
196 def make_filename(repo, r, pat, node=None, |
197 total=None, seqno=None, revwidth=None): |
197 total=None, seqno=None, revwidth=None, pathname=None): |
198 node_expander = { |
198 node_expander = { |
199 'H': lambda: hex(node), |
199 'H': lambda: hex(node), |
200 'R': lambda: str(r.rev(node)), |
200 'R': lambda: str(r.rev(node)), |
201 'h': lambda: short(node), |
201 'h': lambda: short(node), |
202 } |
202 } |
214 expander['N'] = lambda: str(total) |
214 expander['N'] = lambda: str(total) |
215 if seqno is not None: |
215 if seqno is not None: |
216 expander['n'] = lambda: str(seqno) |
216 expander['n'] = lambda: str(seqno) |
217 if total is not None and seqno is not None: |
217 if total is not None and seqno is not None: |
218 expander['n'] = lambda:str(seqno).zfill(len(str(total))) |
218 expander['n'] = lambda:str(seqno).zfill(len(str(total))) |
|
219 if pathname is not None: |
|
220 expander['s'] = lambda: os.path.basename(pathname) |
|
221 expander['d'] = lambda: os.path.dirname(pathname) or '.' |
|
222 expander['p'] = lambda: pathname |
219 |
223 |
220 newname = [] |
224 newname = [] |
221 patlen = len(pat) |
225 patlen = len(pat) |
222 i = 0 |
226 i = 0 |
223 while i < patlen: |
227 while i < patlen: |
232 except KeyError, inst: |
236 except KeyError, inst: |
233 raise util.Abort("invalid format spec '%%%s' in output file name", |
237 raise util.Abort("invalid format spec '%%%s' in output file name", |
234 inst.args[0]) |
238 inst.args[0]) |
235 |
239 |
236 def make_file(repo, r, pat, node=None, |
240 def make_file(repo, r, pat, node=None, |
237 total=None, seqno=None, revwidth=None, mode='wb'): |
241 total=None, seqno=None, revwidth=None, mode='wb', pathname=None): |
238 if not pat or pat == '-': |
242 if not pat or pat == '-': |
239 return 'w' in mode and sys.stdout or sys.stdin |
243 return 'w' in mode and sys.stdout or sys.stdin |
240 if hasattr(pat, 'write') and 'w' in mode: |
244 if hasattr(pat, 'write') and 'w' in mode: |
241 return pat |
245 return pat |
242 if hasattr(pat, 'read') and 'r' in mode: |
246 if hasattr(pat, 'read') and 'r' in mode: |
243 return pat |
247 return pat |
244 return open(make_filename(repo, r, pat, node, total, seqno, revwidth), |
248 return open(make_filename(repo, r, pat, node, total, seqno, revwidth, |
|
249 pathname), |
245 mode) |
250 mode) |
246 |
251 |
247 def dodiff(fp, ui, repo, node1, node2, files=None, match=util.always, |
252 def dodiff(fp, ui, repo, node1, node2, files=None, match=util.always, |
248 changes=None, text=False): |
253 changes=None, text=False): |
249 def date(c): |
254 def date(c): |
567 f.write(z.compress(chunk)) |
572 f.write(z.compress(chunk)) |
568 f.write(z.flush()) |
573 f.write(z.flush()) |
569 except: |
574 except: |
570 os.unlink(fname) |
575 os.unlink(fname) |
571 |
576 |
572 def cat(ui, repo, file1, rev=None, **opts): |
577 def cat(ui, repo, file1, *pats, **opts): |
573 """output the latest or given revision of a file""" |
578 """output the latest or given revisions of files""" |
574 r = repo.file(relpath(repo, [file1])[0]) |
579 mf = {} |
575 if rev: |
580 if opts['rev']: |
576 try: |
581 change = repo.changelog.read(repo.lookup(opts['rev'])) |
577 # assume all revision numbers are for changesets |
582 mf = repo.manifest.read(change[0]) |
578 n = repo.lookup(rev) |
583 for src, abs, rel, exact in walk(repo, (file1,) + pats, opts): |
579 change = repo.changelog.read(n) |
584 r = repo.file(abs) |
580 m = repo.manifest.read(change[0]) |
585 if opts['rev']: |
581 n = m[relpath(repo, [file1])[0]] |
|
582 except (hg.RepoError, KeyError): |
|
583 try: |
586 try: |
584 n = r.lookup(rev) |
587 n = mf[abs] |
585 except KeyError, inst: |
588 except (hg.RepoError, KeyError): |
586 raise util.Abort('cannot find file %s in rev %s', file1, rev) |
589 try: |
587 else: |
590 n = r.lookup(rev) |
588 n = r.tip() |
591 except KeyError, inst: |
589 fp = make_file(repo, r, opts['output'], node=n) |
592 raise util.Abort('cannot find file %s in rev %s', rel, rev) |
590 fp.write(r.read(n)) |
593 else: |
|
594 n = r.tip() |
|
595 fp = make_file(repo, r, opts['output'], node=n, pathname=abs) |
|
596 fp.write(r.read(n)) |
591 |
597 |
592 def clone(ui, source, dest=None, **opts): |
598 def clone(ui, source, dest=None, **opts): |
593 """make a copy of an existing repository""" |
599 """make a copy of an existing repository""" |
594 if dest is None: |
600 if dest is None: |
595 dest = os.path.basename(os.path.normpath(source)) |
601 dest = os.path.basename(os.path.normpath(source)) |
1763 (bundle, |
1769 (bundle, |
1764 [], |
1770 [], |
1765 'hg bundle FILE DEST'), |
1771 'hg bundle FILE DEST'), |
1766 "cat": |
1772 "cat": |
1767 (cat, |
1773 (cat, |
1768 [('o', 'output', "", 'output to file')], |
1774 [('I', 'include', [], 'include path in search'), |
1769 'hg cat [-o OUTFILE] FILE [REV]'), |
1775 ('X', 'exclude', [], 'exclude path from search'), |
|
1776 ('o', 'output', "", 'output to file'), |
|
1777 ('r', 'rev', '', 'revision')], |
|
1778 'hg cat [OPTION]... FILE...'), |
1770 "^clone": |
1779 "^clone": |
1771 (clone, |
1780 (clone, |
1772 [('U', 'noupdate', None, 'skip update after cloning'), |
1781 [('U', 'noupdate', None, 'skip update after cloning'), |
1773 ('e', 'ssh', "", 'ssh command'), |
1782 ('e', 'ssh', "", 'ssh command'), |
1774 ('', 'remotecmd', "", 'remote hg command')], |
1783 ('', 'remotecmd', "", 'remote hg command')], |