mercurial/commands.py
changeset 2567 2748253b49c2
parent 2553 5b426676f616
parent 2566 d8560b458f76
child 2570 83cfd95eafb5
child 2573 82e3b2966862
equal deleted inserted replaced
2559:bf67d0f6531c 2567:2748253b49c2
   246             if rev in seen:
   246             if rev in seen:
   247                 continue
   247                 continue
   248             seen[rev] = 1
   248             seen[rev] = 1
   249             yield str(rev)
   249             yield str(rev)
   250 
   250 
   251 def make_filename(repo, r, pat, node=None,
   251 def make_filename(repo, pat, node,
   252                   total=None, seqno=None, revwidth=None, pathname=None):
   252                   total=None, seqno=None, revwidth=None, pathname=None):
   253     node_expander = {
   253     node_expander = {
   254         'H': lambda: hex(node),
   254         'H': lambda: hex(node),
   255         'R': lambda: str(r.rev(node)),
   255         'R': lambda: str(repo.changelog.rev(node)),
   256         'h': lambda: short(node),
   256         'h': lambda: short(node),
   257         }
   257         }
   258     expander = {
   258     expander = {
   259         '%': lambda: '%',
   259         '%': lambda: '%',
   260         'b': lambda: os.path.basename(repo.root),
   260         'b': lambda: os.path.basename(repo.root),
   290         return ''.join(newname)
   290         return ''.join(newname)
   291     except KeyError, inst:
   291     except KeyError, inst:
   292         raise util.Abort(_("invalid format spec '%%%s' in output file name"),
   292         raise util.Abort(_("invalid format spec '%%%s' in output file name"),
   293                     inst.args[0])
   293                     inst.args[0])
   294 
   294 
   295 def make_file(repo, r, pat, node=None,
   295 def make_file(repo, pat, node=None,
   296               total=None, seqno=None, revwidth=None, mode='wb', pathname=None):
   296               total=None, seqno=None, revwidth=None, mode='wb', pathname=None):
   297     if not pat or pat == '-':
   297     if not pat or pat == '-':
   298         return 'w' in mode and sys.stdout or sys.stdin
   298         return 'w' in mode and sys.stdout or sys.stdin
   299     if hasattr(pat, 'write') and 'w' in mode:
   299     if hasattr(pat, 'write') and 'w' in mode:
   300         return pat
   300         return pat
   301     if hasattr(pat, 'read') and 'r' in mode:
   301     if hasattr(pat, 'read') and 'r' in mode:
   302         return pat
   302         return pat
   303     return open(make_filename(repo, r, pat, node, total, seqno, revwidth,
   303     return open(make_filename(repo, pat, node, total, seqno, revwidth,
   304                               pathname),
   304                               pathname),
   305                 mode)
   305                 mode)
   306 
   306 
   307 def write_bundle(cg, filename=None, compress=True):
   307 def write_bundle(cg, filename=None, compress=True):
   308     """Write a bundle file and return its filename.
   308     """Write a bundle file and return its filename.
   739     def getnode(rev):
   739     def getnode(rev):
   740         return short(repo.changelog.node(rev))
   740         return short(repo.changelog.node(rev))
   741 
   741 
   742     ucache = {}
   742     ucache = {}
   743     def getname(rev):
   743     def getname(rev):
   744         cl = repo.changelog.read(repo.changelog.node(rev))
   744         try:
   745         return trimuser(ui, cl[1], rev, ucache)
   745             return ucache[rev]
       
   746         except:
       
   747             u = trimuser(ui, repo.changectx(rev).user(), rev, ucache)
       
   748             ucache[rev] = u
       
   749             return u
   746 
   750 
   747     dcache = {}
   751     dcache = {}
   748     def getdate(rev):
   752     def getdate(rev):
   749         datestr = dcache.get(rev)
   753         datestr = dcache.get(rev)
   750         if datestr is None:
   754         if datestr is None:
   751             cl = repo.changelog.read(repo.changelog.node(rev))
   755             datestr = dcache[rev] = util.datestr(repo.changectx(rev).date())
   752             datestr = dcache[rev] = util.datestr(cl[2])
       
   753         return datestr
   756         return datestr
   754 
   757 
   755     if not pats:
   758     if not pats:
   756         raise util.Abort(_('at least one file name or pattern required'))
   759         raise util.Abort(_('at least one file name or pattern required'))
   757 
   760 
   758     opmap = [['user', getname], ['number', str], ['changeset', getnode],
   761     opmap = [['user', getname], ['number', str], ['changeset', getnode],
   759              ['date', getdate]]
   762              ['date', getdate]]
   760     if not opts['user'] and not opts['changeset'] and not opts['date']:
   763     if not opts['user'] and not opts['changeset'] and not opts['date']:
   761         opts['number'] = 1
   764         opts['number'] = 1
   762 
   765 
   763     if opts['rev']:
   766     ctx = repo.changectx(opts['rev'] or repo.dirstate.parents()[0])
   764         node = repo.changelog.lookup(opts['rev'])
       
   765     else:
       
   766         node = repo.dirstate.parents()[0]
       
   767     change = repo.changelog.read(node)
       
   768     mmap = repo.manifest.read(change[0])
       
   769 
   767 
   770     for src, abs, rel, exact in walk(repo, pats, opts, node=node):
   768     for src, abs, rel, exact in walk(repo, pats, opts, node=node):
   771         f = repo.file(abs)
   769         fctx = ctx.filectx(abs)
   772         if not opts['text'] and util.binary(f.read(mmap[abs])):
   770         if not opts['text'] and util.binary(fctx.data()):
   773             ui.write(_("%s: binary file\n") % ((pats and rel) or abs))
   771             ui.write(_("%s: binary file\n") % ((pats and rel) or abs))
   774             continue
   772             continue
   775 
   773 
   776         lines = f.annotate(mmap[abs])
   774         lines = fctx.annotate()
   777         pieces = []
   775         pieces = []
   778 
   776 
   779         for o, f in opmap:
   777         for o, f in opmap:
   780             if opts[o]:
   778             if opts[o]:
   781                 l = [f(n) for n, dummy in lines]
   779                 l = [f(n) for n, dummy in lines]
   817         node, p2 = repo.dirstate.parents()
   815         node, p2 = repo.dirstate.parents()
   818         if p2 != nullid:
   816         if p2 != nullid:
   819             raise util.Abort(_('uncommitted merge - please provide a '
   817             raise util.Abort(_('uncommitted merge - please provide a '
   820                                'specific revision'))
   818                                'specific revision'))
   821 
   819 
   822     dest = make_filename(repo, repo.changelog, dest, node)
   820     dest = make_filename(repo, dest, node)
   823     if os.path.realpath(dest) == repo.root:
   821     if os.path.realpath(dest) == repo.root:
   824         raise util.Abort(_('repository root cannot be destination'))
   822         raise util.Abort(_('repository root cannot be destination'))
   825     dummy, matchfn, dummy = matchpats(repo, [], opts)
   823     dummy, matchfn, dummy = matchpats(repo, [], opts)
   826     kind = opts.get('type') or 'files'
   824     kind = opts.get('type') or 'files'
   827     prefix = opts['prefix']
   825     prefix = opts['prefix']
   828     if dest == '-':
   826     if dest == '-':
   829         if kind == 'files':
   827         if kind == 'files':
   830             raise util.Abort(_('cannot archive plain files to stdout'))
   828             raise util.Abort(_('cannot archive plain files to stdout'))
   831         dest = sys.stdout
   829         dest = sys.stdout
   832         if not prefix: prefix = os.path.basename(repo.root) + '-%h'
   830         if not prefix: prefix = os.path.basename(repo.root) + '-%h'
   833     prefix = make_filename(repo, repo.changelog, prefix, node)
   831     prefix = make_filename(repo, prefix, node)
   834     archival.archive(repo, dest, node, kind, not opts['no_decode'],
   832     archival.archive(repo, dest, node, kind, not opts['no_decode'],
   835                      matchfn, prefix)
   833                      matchfn, prefix)
   836 
   834 
   837 def backout(ui, repo, rev, **opts):
   835 def backout(ui, repo, rev, **opts):
   838     '''reverse effect of earlier changeset
   836     '''reverse effect of earlier changeset
   918 
   916 
   919     %s   basename of file being printed
   917     %s   basename of file being printed
   920     %d   dirname of file being printed, or '.' if in repo root
   918     %d   dirname of file being printed, or '.' if in repo root
   921     %p   root-relative path name of file being printed
   919     %p   root-relative path name of file being printed
   922     """
   920     """
   923     mf = {}
   921     ctx = repo.changectx(opts['rev'] or -1)
   924     rev = opts['rev']
   922     for src, abs, rel, exact in walk(repo, (file1,) + pats, opts, ctx.node()):
   925     if rev:
   923         fp = make_file(repo, opts['output'], ctx.node(), pathname=abs)
   926         node = repo.lookup(rev)
   924         fp.write(ctx.filectx(abs).data())
   927     else:
       
   928         node = repo.changelog.tip()
       
   929     change = repo.changelog.read(node)
       
   930     mf = repo.manifest.read(change[0])
       
   931     for src, abs, rel, exact in walk(repo, (file1,) + pats, opts, node):
       
   932         r = repo.file(abs)
       
   933         n = mf[abs]
       
   934         fp = make_file(repo, r, opts['output'], node=n, pathname=abs)
       
   935         fp.write(r.read(n))
       
   936 
   925 
   937 def clone(ui, source, dest=None, **opts):
   926 def clone(ui, source, dest=None, **opts):
   938     """make a copy of an existing repository
   927     """make a copy of an existing repository
   939 
   928 
   940     Create a copy of an existing repository in a new directory.
   929     Create a copy of an existing repository in a new directory.
  1499     if opts['switch_parent']:
  1488     if opts['switch_parent']:
  1500         parents.reverse()
  1489         parents.reverse()
  1501     prev = (parents and parents[0]) or nullid
  1490     prev = (parents and parents[0]) or nullid
  1502     change = repo.changelog.read(node)
  1491     change = repo.changelog.read(node)
  1503 
  1492 
  1504     fp = make_file(repo, repo.changelog, opts['output'],
  1493     fp = make_file(repo, opts['output'], node, total=total, seqno=seqno,
  1505                    node=node, total=total, seqno=seqno,
       
  1506                    revwidth=revwidth)
  1494                    revwidth=revwidth)
  1507     if fp != sys.stdout:
  1495     if fp != sys.stdout:
  1508         ui.note("%s\n" % fp.name)
  1496         ui.note("%s\n" % fp.name)
  1509 
  1497 
  1510     fp.write("# HG changeset patch\n")
  1498     fp.write("# HG changeset patch\n")