mercurial/commands.py
changeset 632 8b8f710bb658
parent 630 a58af3932cee
child 634 da5378d39269
equal deleted inserted replaced
631:a287f6cd9c6b 632:8b8f710bb658
    71             for rev in xrange(start, end, step):
    71             for rev in xrange(start, end, step):
    72                 yield str(rev)
    72                 yield str(rev)
    73         else:
    73         else:
    74             yield spec
    74             yield spec
    75 
    75 
       
    76 def make_filename(repo, r, pat, node=None,
       
    77                   total=None, seqno=None, revwidth=None):
       
    78     node_expander = {
       
    79         'H': lambda: hg.hex(node),
       
    80         'R': lambda: str(r.rev(node)),
       
    81         'h': lambda: hg.short(node),
       
    82         }
       
    83     expander = {
       
    84         '%': lambda: '%',
       
    85         'b': lambda: os.path.basename(repo.root),
       
    86         }
       
    87 
       
    88     if node: expander.update(node_expander)
       
    89     if node and revwidth is not None:
       
    90         expander['r'] = lambda: str(r.rev(node)).zfill(revwidth)
       
    91     if total is not None: expander['N'] = lambda: str(total)
       
    92     if seqno is not None: expander['n'] = lambda: str(seqno)
       
    93     if total is not None and seqno is not None:
       
    94         expander['n'] = lambda:str(seqno).zfill(len(str(total)))
       
    95 
       
    96     newname = []
       
    97     patlen = len(pat)
       
    98     i = 0
       
    99     while i < patlen:
       
   100         c = pat[i]
       
   101         if c == '%':
       
   102             i += 1
       
   103             c = pat[i]
       
   104             c = expander[c]()
       
   105         newname.append(c)
       
   106         i += 1
       
   107     return ''.join(newname)
       
   108 
    76 def dodiff(fp, ui, repo, files = None, node1 = None, node2 = None):
   109 def dodiff(fp, ui, repo, files = None, node1 = None, node2 = None):
    77     def date(c):
   110     def date(c):
    78         return time.asctime(time.gmtime(float(c[2].split(' ')[0])))
   111         return time.asctime(time.gmtime(float(c[2].split(' ')[0])))
    79 
   112 
    80     (c, a, d, u) = repo.changes(node1, node2, files)
   113     (c, a, d, u) = repo.changes(node1, node2, files)
   308                 pieces.append([ "%*s" % (m, x) for x in l])
   341                 pieces.append([ "%*s" % (m, x) for x in l])
   309 
   342 
   310         for p,l in zip(zip(*pieces), lines):
   343         for p,l in zip(zip(*pieces), lines):
   311             u.write(" ".join(p) + ": " + l[1])
   344             u.write(" ".join(p) + ": " + l[1])
   312 
   345 
   313 def cat(ui, repo, file, rev = []):
   346 def cat(ui, repo, file, rev = [], **opts):
   314     """output the latest or given revision of a file"""
   347     """output the latest or given revision of a file"""
   315     r = repo.file(relpath(repo, [file])[0])
   348     r = repo.file(relpath(repo, [file])[0])
   316     n = r.tip()
   349     n = r.tip()
   317     if rev: n = r.lookup(rev)
   350     if rev: n = r.lookup(rev)
   318     sys.stdout.write(r.read(n))
   351     if opts['output'] and opts['output'] != '-':
       
   352         try:
       
   353             outname = make_filename(repo, r, opts['output'], node=n)
       
   354             fp = open(outname, 'wb')
       
   355         except KeyError, inst:
       
   356             ui.warn("error: invlaid format spec '%%%s' in output file name\n" %
       
   357                     inst.args[0])
       
   358             sys.exit(1);
       
   359     else:
       
   360         fp = sys.stdout
       
   361     fp.write(r.read(n))
   319 
   362 
   320 def clone(ui, source, dest = None, **opts):
   363 def clone(ui, source, dest = None, **opts):
   321     """make a copy of an existing repository"""
   364     """make a copy of an existing repository"""
   322     source = ui.expandpath(source)
   365     source = ui.expandpath(source)
   323 
   366 
   475 def doexport(ui, repo, changeset, seqno, total, revwidth, opts):
   518 def doexport(ui, repo, changeset, seqno, total, revwidth, opts):
   476     node = repo.lookup(changeset)
   519     node = repo.lookup(changeset)
   477     prev, other = repo.changelog.parents(node)
   520     prev, other = repo.changelog.parents(node)
   478     change = repo.changelog.read(node)
   521     change = repo.changelog.read(node)
   479 
   522 
   480     def expand(name):
       
   481         expansions = {
       
   482             '%': lambda: '%',
       
   483             'H': lambda: hg.hex(node),
       
   484             'N': lambda: str(total),
       
   485             'R': lambda: str(repo.changelog.rev(node)),
       
   486             'b': lambda: os.path.basename(repo.root),
       
   487             'h': lambda: hg.short(node),
       
   488             'n': lambda: str(seqno).zfill(len(str(total))),
       
   489             'r': lambda: str(repo.changelog.rev(node)).zfill(revwidth),
       
   490             }
       
   491         newname = []
       
   492         namelen = len(name)
       
   493         i = 0
       
   494         while i < namelen:
       
   495             c = name[i]
       
   496             if c == '%':
       
   497                 i += 1
       
   498                 c = name[i]
       
   499                 c = expansions[c]()
       
   500             newname.append(c)
       
   501             i += 1
       
   502         return ''.join(newname)
       
   503 
       
   504     if opts['output'] and opts['output'] != '-':
   523     if opts['output'] and opts['output'] != '-':
   505         try:
   524         try:
   506             fp = open(expand(opts['output']), 'wb')
   525             outname = make_filename(repo, repo.changelog, opts['output'],
       
   526                                     node=node, total=total, seqno=seqno,
       
   527                                     revwidth=revwidth)
       
   528             fp = open(outname, 'wb')
   507         except KeyError, inst:
   529         except KeyError, inst:
   508             ui.warn("error: invalid format spec '%%%s' in output file name\n" %
   530             ui.warn("error: invalid format spec '%%%s' in output file name\n" %
   509                     inst.args[0])
   531                     inst.args[0])
   510             sys.exit(1)
   532             sys.exit(1)
   511     else:
   533     else:
  1045                      [('r', 'revision', '', 'revision'),
  1067                      [('r', 'revision', '', 'revision'),
  1046                       ('u', 'user', None, 'show user'),
  1068                       ('u', 'user', None, 'show user'),
  1047                       ('n', 'number', None, 'show revision number'),
  1069                       ('n', 'number', None, 'show revision number'),
  1048                       ('c', 'changeset', None, 'show changeset')],
  1070                       ('c', 'changeset', None, 'show changeset')],
  1049                      'hg annotate [-u] [-c] [-n] [-r id] [files]'),
  1071                      'hg annotate [-u] [-c] [-n] [-r id] [files]'),
  1050     "cat": (cat, [], 'hg cat <file> [rev]'),
  1072     "cat": (cat, [('o', 'output', "", 'output to file')], 'hg cat [-o outfile] file> [rev]'),
  1051     "^clone": (clone, [('U', 'noupdate', None, 'skip update after cloning')],
  1073     "^clone": (clone, [('U', 'noupdate', None, 'skip update after cloning')],
  1052               'hg clone [options] <source> [dest]'),
  1074               'hg clone [options] <source> [dest]'),
  1053     "^commit|ci": (commit,
  1075     "^commit|ci": (commit,
  1054                   [('t', 'text', "", 'commit text'),
  1076                   [('t', 'text', "", 'commit text'),
  1055                    ('A', 'addremove', None, 'run add/remove during commit'),
  1077                    ('A', 'addremove', None, 'run add/remove during commit'),