[PATCH] fwts: add bash command-line completion

Anthony Wong anthony.wong at canonical.com
Sat Nov 4 15:00:25 UTC 2017


So that we can use tab to complete options and arguments, making fwts
more enjoyable to use.

Signed-off-by: Anthony Wong <anthony.wong at canonical.com>
---
 Makefile.am                         |  2 +-
 configure.ac                        | 11 +++++
 debian/fwts.install                 |  1 +
 scripts/bash-completion/Makefile.am |  2 +
 scripts/bash-completion/fwts        | 86 +++++++++++++++++++++++++++++++++++++
 5 files changed, 101 insertions(+), 1 deletion(-)
 create mode 100644 scripts/bash-completion/Makefile.am
 create mode 100644 scripts/bash-completion/fwts

diff --git a/Makefile.am b/Makefile.am
index 278661c4..dcef6095 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -16,7 +16,7 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 #
 
-SUBDIRS = src data src/utilities
+SUBDIRS = src data src/utilities scripts/bash-completion
 
 ACLOCAL_AMFLAGS = -I m4
 
diff --git a/configure.ac b/configure.ac
index 2ef4f4f6..d7e0aee7 100644
--- a/configure.ac
+++ b/configure.ac
@@ -106,5 +106,16 @@
            src/lib/src/Makefile
 	   src/utilities/Makefile
            data/Makefile
+           scripts/bash-completion/Makefile
           ])
+	  AC_ARG_WITH([bashcompletiondir],
+		      AS_HELP_STRING([--with-bashcompletiondir=DIR], [Bash completions directory]),
+		      [],
+		      [AS_IF([`pkg-config --exists bash-completion`], [
+		       with_bashcompletiondir=`pkg-config --variable=completionsdir bash-completion`
+		       ], [
+			   with_bashcompletiondir=${datadir}/bash-completion/completions
+			   ])
+		      ])
+	  AC_SUBST([bashcompletiondir], [$with_bashcompletiondir])
           AC_OUTPUT
diff --git a/debian/fwts.install b/debian/fwts.install
index ec150f3a..cb342d57 100644
--- a/debian/fwts.install
+++ b/debian/fwts.install
@@ -5,3 +5,4 @@ usr/bin/fwts usr/bin
 usr/share/man/man1/fwts.1 usr/share/man/man1
 scripts/fwts-collect usr/bin
 usr/share/man/man1/fwts-collect.1 usr/share/man/man1
+usr/share/bash-completion/completions/fwts usr/share/bash-completion/completions
diff --git a/scripts/bash-completion/Makefile.am b/scripts/bash-completion/Makefile.am
new file mode 100644
index 00000000..a8b6ec8a
--- /dev/null
+++ b/scripts/bash-completion/Makefile.am
@@ -0,0 +1,2 @@
+bashcompletiondir = @bashcompletiondir@
+dist_bashcompletion_DATA = fwts
diff --git a/scripts/bash-completion/fwts b/scripts/bash-completion/fwts
new file mode 100644
index 00000000..6cd0b25a
--- /dev/null
+++ b/scripts/bash-completion/fwts
@@ -0,0 +1,86 @@
+#!/bin/bash
+#
+# FWTS tab completion for bash.
+#
+# Copyright (C) 2017 Canonical
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+_fwts()
+{
+    local cur prev
+
+    cur=${COMP_WORDS[COMP_CWORD]}
+    prev=${COMP_WORDS[COMP_CWORD-1]}
+
+	case $prev in
+		'--arch')
+			COMPREPLY=( $(compgen -W "x86 x86_32 x86_64 ia64 arm64 aarch64" -- $cur) )
+			compopt -o nosort
+			return 0
+			;;
+		'--dumpfile'|'-k'|'--klog'|'-J'|'--json-data-file'|'--lspci'|'-o'|'--olog'|'--s3-resume-hook'|'-r'|'--results-output')
+			_filedir
+			return 0
+			;;
+		'-j'|'--json-data-path'|'-t'|'--table-path')
+			local IFS=$'\n'
+            compopt -o filenames
+            COMPREPLY=( $(compgen -d -- ${cur}) )
+			return 0
+			;;
+		'--log-level')
+			COMPREPLY=( $(compgen -W "critical high medium low info all" -- $cur) )
+			compopt -o nosort
+			return 0
+			;;
+		'--log-type')
+			COMPREPLY=( $(compgen -W "plaintext json xml" -- $cur) )
+			return 0
+			;;
+		'--pm-method')
+			COMPREPLY=( $(compgen -W "logind pm-utils sysfs" -- $cur) )
+			return 0
+			;;
+		'--log-filter'|'--log-format'|'-w'|'--log-width'|'-R'|'-rsdp'|\
+		'--s3-delay-delta'|'--s3-device-check-delay'|'--s3-max-delay'|'--s3-min-delay'|'--s3-multiple'|\
+		'--s3-quirks'|'--s3-resume-time'|'--s3-sleep-delay'|'--s3-suspend-time'|'--s3power-sleep-delay'|\
+		'--s4-delay-delta'|'--s4-device-check-delay'|'--s4-max-delay'|'--s4-min-delay'|'--s4-multiple'|'--s4-quirks'|'--s4-sleep-delay'|\
+		'-s'|'--skip-test'|'--uefi-get-var-multiple'|'--uefi-query-var-multiple'|'--uefi-set-var-multiple')
+            # argument required but no completions available
+			return 0
+			;;
+		'-h'|'--help'|'-v'|'--version'|'-d'|'--dump'|'-s'|'--show-tests'|'--show-tests-full'|'--show-tests-categories'|'--log-fields')
+            # all other arguments are noop with these
+			return 0
+			;;
+    esac
+
+    local all_tests=`fwts --show-tests | sed '/.*:/d;/^$/d' | awk '{ print $1 }'`
+    local all_long_options=$( _parse_help "$1" --help )
+
+    if [ -z "$cur" ]; then
+        COMPREPLY=( $( compgen -W "${all_tests}" -- "$cur" ) )
+    else
+        COMPREPLY=( $( compgen -W "${all_tests} ${all_long_options}" -- "$cur" ) )
+
+    fi
+
+    return 0
+}
+
+
+# load the completion
+complete -F _fwts fwts
-- 
2.14.1




More information about the fwts-devel mailing list