view tests/test-extension @ 10364:de1e7099d100

dispatch: provide help for disabled extensions and commands Before a command is declared unknown, each extension in hgext is searched, starting with hgext.<cmdname>. If there's a matching command, a help message suggests the appropriate extension and how to enable it. Every extension could potentially be imported, but for cases like rebase, relink, etc. only one extension is imported. For the case of "hg help disabledext", if the extension is in hgext, the extension description is read and a similar help suggestion is printed. No extension import occurs.
author Brodie Rao <me+hg@dackz.net>
date Sun, 07 Feb 2010 14:01:43 +0100
parents 4ce13d7c6b88
children 181cbb23572e
line wrap: on
line source

#!/bin/sh
# Test basic extension support

"$TESTDIR/hghave" no-outer-repo || exit 80

cat > foobar.py <<EOF
import os
from mercurial import commands

def uisetup(ui):
    ui.write("uisetup called\\n")

def reposetup(ui, repo):
    ui.write("reposetup called for %s\\n" % os.path.basename(repo.root))
    ui.write("ui %s= repo.ui\\n" % (ui == repo.ui and "=" or "!"))

def foo(ui, *args, **kwargs):
    ui.write("Foo\\n")

def bar(ui, *args, **kwargs):
    ui.write("Bar\\n")

cmdtable = {
    "foo": (foo, [], "hg foo"),
    "bar": (bar, [], "hg bar"),
}

commands.norepo += ' bar'
EOF
abspath=`pwd`/foobar.py

mkdir barfoo
cp foobar.py barfoo/__init__.py
barfoopath=`pwd`/barfoo

hg init a
cd a
echo foo > file
hg add file
hg commit -m 'add file'

echo '[extensions]' >> $HGRCPATH
echo "foobar = $abspath" >> $HGRCPATH
hg foo

cd ..
hg clone a b

hg bar
echo 'foobar = !' >> $HGRCPATH

echo '% module/__init__.py-style'
echo "barfoo = $barfoopath" >> $HGRCPATH
cd a
hg foo
echo 'barfoo = !' >> $HGRCPATH

# check that extensions are loaded in phases
cat > foo.py <<EOF
import os
name = os.path.basename(__file__).rsplit('.', 1)[0]
print "1) %s imported" % name
def uisetup(ui):
    print "2) %s uisetup" % name
def extsetup():
    print "3) %s extsetup" % name
def reposetup(ui, repo):
    print "4) %s reposetup" % name
EOF

cp foo.py bar.py
echo 'foo = foo.py' >> $HGRCPATH
echo 'bar = bar.py' >> $HGRCPATH

# command with no output, we just want to see the extensions loaded
hg paths

# check hgweb's load order
echo '% hgweb.cgi'
cat > hgweb.cgi <<EOF
#!/usr/bin/env python
from mercurial import demandimport; demandimport.enable()
from mercurial.hgweb import hgweb
from mercurial.hgweb import wsgicgi

application = hgweb('.', 'test repo')
wsgicgi.launch(application)
EOF
SCRIPT_NAME='/' SERVER_PORT='80' SERVER_NAME='localhost' python hgweb.cgi \
    | grep '^[0-9]) ' # ignores HTML output

echo 'foo = !' >> $HGRCPATH
echo 'bar = !' >> $HGRCPATH

cd ..
cat > empty.py <<EOF
'''empty cmdtable
'''
cmdtable = {}
EOF
emptypath=`pwd`/empty.py
echo "empty = $emptypath" >> $HGRCPATH
hg help empty
echo 'empty = !' >> $HGRCPATH

cat > debugextension.py <<EOF
'''only debugcommands
'''
def debugfoobar(ui, repo, *args, **opts):
    "yet another debug command"
    pass

def foo(ui, repo, *args, **opts):
    """yet another foo command

    This command has been DEPRECATED since forever.
    """
    pass

cmdtable = {
    "debugfoobar": (debugfoobar, (), "hg debugfoobar"),
    "foo": (foo, (), "hg foo")
}
EOF
debugpath=`pwd`/debugextension.py
echo "debugextension = $debugpath" >> $HGRCPATH
echo "% hg help"
hg help debugextension
echo "% hg help --verbose"
hg --verbose help debugextension
echo "% hg help --debug"
hg --debug help debugextension
echo 'debugextension = !' >> $HGRCPATH

echo % issue811
debugpath=`pwd`/debugissue811.py
cat > debugissue811.py <<EOF
'''show all loaded extensions
'''
from mercurial import extensions, commands

def debugextensions(ui):
    "yet another debug command"
    ui.write("%s\n" % '\n'.join([x for x, y in extensions.extensions()]))

cmdtable = {"debugextensions": (debugextensions, (), "hg debugextensions")}
commands.norepo += " debugextensions"
EOF
echo "debugissue811 = $debugpath" >> $HGRCPATH
echo "mq=" >> $HGRCPATH
echo "hgext.mq=" >> $HGRCPATH
echo "hgext/mq=" >> $HGRCPATH

echo % show extensions
hg debugextensions

echo '% disabled extension commands'
HGRCPATH=
hg help email
hg qdel
hg churn
echo '% disabled extensions'
hg help churn
hg help patchbomb
echo '% broken disabled extension and command'
mkdir hgext
echo > hgext/__init__.py
cat > hgext/broken.py <<EOF
"broken extension'
EOF
TMPPYTHONPATH="$PYTHONPATH"
PYTHONPATH="`pwd`:$PYTHONPATH"
export PYTHONPATH
hg help broken
hg help foo > /dev/null
PYTHONPATH="$TMPPYTHONPATH"
export PYTHONPATH

exit 0