hgext/alias.py
author Martin Geisler <mg@daimi.au.dk>
Thu, 15 Jan 2009 00:14:36 +0100
changeset 7651 5b5036ef847a
parent 7643 9a1ea6587557
child 8477 a0104303f400
permissions -rw-r--r--
i18n: encode output in user's local encoding This makes the translated output obey the HGENCODING environment variable or the preferred encoding as set by the LANG or LC_ALL environment variables. Python 2.4 has a lgettext method which is similar, except that it doesn't know about HGENCODING or the settings in .hgrc.

# Copyright (C) 2007 Brendan Cully <brendan@kublai.com>
# This file is published under the GNU GPL.

'''allow user-defined command aliases

To use, create entries in your hgrc of the form

[alias]
mycmd = cmd --args
'''

from mercurial.i18n import _
from mercurial import commands, cmdutil, error

cmdtable = {}

class RecursiveCommand(Exception): pass

class lazycommand(object):
    '''defer command lookup until needed, so that extensions loaded
    after alias can be aliased'''
    def __init__(self, ui, name, target):
        self._ui = ui
        self._name = name
        self._target = target
        self._cmd = None

    def __len__(self):
        self._resolve()
        return len(self._cmd)

    def __getitem__(self, key):
        self._resolve()
        return self._cmd[key]

    def __iter__(self):
        self._resolve()
        return self._cmd.__iter__()

    def _resolve(self):
        if self._cmd is not None:
            return

        try:
            self._cmd = cmdutil.findcmd(self._target, commands.table, False)[1]
            if self._cmd == self:
                raise RecursiveCommand()
            if self._target in commands.norepo.split(' '):
                commands.norepo += ' %s' % self._name
            return
        except error.UnknownCommand:
            msg = _('*** [alias] %s: command %s is unknown') % \
                  (self._name, self._target)
        except error.AmbiguousCommand:
            msg = _('*** [alias] %s: command %s is ambiguous') % \
                  (self._name, self._target)
        except RecursiveCommand:
            msg = _('*** [alias] %s: circular dependency on %s') % \
                  (self._name, self._target)
        def nocmd(*args, **opts):
            self._ui.warn(msg + '\n')
            return 1
        nocmd.__doc__ = msg
        self._cmd = (nocmd, [], '')
        commands.norepo += ' %s' % self._name

def uisetup(ui):
    for cmd, target in ui.configitems('alias'):
        if not target:
            ui.warn(_('*** [alias] %s: no definition\n') % cmd)
            continue
        args = target.split(' ')
        tcmd = args.pop(0)
        if args:
            ui.setconfig('defaults', cmd, ' '.join(args))
        cmdtable[cmd] = lazycommand(ui, cmd, tcmd)