hgext/alias.py
changeset 8655 21688b8a594b
parent 8654 f6cc3638f468
child 8656 284fda4cd093
equal deleted inserted replaced
8654:f6cc3638f468 8655:21688b8a594b
     1 # Copyright (C) 2007 Brendan Cully <brendan@kublai.com>
       
     2 # This file is published under the GNU GPL.
       
     3 
       
     4 '''allow user-defined command aliases
       
     5 
       
     6 To use, create entries in your hgrc of the form
       
     7 
       
     8 [alias]
       
     9 mycmd = cmd --args
       
    10 '''
       
    11 
       
    12 from mercurial.i18n import _
       
    13 from mercurial import commands, cmdutil, error
       
    14 
       
    15 cmdtable = {}
       
    16 
       
    17 class RecursiveCommand(Exception): pass
       
    18 
       
    19 class lazycommand(object):
       
    20     '''defer command lookup until needed, so that extensions loaded
       
    21     after alias can be aliased'''
       
    22     def __init__(self, ui, name, target):
       
    23         self._ui = ui
       
    24         self._name = name
       
    25         self._target = target
       
    26         self._cmd = None
       
    27 
       
    28     def __len__(self):
       
    29         self._resolve()
       
    30         return len(self._cmd)
       
    31 
       
    32     def __getitem__(self, key):
       
    33         self._resolve()
       
    34         return self._cmd[key]
       
    35 
       
    36     def __iter__(self):
       
    37         self._resolve()
       
    38         return self._cmd.__iter__()
       
    39 
       
    40     def _resolve(self):
       
    41         if self._cmd is not None:
       
    42             return
       
    43 
       
    44         try:
       
    45             self._cmd = cmdutil.findcmd(self._target, commands.table, False)[1]
       
    46             if self._cmd == self:
       
    47                 raise RecursiveCommand()
       
    48             if self._target in commands.norepo.split(' '):
       
    49                 commands.norepo += ' %s' % self._name
       
    50             return
       
    51         except error.UnknownCommand:
       
    52             msg = _('*** [alias] %s: command %s is unknown') % \
       
    53                   (self._name, self._target)
       
    54         except error.AmbiguousCommand:
       
    55             msg = _('*** [alias] %s: command %s is ambiguous') % \
       
    56                   (self._name, self._target)
       
    57         except RecursiveCommand:
       
    58             msg = _('*** [alias] %s: circular dependency on %s') % \
       
    59                   (self._name, self._target)
       
    60         def nocmd(*args, **opts):
       
    61             self._ui.warn(msg + '\n')
       
    62             return 1
       
    63         nocmd.__doc__ = msg
       
    64         self._cmd = (nocmd, [], '')
       
    65         commands.norepo += ' %s' % self._name
       
    66 
       
    67 def uisetup(ui):
       
    68     for cmd, target in ui.configitems('alias'):
       
    69         if not target:
       
    70             ui.warn(_('*** [alias] %s: no definition\n') % cmd)
       
    71             continue
       
    72         args = target.split(' ', 1)
       
    73         tcmd = args.pop(0)
       
    74         if args:
       
    75             args = args[0]
       
    76             defaults = ui.config('defaults', cmd)
       
    77             if defaults:
       
    78                 args = ' '.join((args, defaults))
       
    79             ui.setconfig('defaults', cmd, args)
       
    80         cmdtable[cmd] = lazycommand(ui, cmd, tcmd)