mercurial/commands.py
changeset 1254 e6560042b7b8
parent 1253 a45e717c61a8
child 1255 e825dfea3823
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')],