about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2006-02-12 20:33:58 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2006-02-12 20:33:58 +0000
commit4ae3672ce8f9ad1ea091295b9e7ceb0279c2fc79 (patch)
tree14be4c2725841356a8bec797825e76224e44dc66
parentbb729797d3f941c947c83c365bf2e38048e9468d (diff)
downloadzsh-4ae3672ce8f9ad1ea091295b9e7ceb0279c2fc79.tar.gz
zsh-4ae3672ce8f9ad1ea091295b9e7ceb0279c2fc79.tar.xz
zsh-4ae3672ce8f9ad1ea091295b9e7ceb0279c2fc79.zip
22235: Eric Mangold: twisted completion
-rw-r--r--ChangeLog3
-rw-r--r--Completion/Unix/Command/_twisted86
2 files changed, 89 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index a62e2fa9c..39b06c999 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2006-02-12  Peter Stephenson  <p.w.stephenson@ntlworld.com>
 
+	* 22235: Eric Mangold: Completion/Unix/Command/_twisted: new
+	completion.
+
 	* 22237: Vincent Steman: Completion/Unix/Command/_man: location of
 	packaged manual pages on NetBSD.
 
diff --git a/Completion/Unix/Command/_twisted b/Completion/Unix/Command/_twisted
new file mode 100644
index 000000000..09f7edcbc
--- /dev/null
+++ b/Completion/Unix/Command/_twisted
@@ -0,0 +1,86 @@
+#compdef trial conch mktap cftp tapconvert twistd ckeygen lore pyhtmlizer websetroot tap2deb tkmktap tkconch manhole tap2rpm
+
+# Copyright (c) 2005 Eric Mangold
+# Maintainer: Eric Mangold <teratorn@twistedmatrix.com>
+
+# This file is meant to be in your zsh function path. i.e. in one of those
+# directories listed in your $fpath variable.
+#
+# e.g. /usr/local/share/zsh/site-functions/
+#
+# It is responsible for passing completion control to the correct
+# completion function for the version of Twisted that is
+# currently in use.
+#
+# Goals:
+#
+# We want to detect any changes to PYTHONPATH since the last time we ran.
+# That way we can re-locate the completion functions so that we are sure
+# to be completing for the right version of Twisted.
+
+local dir old_fpath python_code run shebang
+
+function debug () {
+    echo $@ >> /tmp/twisted_stub_debug
+}
+
+#debug "START _twisted_stub"
+
+function load_twisted_completions() {
+    [[ -z $commands[twistd] ]] && echo 'ERROR: test command "twistd" not found in path' && return 1
+    shebang=$(head -1 $commands[twistd])
+    [[ $shebang != \#\!* ]] && echo 'ERROR: invalid shebang line for test script "twistd"' && return 1
+    PYTHON=$shebang[3,-1] # strip #! off the shebang
+    PYTHON=${PYTHON# *} # remove any spaces between #! and command
+
+    #debug PYTHON $PYTHON:q
+    python_code='
+import twisted, os.path
+dir = os.path.dirname(twisted.__file__)
+print dir + os.sep + os.path.join("python", "zsh")
+'
+    dir=$($PYTHON -c "$python_code")
+    #debug "Trying to load twisted functions from $dir:q"
+    if [[ -r $dir/_twistd ]]; then
+        old_fpath=($fpath)
+        fpath=( $dir $fpath )
+        autoload +X _trial _conch _mktap _cftp _tapconvert _twistd _ckeygen
+        autoload +X _lore _pyhtmlizer _websetroot _tap2deb _tkmktap _tkconch
+        autoload +X _manhole _tap2rpm
+        fpath=($old_fpath)
+    else
+        echo 'ERROR: Cannot find twisted completion function files in $dir:q'
+        return 1
+    fi
+}
+
+function twisted_run () {
+    # run completion function for current command
+    # the :t modifier strips off any leading pathname components
+    eval _$words[1]:t
+}
+
+function twisted_save_load_run () {
+    # save PYTHONPATH, load twisted completions, and run the completion
+    # function for the current command
+    load_twisted_completions && twisted_run && PYTHONPATH_last=$PYTHONPATH
+}
+
+
+if [[ -n $PYTHONPATH_last ]]; then
+    #debug "PYTHONPATH_last is set to $PYTHONPATH_last"
+    #check if it's the same as the last time we ran
+    if [[ $PYTHONPATH == $PYTHONPATH_last ]]; then
+        #debug "PYTHONPATH == PYTHONPATH_last"
+        # it's the same, which means we've already loaded completion
+        # functions and nothing has changed.
+        twisted_run
+    else
+        twisted_save_load_run
+    fi
+else
+    twisted_save_load_run
+fi
+
+#debug "END _twisted_stub"
+#