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