bash-completion: add gst-validate script
authorStéphane Cerveau <scerveau@collabora.com>
Fri, 26 Feb 2021 14:32:29 +0000 (15:32 +0100)
committerStéphane Cerveau <scerveau@collabora.com>
Thu, 4 Mar 2021 07:19:04 +0000 (08:19 +0100)
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-devtools/-/merge_requests/237>

validate/data/bash-completion/completions/gst-validate-1.0 [new file with mode: 0644]

diff --git a/validate/data/bash-completion/completions/gst-validate-1.0 b/validate/data/bash-completion/completions/gst-validate-1.0
new file mode 100644 (file)
index 0000000..8342b84
--- /dev/null
@@ -0,0 +1,142 @@
+# GStreamer
+# Copyright (C) 2015 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com>
+# Copyright (C) 2021 Stéphane Cerveau <scerveau@collabora.com>
+#
+# bash/zsh completion support for gst-validate
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this library; if not, write to the
+# Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+# Boston, MA 02110-1301, USA.
+
+_GST_HELPERDIR="${BASH_SOURCE[0]%/*}/../helpers"
+
+if [[ ! -f $_GST_HELPERDIR/gst ]]; then
+       _GST_HELPERDIR="$(pkg-config --variable=bashhelpersdir gstreamer-1.0)"
+else
+       _GST_HELPERDIR=`cd "$_GST_HELPERDIR"; pwd`
+fi
+
+# Common definitions
+. "$_GST_HELPERDIR"/gst
+
+_gst_validate_all_arguments ()
+{
+       _gst_all_arguments gst-validate-1.0
+}
+
+_gst_complete_compatible_elements ()
+{
+       COMPREPLY=( $(compgen -W "$($_GST_HELPER --compatible-with $previous_element)" -- $cur) )
+}
+
+_gst_complete_all_elements ()
+{
+       COMPREPLY=( $(compgen -W "$($_GST_HELPER -l)" -- $cur) )
+}
+
+_gst_complete_element_properties ()
+{
+       COMPREPLY=( $(compgen -W "$($_GST_HELPER --element-properties $previous_element)" -- $cur) )
+}
+
+_gstvalidate___exclude_ () { _gst_mandatory_argument gst-validate-1.0; }
+
+_gst_validate_main ()
+{
+       local i=1 command function_exists previous_element have_previous_element=0 completion_func
+
+       while [[ $i -ne $COMP_CWORD ]];
+               do
+                       local var
+                       var="${COMP_WORDS[i]}"
+                       if [[ "$var" == "-"* ]]
+                       then
+                               command="$var"
+                       fi
+               i=$(($i+1))
+               done
+
+       i=1
+       while [[ $i -ne $COMP_CWORD ]];
+               do
+                       local var
+                       var="${COMP_WORDS[i]}"
+
+                       if [[ "$var" == "-"* ]]
+                       then
+                               i=$(($i+1))
+                               continue
+                       fi
+
+                       $(gst-inspect-1.0 --exists $var)
+                       if [ $? -eq 0 ]
+                       then
+                               previous_element="$var"
+                               have_previous_element=1
+                       fi
+               i=$(($i+1))
+               done
+
+       if [[ "$command" == "--gst"* ]]; then
+               completion_func="_${command//-/_}"
+       else
+               completion_func="_gstlaunch_${command//-/_}"
+       fi
+
+       # Seems like bash doesn't like "exclude" in function names
+       if [[ "$completion_func" == "_gstlaunch___exclude" ]]
+       then
+               completion_func="_gstvalidate___exclude_"
+       fi
+
+       declare -f $completion_func >/dev/null 2>&1
+
+       function_exists=$?
+
+       if [[ "$cur" == "-"* ]]; then
+               _gst_validate_all_arguments
+       elif [ $function_exists -eq 0 ]
+       then
+               $completion_func
+       elif [ $have_previous_element -ne 0 ] && [[ "$prev" == "!" ]]
+       then
+               _gst_complete_compatible_elements
+       elif [ $have_previous_element -ne 0 ]
+       then
+               _gst_complete_element_properties
+       else
+               _gst_complete_all_elements
+       fi
+}
+
+_gst_validate_func_wrap ()
+{
+       local cur prev
+       cur="${COMP_WORDS[COMP_CWORD]}"
+       prev="${COMP_WORDS[COMP_CWORD-1]}"
+       $1
+}
+
+# Setup completion for certain functions defined above by setting common
+# variables and workarounds.
+# This is NOT a public function; use at your own risk.
+_gst_validate_complete ()
+{
+       local wrapper="__launch_wrap${2}"
+       eval "$wrapper () { _gst_validate_func_wrap $2 ; }"
+       complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \
+               || complete -o default -o nospace -F $wrapper $1
+}
+
+_gst_validate_complete gst-validate-1.0 _gst_validate_main