Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/commands.py @ 1254:e6560042b7b8
Switch cat command to use walk code.
The old syntax of "hg cat FILE REV" is now obsolete.
Use "hg cat -r REV FILE" instead, as for all other commands.
author | Bryan O'Sullivan <bos@serpentine.com> |
---|---|
date | Wed, 14 Sep 2005 21:57:41 -0700 |
parents | a45e717c61a8 |
children | e825dfea3823 |
comparison
equal
deleted
inserted
replaced
1253:a45e717c61a8 | 1254:e6560042b7b8 |
---|---|
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')], |