mercurial/commands.py
changeset 212 48398a5353e3
parent 211 426d3c3ae363
child 213 d2172916ef6c
equal deleted inserted replaced
211:426d3c3ae363 212:48398a5353e3
     1 import os, re
     1 import os, re, traceback, sys
     2 from mercurial import fancyopts, ui, hg
     2 from mercurial import fancyopts, ui, hg
     3 
     3 
     4 class UnknownCommand(Exception): pass
     4 class UnknownCommand(Exception): pass
     5 
     5 
     6 def relpath(repo, args):
     6 def relpath(repo, args):
     7     if os.getcwd() != repo.root:
     7     if os.getcwd() != repo.root:
     8         p = os.getcwd()[len(repo.root) + 1: ]
     8         p = os.getcwd()[len(repo.root) + 1: ]
     9         return [ os.path.join(p, x) for x in args ]
     9         return [ os.path.join(p, x) for x in args ]
    10     return args
    10     return args
    11     
    11     
    12 def help(ui, args):
    12 def help(ui, cmd=None):
       
    13     '''show help'''
       
    14     if cmd:
       
    15         try:
       
    16             i = find(cmd)
       
    17             ui.write("%s\n\n" % i[2])
       
    18             ui.write(i[0].__doc__, "\n")
       
    19         except UnknownCommand:
       
    20             ui.warn("unknown command %s", cmd)
       
    21         sys.exit(0)
       
    22     
    13     ui.status("""\
    23     ui.status("""\
    14  hg commands:
    24  hg commands:
    15 
    25 
    16  add [files...]        add the given files in the next commit
    26  add [files...]        add the given files in the next commit
    17  addremove             add all new files, delete all missing files
    27  addremove             add all new files, delete all missing files
    33  status                show new, missing, and changed files in working dir
    43  status                show new, missing, and changed files in working dir
    34  tags                  show current changeset tags
    44  tags                  show current changeset tags
    35  undo                  undo the last transaction
    45  undo                  undo the last transaction
    36 """)
    46 """)
    37 
    47 
    38 def init(ui, args):
    48 def init(ui):
    39     """create a repository"""
    49     """create a repository"""
    40     hg.repository(ui, ".", create=1)
    50     hg.repository(ui, ".", create=1)
    41 
    51 
    42 def checkout(u, repo, args):
    52 def checkout(u, repo, changeset=None):
       
    53     '''checkout a given changeset or the current tip'''
    43     node = repo.changelog.tip()
    54     node = repo.changelog.tip()
    44     if args:
    55     if changeset:
    45         node = repo.lookup(args[0])
    56         node = repo.lookup(changeset)
    46     repo.checkout(node)
    57     repo.checkout(node)
    47 
    58 
    48 def annotate(u, repo, args, **ops):
    59 def annotate(u, repo, *args, **ops):
    49     if not args:
       
    50         return
       
    51         
       
    52     def getnode(rev):
    60     def getnode(rev):
    53         return hg.short(repo.changelog.node(rev))
    61         return hg.short(repo.changelog.node(rev))
    54 
    62 
    55     def getname(rev):
    63     def getname(rev):
    56         try:
    64         try:
    88                 pieces.append([ "%*s" % (m, x) for x in l])
    96                 pieces.append([ "%*s" % (m, x) for x in l])
    89 
    97 
    90         for p,l in zip(zip(*pieces), lines):
    98         for p,l in zip(zip(*pieces), lines):
    91             u.write(" ".join(p) + ": " + l[1])
    99             u.write(" ".join(p) + ": " + l[1])
    92 
   100 
    93 def undo(ui, repo, args):
   101 def undo(ui, repo):
    94     repo.undo()
   102     repo.undo()
    95 
   103 
    96 table = {
   104 table = {
    97     "init": (init, [], 'hg init'),
   105     "init": (init, [], 'hg init'),
    98     "help": (help, [], 'hg help'),
   106     "help": (help, [], 'hg help [command]'),
    99     "checkout|co": (checkout, [], 'hg checkout'),
   107     "checkout|co": (checkout, [], 'hg checkout [changeset]'),
   100     "ann|annotate": (annotate,
   108     "ann|annotate": (annotate,
   101                      [('r', 'revision', '', 'revision'),
   109                      [('r', 'revision', '', 'revision'),
   102                       ('u', 'user', None, 'show user'),
   110                       ('u', 'user', None, 'show user'),
   103                       ('n', 'number', None, 'show revision number'),
   111                       ('n', 'number', None, 'show revision number'),
   104                       ('c', 'changeset', None, 'show changeset')],
   112                       ('c', 'changeset', None, 'show changeset')],
   105                      'hg annotate [-u] [-c] [-n] [-r id] [files]'),
   113                      'hg annotate [-u] [-c] [-n] [-r id] [files]'),
   106     "undo": (undo, [], 'hg undo'),
   114     "undo": (undo, [], 'hg undo'),
   107     }
   115     }
   108 
   116 
   109 norepo = "init branch help"
   117 norepo = "init branch help"
       
   118 
       
   119 def find(cmd):
       
   120     i = None
       
   121     for e in table.keys():
       
   122         if re.match(e + "$", cmd):
       
   123             return table[e]
       
   124 
       
   125     raise UnknownCommand(cmd)
   110 
   126 
   111 def dispatch(args):
   127 def dispatch(args):
   112     options = {}
   128     options = {}
   113     opts = [('v', 'verbose', None, 'verbose'),
   129     opts = [('v', 'verbose', None, 'verbose'),
   114             ('d', 'debug', None, 'debug'),
   130             ('d', 'debug', None, 'debug'),
   125         cmd, args = args[0], args[1:]
   141         cmd, args = args[0], args[1:]
   126 
   142 
   127     u = ui.ui(options["verbose"], options["debug"], options["quiet"],
   143     u = ui.ui(options["verbose"], options["debug"], options["quiet"],
   128            not options["noninteractive"])
   144            not options["noninteractive"])
   129 
   145 
   130     i = None
   146     # deal with unfound commands later
   131     for e in table.keys():
   147     i = find(cmd)
   132         if re.match(e + "$", cmd):
       
   133             i = table[e]
       
   134 
       
   135     # deal with this internally later
       
   136     if not i: raise UnknownCommand(cmd)
       
   137 
   148 
   138     cmdoptions = {}
   149     cmdoptions = {}
   139     args = fancyopts.fancyopts(args, i[1], cmdoptions, i[2])
   150     args = fancyopts.fancyopts(args, i[1], cmdoptions, i[2])
   140 
   151 
   141     if cmd not in norepo.split():
   152     if cmd not in norepo.split():
   142         repo = hg.repository(ui = u)
   153         repo = hg.repository(ui = u)
   143         d = lambda: i[0](u, repo, args, **cmdoptions)
   154         d = lambda: i[0](u, repo, *args, **cmdoptions)
   144     else:
   155     else:
   145         d = lambda: i[0](u, args, **cmdoptions)
   156         d = lambda: i[0](u, *args, **cmdoptions)
   146 
   157 
   147     try:
   158     try:
   148         d()
   159         d()
   149     except KeyboardInterrupt:
   160     except KeyboardInterrupt:
   150         u.warn("interrupted!\n")
   161         u.warn("interrupted!\n")
       
   162     except TypeError, inst:
       
   163         # was this an argument error?
       
   164         tb = traceback.extract_tb(sys.exc_info()[2])
       
   165         if len(tb) > 2: # no
       
   166             raise
       
   167         u.warn("%s: invalid arguments\n" % i[0].__name__)
       
   168         u.warn("syntax: %s\n" % i[2])
       
   169         sys.exit(-1)