thirdparty/google_appengine/lib/django/extras/django_bash_completion
author Sverre Rabbelier <srabbelier@gmail.com>
Sat, 22 Nov 2008 13:59:34 +0000
changeset 553 c0cc20b4afc9
parent 109 620f9b141567
permissions -rw-r--r--
Make redirect generic using the new Lists object This makes it possible (and easier) to have the list view redirect to any page specially tailored to the current item. Patch by: Sverre Rabbelier

# #########################################################################
# 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