thirdparty/google_appengine/lib/django/extras/django_bash_completion
author Pawel Solyga <Pawel.Solyga@gmail.com>
Sun, 16 Nov 2008 12:48:23 +0000
changeset 484 6364f8b0656b
parent 109 620f9b141567
permissions -rw-r--r--
Add an e-mail dispatcher that can be used to send messages via the website. Add base and invitation templates that can be used with email dispatcher to send invitation emails. Please read the module doc string for more information how to use it. Patch by: Lennard de Rijk, Pawel Solyga

# #########################################################################
# This bash script adds tab-completion feature to django-admin.py and
# manage.py.
#
# Testing it out without installing
# =================================
#
# To test out the completion without "installing" this, just run this file
# directly, like so:
#
#     . ~/path/to/django_bash_completion
#
# Note: There's a dot ('.') at the beginning of that command.
#
# After you do that, tab completion will immediately be made available in your
# current Bash shell. But it won't be available next time you log in.
#
# Installing
# ==========
#
# To install this, point to this file from your .bash_profile, like so:
#
#     . ~/path/to/django_bash_completion
#
# Do the same in your .bashrc if .bashrc doesn't invoke .bash_profile.
#
# Settings will take effect the next time you log in.
#
# Uninstalling
# ============
#
# To uninstall, just remove the line from your .bash_profile and .bashrc.

# Enable extended pattern matching operators.
shopt -s extglob

_django_completion()
{
    local cur prev opts actions action_shell_opts action_runfcgi_opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"

    # Standalone options
    opts="--help --settings --pythonpath --version"
    # Actions
    actions="adminindex createcachetable dbshell diffsettings \
             inspectdb install reset runfcgi runserver \
             shell sql sqlall sqlclear sqlindexes sqlinitialdata \
             sqlreset sqlsequencereset startapp startproject \
             syncdb validate"
    # Action's options
    action_shell_opts="--plain"
    action_runfcgi_opts="host port socket method maxspare minspare maxchildren daemonize pidfile workdir"

    if [[ # django-admin.py, ./manage, manage.py
          ( ${COMP_CWORD} -eq 1 &&
            ( ${COMP_WORDS[0]} == django-admin.py ||
              ${COMP_WORDS[0]} == ./manage.py ||
              ${COMP_WORDS[0]} == manage.py ) )
          ||
          # python manage.py, /some/path/python manage.py (if manage.py exists)
          ( ${COMP_CWORD} -eq 2 &&
            ( $( basename ${COMP_WORDS[0]} ) == python?([1-9]\.[0-9]) ) &&
            ( $( basename ${COMP_WORDS[1]} ) == manage.py) &&
            ( -r ${COMP_WORDS[1]} ) ) 
          ||
          ( ${COMP_CWORD} -eq 2 &&
            ( $( basename ${COMP_WORDS[0]} ) == python?([1-9]\.[0-9]) ) &&
            ( $( basename ${COMP_WORDS[1]} ) == django-admin.py) &&
            ( -r ${COMP_WORDS[1]} ) ) ]] ; then

        case ${cur} in
            -*)
                COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
                action=$COMPREPLY
                return 0
                ;;
            *)
                COMPREPLY=( $(compgen -W "${actions}" -- ${cur}) )
                action=$COMPREPLY
                return 0
                ;;
        esac
    else
        case ${prev} in
            adminindex|install|reset| \
            sql|sqlall|sqlclear|sqlindexes| \
            sqlinitialdata|sqlreset|sqlsequencereset)
            # App completion
            settings=""
            # If settings.py in the PWD, use that
            if [ -e settings.py ] ; then
                settings="$PWD/settings.py"
            else
                # Use the ENV variable if it is set
                if [ $DJANGO_SETTINGS_MODULE ] ; then
                    settings=$DJANGO_SETTINGS_MODULE
                fi
            fi
            # Couldn't find settings so return nothing
            if [ -z $settings ] ; then
                COMPREPLY=()
            # Otherwise inspect settings.py file
            else
                apps=`sed -n "/INSTALLED_APPS = (/,/)/p" $settings | \
                      grep -v "django.contrib" | 
                      sed -n "s/^[ ]*'\(.*\.\)*\(.*\)'.*$/\2 /pg" | \
                      tr -d "\n"`
                COMPREPLY=( $(compgen -W "${apps}" -- ${cur}) )
            fi
            return 0
            ;;

            createcachetable|dbshell|diffsettings| \
            inspectdb|runserver|startapp|startproject|syncdb| \
            validate)
                COMPREPLY=()
                return 0
                ;;
            shell)
                COMPREPLY=( $(compgen -W "$action_shell_opts" -- ${cur}) )
                return 0
                ;;
            runfcgi)
                COMPREPLY=( $(compgen -W "$action_runfcgi_opts" -- ${cur}) )
                return 0
                ;;
            host*|port*|socket*|method*|maxspare*|minspare*|maxchildren*|daemonize*|pidfile*|workdir*)
                if [ "$action"  == "runfcgi" ] ; then
                    COMPREPLY=( $(compgen -W "$action_runfcgi_opts" -- ${cur}) )
                    return 0
                fi
                return 0
                ;;
            *)
                #COMPREPLY=( $(compgen -W "auth core" -- ${cur}) )
                COMPREPLY=()
                return 0
                ;;
        esac
    fi
}

complete -F _django_completion django-admin.py manage.py

# Support for multiple interpreters.
unset pythons
if command -v whereis &>/dev/null; then
    python_interpreters=$(whereis python | cut -d " " -f 2-) 
    for python in $python_interpreters; do
        pythons="${pythons} $(basename $python)"
    done
    pythons=$(echo $pythons | tr " " "\n" | sort -u | tr "\n" " ")
else
    pythons=python    
fi

complete -F _django_completion -o default $pythons