contrib/casesmash.py
author FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
Wed, 10 Sep 2014 00:41:44 +0900
branchstable
changeset 22377 f98abe3146b2
parent 19378 9de689d20230
child 28351 42a7301fb4d5
permissions -rw-r--r--
dispatch: check shell alias again after loading extensions (issue4355) Before this patch, the shell alias causes failure when it takes its specific (= unknown for "hg") options in the command line, because "_parse()" can't accept them. This is the regression introduced by 03d345da0579. It fixed the issue that ambiguity between shell aliases and commands defined by extensions was ignored. But it also caused that ambiguous shell alias is handled in "_parse()" even if it takes specific options in the command line. To avoid such failure, this patch checks shell alias again after loading extensions. All aliases and commands (including ones defined by extensions) are completely defined before the 2nd (= newly added in this patch) "_checkshellalias()" invocation, and "cmdutil.findcmd(strict=False)" can detect ambiguity between them correctly. For efficiency, this patch does: - omit the 2nd "_checkshellalias()" invocation if "[ui] strict= True" it causes "cmdutil.findcmd(strict=True)", of which result should be equal to one of the 1st invocation before adding aliases - avoid removing the 1st "_checkshellalias()" invocation it causes "cmdutil.findcmd(strict=True)" invocation preventing shell alias execution from loading extensions uselessly

import os, __builtin__
from mercurial import util

def lowerwrap(scope, funcname):
    f = getattr(scope, funcname)
    def wrap(fname, *args, **kwargs):
        d, base = os.path.split(fname)
        try:
            files = os.listdir(d or '.')
        except OSError:
            files = []
        if base in files:
            return f(fname, *args, **kwargs)
        for fn in files:
            if fn.lower() == base.lower():
                return f(os.path.join(d, fn), *args, **kwargs)
        return f(fname, *args, **kwargs)
    scope.__dict__[funcname] = wrap

def normcase(path):
    return path.lower()

os.path.normcase = normcase

for f in 'file open'.split():
    lowerwrap(__builtin__, f)

for f in "chmod chown open lstat stat remove unlink".split():
    lowerwrap(os, f)

for f in "exists lexists".split():
    lowerwrap(os.path, f)

lowerwrap(util, 'posixfile')