hgext/alias.py
changeset 4800 6aa1fae4c28a
child 4807 244a2609c199
equal deleted inserted replaced
4799:27d5c4d51686 4800:6aa1fae4c28a
       
     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.cmdutil import findcmd, UnknownCommand, AmbiguousCommand
       
    13 from mercurial import commands
       
    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._loading = True
       
    46             self._cmd = findcmd(self._ui, self._target)[1]
       
    47             if self._cmd == self:
       
    48                 raise RecursiveCommand()
       
    49             if self._target in commands.norepo.split(' '):
       
    50                 commands.norepo += ' %s' % self._name
       
    51             return
       
    52         except UnknownCommand:
       
    53             msg = '*** [alias] %s: command %s is unknown' % \
       
    54                   (self._name, self._target)
       
    55         except AmbiguousCommand:
       
    56             msg = '*** [alias] %s: command %s is ambiguous' % \
       
    57                   (self._name, self._target)
       
    58         except RecursiveCommand:
       
    59             msg = '*** [alias] %s: circular dependency on %s' % \
       
    60                   (self._name, self._target)
       
    61         def nocmd(*args, **opts):
       
    62             self._ui.warn(msg + '\n')
       
    63             return 1
       
    64         nocmd.__doc__ = msg
       
    65         self._cmd = (nocmd, [], '')
       
    66         commands.norepo += ' %s' % self._name
       
    67 
       
    68 def uisetup(ui):
       
    69     for cmd, target in ui.configitems('alias'):
       
    70         if not target:
       
    71             ui.warn('*** [alias] %s: no definition\n' % cmd)
       
    72             continue
       
    73         args = target.split(' ')
       
    74         tcmd = args.pop(0)
       
    75         if args:
       
    76             pui = ui.parentui or ui
       
    77             pui.setconfig('defaults', cmd, ' '.join(args))
       
    78         cmdtable[cmd] = lazycommand(ui, cmd, tcmd)