mercurial/dispatch.py
changeset 11989 f853873fc66d
parent 11985 81edef14922e
child 12040 529e712cb1ba
equal deleted inserted replaced
11988:8380ed691df8 11989:f853873fc66d
     4 #
     4 #
     5 # This software may be used and distributed according to the terms of the
     5 # This software may be used and distributed according to the terms of the
     6 # GNU General Public License version 2 or any later version.
     6 # GNU General Public License version 2 or any later version.
     7 
     7 
     8 from i18n import _
     8 from i18n import _
     9 import os, sys, atexit, signal, pdb, socket, errno, shlex, time, traceback
     9 import os, sys, atexit, signal, pdb, socket, errno, shlex, time, traceback, re
    10 import util, commands, hg, fancyopts, extensions, hook, error
    10 import util, commands, hg, fancyopts, extensions, hook, error
    11 import cmdutil, encoding
    11 import cmdutil, encoding
    12 import ui as uimod
    12 import ui as uimod
    13 
    13 
    14 def run():
    14 def run():
   212 
   212 
   213             return
   213             return
   214 
   214 
   215         if self.definition.startswith('!'):
   215         if self.definition.startswith('!'):
   216             def fn(ui, *args):
   216             def fn(ui, *args):
   217                 cmd = '%s %s' % (self.definition[1:], ' '.join(args))
   217                 env = {'HG_ARGS': ' '.join((self.name,) + args)}
   218                 return util.system(cmd)
   218                 def _checkvar(m):
       
   219                     if int(m.groups()[0]) <= len(args):
       
   220                         return m.group()
       
   221                     else:
       
   222                         return ''
       
   223                 cmd = re.sub(r'\$(\d+)', _checkvar, self.definition[1:])
       
   224                 replace = dict((str(i + 1), arg) for i, arg in enumerate(args))
       
   225                 replace['0'] = self.name
       
   226                 replace['@'] = ' '.join(args)
       
   227                 cmd = util.interpolate(r'\$', replace, cmd)
       
   228                 return util.system(cmd, environ=env)
   219             self.fn = fn
   229             self.fn = fn
   220             return
   230             return
   221 
   231 
   222         args = shlex.split(self.definition)
   232         args = shlex.split(self.definition)
   223         cmd = args.pop(0)
   233         cmd = args.pop(0)
   272 
   282 
   273     def __call__(self, ui, *args, **opts):
   283     def __call__(self, ui, *args, **opts):
   274         if self.shadows:
   284         if self.shadows:
   275             ui.debug("alias '%s' shadows command\n" % self.name)
   285             ui.debug("alias '%s' shadows command\n" % self.name)
   276 
   286 
   277         return util.checksignature(self.fn)(ui, *args, **opts)
   287         if self.definition.startswith('!'):
       
   288             return self.fn(ui, *args, **opts)
       
   289         else:
       
   290             return util.checksignature(self.fn)(ui, *args, **opts)
   278 
   291 
   279 def addaliases(ui, cmdtable):
   292 def addaliases(ui, cmdtable):
   280     # aliases are processed after extensions have been loaded, so they
   293     # aliases are processed after extensions have been loaded, so they
   281     # may use extension commands. Aliases can also use other alias definitions,
   294     # may use extension commands. Aliases can also use other alias definitions,
   282     # but only if they have been defined prior to the current definition.
   295     # but only if they have been defined prior to the current definition.