From 61f528f2a0448a7946a9e6a6c6e831bc104d309f Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Thu, 28 Mar 2013 19:07:02 +0000 Subject: [PATCH] Better bash completion. - Remove 'Group' which is not required by modern RPM. - Add patch to use new-style demand-loaded bash-completion scripts. - Spin bash-completion scripts into a new libguestfs-bash-completion package. --- ...emand-loaded-bash-completion-scripts.patch | 965 ++++++++++++++++++ libguestfs.spec | 57 +- 2 files changed, 997 insertions(+), 25 deletions(-) create mode 100644 0001-Use-new-style-demand-loaded-bash-completion-scripts.patch diff --git a/0001-Use-new-style-demand-loaded-bash-completion-scripts.patch b/0001-Use-new-style-demand-loaded-bash-completion-scripts.patch new file mode 100644 index 0000000..762e0bb --- /dev/null +++ b/0001-Use-new-style-demand-loaded-bash-completion-scripts.patch @@ -0,0 +1,965 @@ +From 3c34db980868057916d6fe2489ad8906660e83d6 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Thu, 28 Mar 2013 17:13:34 +0000 +Subject: [PATCH] Use new-style demand-loaded bash-completion scripts. + +--- + .gitignore | 9 + + Makefile.am | 3 + + README | 2 + + bash/Makefile.am | 68 ++++++++ + bash/README | 3 + + bash/guestfish | 72 ++++++++ + bash/guestmount | 67 ++++++++ + bash/virt-alignment-scan | 108 ++++++++++++ + bash/virt-rescue | 67 ++++++++ + bash/virt-resize | 46 ++++++ + configure.ac | 16 ++ + fish/Makefile.am | 6 - + fish/libguestfs-bash-completion.sh | 326 ------------------------------------- + src/guestfs.pod | 4 + + 14 files changed, 465 insertions(+), 332 deletions(-) + create mode 100644 bash/Makefile.am + create mode 100644 bash/README + create mode 100644 bash/guestfish + create mode 100644 bash/guestmount + create mode 100644 bash/virt-alignment-scan + create mode 100644 bash/virt-rescue + create mode 100644 bash/virt-resize + delete mode 100644 fish/libguestfs-bash-completion.sh + +diff --git a/.gitignore b/.gitignore +index fc03cd8..c4f488e 100644 +--- a/.gitignore ++++ b/.gitignore +@@ -45,6 +45,15 @@ Makefile.in + /appliance/stamp-supermin + /appliance/supermin.d + /autom4te.cache ++/bash/virt-cat ++/bash/virt-df ++/bash/virt-edit ++/bash/virt-filesystems ++/bash/virt-format ++/bash/virt-inspector ++/bash/virt-ls ++/bash/virt-sysprep ++/bash/virt-sparsify + /build-aux + /cat/stamp-virt-*.pod + /cat/virt-cat +diff --git a/Makefile.am b/Makefile.am +index 050c8b6..fef3421 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -69,6 +69,9 @@ SUBDIRS += fish + # virt-tools in C. + SUBDIRS += align cat df edit format inspector rescue + ++# bash-completion ++SUBDIRS += bash ++ + # Language bindings. + if HAVE_PERL + SUBDIRS += perl perl/examples +diff --git a/README b/README +index 5284d58..59abc70 100644 +--- a/README ++++ b/README +@@ -207,6 +207,8 @@ The full requirements are described below. + | XML::XPath::XMLParser | O | Perl module used by some virt-* tools. | + +--------------+-------------+---+-----------------------------------------+ + | perl-libintl | | O | Perl module for localization. | +++--------------+-------------+---+-----------------------------------------+ ++| bash-completion | O | For tab-completion of commands in bash. | + +==============+=============+===+=========================================+ + R = Required + O = Optional +diff --git a/bash/Makefile.am b/bash/Makefile.am +new file mode 100644 +index 0000000..65f38cb +--- /dev/null ++++ b/bash/Makefile.am +@@ -0,0 +1,68 @@ ++# libguestfs ++# Copyright (C) 2013 Red Hat Inc. ++# ++# 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. ++ ++include $(top_srcdir)/subdir-rules.mk ++ ++scripts = \ ++ guestfish \ ++ guestmount \ ++ virt-alignment-scan \ ++ virt-cat \ ++ virt-df \ ++ virt-edit \ ++ virt-filesystems \ ++ virt-format \ ++ virt-inspector \ ++ virt-ls \ ++ virt-rescue \ ++ virt-resize \ ++ virt-sparsify \ ++ virt-sysprep ++ ++EXTRA_DIST = \ ++ README \ ++ $(scripts) ++ ++# Some of the scripts are simply symbolic links. ++virt-cat: ++ ln -sf virt-alignment-scan $@ ++virt-df: ++ ln -sf virt-alignment-scan $@ ++virt-edit: ++ ln -sf virt-alignment-scan $@ ++virt-filesystems: ++ ln -sf virt-alignment-scan $@ ++virt-format: ++ ln -sf virt-alignment-scan $@ ++virt-inspector: ++ ln -sf virt-alignment-scan $@ ++virt-ls: ++ ln -sf virt-alignment-scan $@ ++virt-sysprep: ++ ln -sf virt-alignment-scan $@ ++ ++virt-sparsify: ++ ln -sf virt-resize $@ ++ ++if HAVE_BASH_COMPLETION ++ ++# Bash completion script. ++ ++bashcompletiondir = $(BASH_COMPLETIONS_DIR) ++bashcompletion_DATA = $(scripts) ++ ++endif +diff --git a/bash/README b/bash/README +new file mode 100644 +index 0000000..db7d7bb +--- /dev/null ++++ b/bash/README +@@ -0,0 +1,3 @@ ++This directory contains the scripts for tab-completing commands in ++bash. Note these new-style demand-loaded scripts require ++'bash-completion' >= 1.99. +diff --git a/bash/guestfish b/bash/guestfish +new file mode 100644 +index 0000000..d342578 +--- /dev/null ++++ b/bash/guestfish +@@ -0,0 +1,72 @@ ++# guestfish bash completion script -*- shell-script -*- ++# Copyright (C) 2010-2013 Red Hat Inc. ++# ++# 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. ++ ++# List all local libvirt domains. ++_guestfs_virsh_list () ++{ ++ local flag_ro=$1 flags ++ ++ if [ "$flag_ro" -eq 1 ]; then ++ flags="--all" ++ else ++ flags="--inactive" ++ fi ++ virsh list $flags | head -n -1 | tail -n +3 | awk '{print $2}' ++} ++ ++_guestfish () ++{ ++ local cur prev words cword split ++ local longopts flag_ro=0 c=1 word cmds doms ++ ++ _init_completion -s || return ++ ++ longopts="$(guestfish --long-options)" ++ ++ # See if user has specified certain options anywhere on the ++ # command line before the current word. ++ while [ $c -lt $COMP_CWORD ]; do ++ word="${COMP_WORDS[c]}" ++ case "$word" in ++ -r|--ro) flag_ro=1 ;; ++ esac ++ c=$((++c)) ++ done ++ ++ case "$prev" in ++ -a|--add) ++ COMPREPLY=( $(compgen "$cur") ) ++ return ;; ++ -d|--domain) ++ doms=$(_guestfs_virsh_list "$flag_ro") ++ COMPREPLY=( $(compgen -W "$doms" -- "$cur") ) ++ return ;; ++ esac ++ ++ case "$cur" in ++ --*) ++ # --options ++ COMPREPLY=( $(compgen -W "$longopts" -- "$cur") ) ++ return ;; ++ *) ++ # Might be a guestfish command. ++ cmds=$(guestfish -h| head -n -1 | tail -n +2 | awk '{print $1}') ++ COMPREPLY=( $(compgen -W "$cmds" -- "$cur") ) ++ return ;; ++ esac ++} && ++complete -o default -F _guestfish guestfish +diff --git a/bash/guestmount b/bash/guestmount +new file mode 100644 +index 0000000..fa36c60 +--- /dev/null ++++ b/bash/guestmount +@@ -0,0 +1,67 @@ ++# guestmount bash completion script -*- shell-script -*- ++# Copyright (C) 2010-2013 Red Hat Inc. ++# ++# 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. ++ ++# List all local libvirt domains. ++_guestfs_virsh_list () ++{ ++ local flag_ro=$1 flags ++ ++ if [ "$flag_ro" -eq 1 ]; then ++ flags="--all" ++ else ++ flags="--inactive" ++ fi ++ virsh list $flags | head -n -1 | tail -n +3 | awk '{print $2}' ++} ++ ++_guestmount () ++{ ++ local cur prev words cword split ++ local longopts flag_ro=0 c=1 word doms ++ ++ _init_completion -s || return ++ ++ longopts="$(guestmount --long-options)" ++ ++ # See if user has specified certain options anywhere on the ++ # command line before the current word. ++ while [ $c -lt $COMP_CWORD ]; do ++ word="${COMP_WORDS[c]}" ++ case "$word" in ++ -r|--ro) flag_ro=1 ;; ++ esac ++ c=$((++c)) ++ done ++ ++ case "$prev" in ++ -d|--domain) ++ doms=$(_guestfs_virsh_list "$flag_ro") ++ COMPREPLY=( $(compgen -W "$doms" -- "$cur") ) ++ return ;; ++ esac ++ ++ case "$cur" in ++ --*) ++ # --options ++ COMPREPLY=( $(compgen -W "$longopts" -- "$cur") ) ++ return ;; ++ *) ++ COMPREPLY=( $(compgen "$cur") ) ++ return ;; ++ esac ++} && ++complete -o default -F _guestmount guestmount +diff --git a/bash/virt-alignment-scan b/bash/virt-alignment-scan +new file mode 100644 +index 0000000..e9e65bd +--- /dev/null ++++ b/bash/virt-alignment-scan +@@ -0,0 +1,108 @@ ++# virt-tools bash completion script -*- shell-script -*- ++# Copyright (C) 2010-2013 Red Hat Inc. ++# ++# 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. ++ ++# List all local libvirt domains. ++_guestfs_virsh_list () ++{ ++ local flag_ro=$1 flags ++ ++ if [ "$flag_ro" -eq 1 ]; then ++ flags="--all" ++ else ++ flags="--inactive" ++ fi ++ virsh list $flags | head -n -1 | tail -n +3 | awk '{print $2}' ++} ++ ++_guestfs_virttools () ++{ ++ local cur prev words cword split ++ local longopts="$1" flag_ro="$2" doms ++ ++ _init_completion -s || return ++ ++ case "$prev" in ++ -d|--domain) ++ doms=$(_guestfs_virsh_list "$flag_ro") ++ COMPREPLY=( $(compgen -W "$doms" -- "$cur") ) ++ return ;; ++ esac ++ ++ case "$cur" in ++ --*) ++ # --options ++ COMPREPLY=( $(compgen -W "$longopts" -- "$cur") ) ++ return ;; ++ *) ++ COMPREPLY=( $(compgen "$cur") ) ++ return ;; ++ esac ++} ++ ++_virt_alignment_scan () ++{ ++ _guestfs_virttools "$(virt-alignment-scan --long-options)" 1 ++} && ++complete -o default -F _virt_alignment_scan virt-alignment-scan ++ ++_virt_cat () ++{ ++ _guestfs_virttools "$(virt-cat --long-options)" 1 ++} && ++complete -o default -F _virt_cat virt-cat ++ ++_virt_df () ++{ ++ _guestfs_virttools "$(virt-df --long-options)" 1 ++} && ++complete -o default -F _virt_df virt-df ++ ++_virt_edit () ++{ ++ _guestfs_virttools "$(virt-edit --long-options)" 0 ++} && ++complete -o default -F _virt_edit virt-edit ++ ++_virt_filesystems () ++{ ++ _guestfs_virttools "$(virt-filesystems --long-options)" 1 ++} && ++complete -o default -F _virt_filesystems virt-filesystems ++ ++_virt_format () ++{ ++ _guestfs_virttools "$(virt-format --long-options)" 0 ++} && ++complete -o default -F _virt_format virt-format ++ ++_virt_inspector () ++{ ++ _guestfs_virttools "$(virt-inspector --long-options)" 1 ++} && ++complete -o default -F _virt_inspector virt-inspector ++ ++_virt_ls () ++{ ++ _guestfs_virttools "$(virt-ls --long-options)" 1 ++} && ++complete -o default -F _virt_ls virt-ls ++ ++_virt_sysprep () ++{ ++ _guestfs_virttools "$(virt-sysprep --long-options)" 0 ++} && ++complete -o default -F _virt_sysprep virt-sysprep +diff --git a/bash/virt-rescue b/bash/virt-rescue +new file mode 100644 +index 0000000..5e5cfd0 +--- /dev/null ++++ b/bash/virt-rescue +@@ -0,0 +1,67 @@ ++# virt-rescue bash completion script -*- shell-script -*- ++# Copyright (C) 2010-2013 Red Hat Inc. ++# ++# 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. ++ ++# List all local libvirt domains. ++_guestfs_virsh_list () ++{ ++ local flag_ro=$1 flags ++ ++ if [ "$flag_ro" -eq 1 ]; then ++ flags="--all" ++ else ++ flags="--inactive" ++ fi ++ virsh list $flags | head -n -1 | tail -n +3 | awk '{print $2}' ++} ++ ++_virt_rescue () ++{ ++ local cur prev words cword split ++ local longopts flag_ro=0 c=1 word doms ++ ++ _init_completion -s || return ++ ++ longopts="$(virt-rescue --long-options)" ++ ++ # See if user has specified certain options anywhere on the ++ # command line before the current word. ++ while [ $c -lt $COMP_CWORD ]; do ++ word="${COMP_WORDS[c]}" ++ case "$word" in ++ -r|--ro) flag_ro=1 ;; ++ esac ++ c=$((++c)) ++ done ++ ++ case "$prev" in ++ -d|--domain) ++ doms=$(_guestfs_virsh_list "$flag_ro") ++ COMPREPLY=( $(compgen -W "$doms" -- "$cur") ) ++ return ;; ++ esac ++ ++ case "$cur" in ++ --*) ++ # --options ++ COMPREPLY=( $(compgen -W "$longopts" -- "$cur") ) ++ return ;; ++ *) ++ COMPREPLY=( $(compgen "$cur") ) ++ return ;; ++ esac ++} && ++complete -o default -F _virt_rescue virt-rescue +diff --git a/bash/virt-resize b/bash/virt-resize +new file mode 100644 +index 0000000..d9770dc +--- /dev/null ++++ b/bash/virt-resize +@@ -0,0 +1,46 @@ ++# virt-resize, virt-sparsify bash completion script -*- shell-script -*- ++# Copyright (C) 2010-2013 Red Hat Inc. ++# ++# 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. ++ ++_guestfs_options_only () ++{ ++ local cur prev words cword split ++ local longopts="$1" ++ ++ _init_completion -s || return ++ ++ case "$cur" in ++ --*) ++ # --options ++ COMPREPLY=( $(compgen -W "$longopts" -- "$cur") ) ++ return ;; ++ *) ++ COMPREPLY=( $(compgen "$cur") ) ++ return ;; ++ esac ++} ++ ++_virt_resize () ++{ ++ _guestfs_options_only "$(virt-resize --long-options)" ++} && ++complete -o default -F _virt_resize virt-resize ++ ++_virt_sparsify () ++{ ++ _guestfs_options_only "$(virt-sparsify --long-options)" ++} && ++complete -o default -F _virt_sparsify virt-sparsify +diff --git a/configure.ac b/configure.ac +index 0c72621..61a9ebb 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -1483,6 +1483,19 @@ m4_ifdef([GTK_DOC_CHECK], [ + AM_CONDITIONAL([ENABLE_GTK_DOC], false) + ]) + ++dnl Bash completion. ++PKG_CHECK_MODULES([BASH_COMPLETION], [bash-completion >= 2.0], [ ++ bash_completion=yes ++ AC_MSG_CHECKING([for bash-completions directory]) ++ BASH_COMPLETIONS_DIR="`pkg-config --variable=completionsdir bash-completion`" ++ AC_MSG_RESULT([$BASH_COMPLETIONS_DIR]) ++ AC_SUBST([BASH_COMPLETIONS_DIR]) ++],[ ++ bash_completion=no ++ AC_MSG_WARN([bash-completion not installed]) ++]) ++AM_CONDITIONAL([HAVE_BASH_COMPLETION],[test "x$bash_completion" = "xyes"]) ++ + dnl Library versioning. + MAX_PROC_NR=`cat $srcdir/src/MAX_PROC_NR` + AC_SUBST(MAX_PROC_NR) +@@ -1508,6 +1521,7 @@ AC_CONFIG_FILES([run], + AC_CONFIG_FILES([Makefile + align/Makefile + appliance/Makefile ++ bash/Makefile + cat/Makefile + csharp/Makefile + daemon/Makefile +@@ -1626,6 +1640,8 @@ AS_ECHO_N(["gobject bindings .................... "]) + if test "x$HAVE_GOBJECT_TRUE" = "x"; then echo "yes"; else echo "no"; fi + AS_ECHO_N(["gobject introspection ............... "]) + if test "x$HAVE_INTROSPECTION_TRUE" = "x"; then echo "yes"; else echo "no"; fi ++AS_ECHO_N(["bash completion ..................... "]) ++if test "x$HAVE_BASH_COMPLETION_TRUE" = "x"; then echo "yes"; else echo "no"; fi + echo + echo "If any optional component is configured 'no' when you expected 'yes'" + echo "then you should check the preceding messages." +diff --git a/fish/Makefile.am b/fish/Makefile.am +index 5aa6528..d1b4701 100644 +--- a/fish/Makefile.am ++++ b/fish/Makefile.am +@@ -47,7 +47,6 @@ EXTRA_DIST = \ + $(BUILT_SOURCES) \ + rc_protocol.x \ + guestfish.pod \ +- libguestfs-bash-completion.sh \ + libguestfs-tools.conf \ + virt-copy-in \ + virt-copy-out \ +@@ -243,11 +242,6 @@ stamp-virt-tar-out.pod: virt-tar-out.pod + toolsconfdir = $(sysconfdir) + toolsconf_DATA = libguestfs-tools.conf + +-# Bash completion script. +- +-bashcompletiondir = $(sysconfdir)/bash_completion.d +-bashcompletion_DATA = libguestfs-bash-completion.sh +- + # Tests. + + TESTS_ENVIRONMENT = $(top_builddir)/run --test +diff --git a/fish/libguestfs-bash-completion.sh b/fish/libguestfs-bash-completion.sh +deleted file mode 100644 +index 452fdc2..0000000 +--- a/fish/libguestfs-bash-completion.sh ++++ /dev/null +@@ -1,326 +0,0 @@ +-# guestfish, guestmount and libguestfs tools bash completion script +-# Copyright (C) 2010-2013 Red Hat Inc. +-# +-# 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. +- +-# To use this script, copy it into /etc/bash_completion.d/ if +-# that directory exists. +-# +-# If your distro does not have that directory (or if you cannot or +-# do not want to install this in /etc) then you can copy this to +-# somewhere in your home directory such as +-# ~/.libguestfs-bash-completion.sh and add this to your .bashrc: +-# source ~/.libguestfs-bash-completion.sh +- +-# This was "inspired" by the git bash completion script written by +-# Shawn O. Pearce. +- +-_guestfs_complete () +-{ +- local fn="$1" cmd="$2" +- complete -o bashdefault -o default -F "$fn" "$cmd" 2>/dev/null \ +- || complete -o default -F "$fn" "$cmd" +-} +- +-# List all local libvirt domains. +-_guestfs_virsh_list () +-{ +- local flag_ro=$1 flags +- +- if [ "$flag_ro" -eq 1 ]; then +- flags="--all" +- else +- flags="--inactive" +- fi +- virsh list $flags | head -n -1 | tail -n +3 | awk '{print $2}' +-} +- +-# guestfish +-_guestfs_guestfish () +-{ +- local longopts flag_a=0 flag_d=0 flag_ro=0 c=1 word cmds doms +- +- longopts="$(guestfish --long-options)" +- +- # See if user has specified certain options anywhere on the +- # command line before the current word. +- while [ $c -lt $COMP_CWORD ]; do +- word="${COMP_WORDS[c]}" +- case "$word" in +- -r|--ro) flag_ro=1 ;; +- esac +- c=$((++c)) +- done +- +- # Check for flags preceeding the current position. +- c=$(($COMP_CWORD-1)) +- if [ "$c" -gt 0 ]; then +- word="${COMP_WORDS[$c]}" +- case "$word" in +- -a|--add) flag_a=1 ;; +- -d|--domain) flag_d=1 ;; +- esac +- fi +- +- # Now try to complete the current word. +- word="${COMP_WORDS[COMP_CWORD]}" +- case "$word" in +- --*) +- # --options +- COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W "$longopts" -- "$word")) ;; +- *) +- if [ "$flag_d" -eq 1 ]; then +- # -d +- doms=$(_guestfs_virsh_list "$flag_ro") +- COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W "$doms" -- "$word")) +- elif [ "$flag_a" -eq 1 ]; then +- # -a +- COMPREPLY=(${COMPREPLY[@]:-} $(compgen "$word")) +- else +- # A guestfish command. +- cmds=$(guestfish -h| head -n -1 | tail -n +2 | awk '{print $1}') +- COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W "$cmds" -- "$word")) +- fi ;; +- esac +-} +- +-_guestfs_complete _guestfs_guestfish guestfish +- +-# guestmount +-_guestfs_guestmount () +-{ +- local longopts flag_d=0 flag_ro=0 c=1 word doms +- +- longopts="$(guestmount --long-options)" +- +- # See if user has specified certain options anywhere on the +- # command line before the current word. +- while [ $c -lt $COMP_CWORD ]; do +- word="${COMP_WORDS[c]}" +- case "$word" in +- -r|--ro) flag_ro=1 ;; +- esac +- c=$((++c)) +- done +- +- # Check for flags preceeding the current position. +- c=$(($COMP_CWORD-1)) +- if [ "$c" -gt 0 ]; then +- word="${COMP_WORDS[$c]}" +- case "$word" in +- -d|--domain) flag_d=1 ;; +- esac +- fi +- +- # Now try to complete the current word. +- word="${COMP_WORDS[COMP_CWORD]}" +- case "$word" in +- --*) +- # --options +- COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W "$longopts" -- "$word")) ;; +- *) +- if [ "$flag_d" -eq 1 ]; then +- # -d +- doms=$(_guestfs_virsh_list "$flag_ro") +- COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W "$doms" -- "$word")) +- else +- COMPREPLY=(${COMPREPLY[@]:-} $(compgen "$word")) +- fi ;; +- esac +-} +- +-_guestfs_complete _guestfs_guestmount guestmount +- +-# virt-rescue (similar to guestmount) +-_guestfs_virt_rescue () +-{ +- local longopts flag_d=0 flag_ro=0 c=1 word doms +- +- longopts="$(virt-rescue --long-options)" +- +- # See if user has specified certain options anywhere on the +- # command line before the current word. +- while [ $c -lt $COMP_CWORD ]; do +- word="${COMP_WORDS[c]}" +- case "$word" in +- -r|--ro) flag_ro=1 ;; +- esac +- c=$((++c)) +- done +- +- # Check for flags preceeding the current position. +- c=$(($COMP_CWORD-1)) +- if [ "$c" -gt 0 ]; then +- word="${COMP_WORDS[$c]}" +- case "$word" in +- -d|--domain) flag_d=1 ;; +- esac +- fi +- +- # Now try to complete the current word. +- word="${COMP_WORDS[COMP_CWORD]}" +- case "$word" in +- --*) +- # --options +- COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W "$longopts" -- "$word")) ;; +- *) +- if [ "$flag_d" -eq 1 ]; then +- # -d +- doms=$(_guestfs_virsh_list "$flag_ro") +- COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W "$doms" -- "$word")) +- else +- COMPREPLY=(${COMPREPLY[@]:-} $(compgen "$word")) +- fi ;; +- esac +-} +- +-_guestfs_complete _guestfs_virt_rescue virt-rescue +- +-# Tools like virt-cat, virt-edit etc which have an implicit --ro or --rw. +-_guestfs_virttools () +-{ +- local longopts="$1" flag_ro="$2" flag_d=0 c word doms +- +- # Check for flags preceeding the current position. +- c=$(($COMP_CWORD-1)) +- if [ "$c" -gt 0 ]; then +- word="${COMP_WORDS[$c]}" +- case "$word" in +- -d|--domain) flag_d=1 ;; +- esac +- fi +- +- # Now try to complete the current word. +- word="${COMP_WORDS[COMP_CWORD]}" +- case "$word" in +- --*) +- # --options +- COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W "$longopts" -- "$word")) ;; +- *) +- if [ "$flag_d" -eq 1 ]; then +- # -d +- doms=$(_guestfs_virsh_list "$flag_ro") +- COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W "$doms" -- "$word")) +- else +- COMPREPLY=(${COMPREPLY[@]:-} $(compgen "$word")) +- fi ;; +- esac +-} +- +-_guestfs_virt_alignment_scan () +-{ +- _guestfs_virttools "$(virt-alignment-scan --long-options)" 1 +-} +- +-_guestfs_complete _guestfs_virt_alignment_scan virt-alignment-scan +- +-_guestfs_virt_cat () +-{ +- _guestfs_virttools "$(virt-cat --long-options)" 1 +-} +- +-_guestfs_complete _guestfs_virt_cat virt-cat +- +-_guestfs_virt_df () +-{ +- _guestfs_virttools "$(virt-df --long-options)" 1 +-} +- +-_guestfs_complete _guestfs_virt_df virt-df +- +-_guestfs_virt_edit () +-{ +- _guestfs_virttools "$(virt-edit --long-options)" 0 +-} +- +-_guestfs_complete _guestfs_virt_edit virt-edit +- +-_guestfs_virt_filesystems () +-{ +- _guestfs_virttools "$(virt-filesystems --long-options)" 1 +-} +- +-_guestfs_complete _guestfs_virt_filesystems virt-filesystems +- +-_guestfs_virt_format () +-{ +- _guestfs_virttools "$(virt-format --long-options)" 0 +-} +- +-_guestfs_complete _guestfs_virt_format virt-format +- +-_guestfs_virt_inspector () +-{ +- _guestfs_virttools "$(virt-inspector --long-options)" 1 +-} +- +-_guestfs_complete _guestfs_virt_inspector virt-inspector +- +-_guestfs_virt_ls () +-{ +- _guestfs_virttools "$(virt-ls --long-options)" 1 +-} +- +-_guestfs_complete _guestfs_virt_ls virt-ls +- +-_guestfs_virt_sysprep () +-{ +- _guestfs_virttools "$(virt-sysprep --long-options)" 0 +-} +- +-_guestfs_complete _guestfs_virt_sysprep virt-sysprep +- +-# Where we can only complete --options. +-_guestfs_options_only () +-{ +- local longopts="$1" word +- +- # Try to complete the current word. +- word="${COMP_WORDS[COMP_CWORD]}" +- case "$word" in +- --*) +- # --options +- COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W "$longopts" -- "$word")) ;; +- *) +- COMPREPLY=(${COMPREPLY[@]:-} $(compgen "$word")) +- esac +-} +- +-_guestfs_virt_resize () +-{ +- _guestfs_options_only "$(virt-resize --long-options)" +-} +- +-_guestfs_complete _guestfs_virt_resize virt-resize +- +-_guestfs_virt_sparsify () +-{ +- _guestfs_options_only "$(virt-sparsify --long-options)" +-} +- +-_guestfs_complete _guestfs_virt_sparsify virt-sparsify +- +-# Not done: +-# - virt-copy-in +-# - virt-copy-out +-# - virt-list-filesystems +-# - virt-list-partitions +-# - virt-make-fs +-# - virt-tar +-# - virt-tar-in +-# - virt-tar-out +-# - virt-win-reg +- +-# EOF +diff --git a/src/guestfs.pod b/src/guestfs.pod +index 53cabde..263fccd 100644 +--- a/src/guestfs.pod ++++ b/src/guestfs.pod +@@ -3894,6 +3894,10 @@ L command and documentation. + + The libguestfs appliance, build scripts and so on. + ++=item C ++ ++Bash tab-completion scripts. ++ + =item C + + Various build scripts used by autotools. +-- +1.8.1.4 + diff --git a/libguestfs.spec b/libguestfs.spec index fe15a0d..1930467 100644 --- a/libguestfs.spec +++ b/libguestfs.spec @@ -22,12 +22,16 @@ Summary: Access and modify virtual machine disk images Name: libguestfs Epoch: 1 Version: 1.21.23 -Release: 1%{?dist} +Release: 2%{?dist} License: LGPLv2+ -Group: Development/Libraries + +# Source and patches. URL: http://libguestfs.org/ Source0: http://libguestfs.org/download/1.21-development/%{name}-%{version}.tar.gz +Patch0001: 0001-Use-new-style-demand-loaded-bash-completion-scripts.patch +BuildRequires: autoconf, automake, libtool, gettext-devel + # Basic build requirements: BuildRequires: perl(Pod::Simple) BuildRequires: perl(Pod::Man) @@ -69,6 +73,7 @@ BuildRequires: libacl-devel BuildRequires: libcap-devel BuildRequires: libldm-devel BuildRequires: yajl-devel +BuildRequires: bash-completion # This is only needed for RHEL 5 because readline-devel doesn't # properly depend on it, but doesn't do any harm on other platforms: @@ -335,7 +340,6 @@ For Ruby bindings, install 'ruby-libguestfs'. %package devel Summary: Development tools and libraries for %{name} -Group: Development/Libraries Requires: %{name} = %{epoch}:%{version}-%{release} Requires: pkgconfig @@ -351,7 +355,6 @@ for %{name}. %package tools-c Summary: System administration tools for virtual machines -Group: Development/Tools License: GPLv2+ Requires: %{name} = %{epoch}:%{version}-%{release} @@ -383,7 +386,6 @@ to avoid dependencies on Perl. %package tools Summary: System administration tools for virtual machines -Group: Development/Tools License: GPLv2+ Requires: %{name} = %{epoch}:%{version}-%{release} Requires: %{name}-tools-c = %{epoch}:%{version}-%{release} @@ -463,9 +465,19 @@ Virt-win-reg lets you look at and modify the Windows Registry of Windows virtual machines. +%package bash-completion +Summary: Bash tab-completion scripts for %{name} tools +Requires: bash-completion >= 2.0 +Requires: %{name}-tools-c = %{epoch}:%{version}-%{release} + + +%description bash-completion +Install this package if you want intelligent bash tab-completion +for guestfish, guestmount and various virt-* tools. + + %package live-service Summary: %{name} live service -Group: Development/Libraries Requires(post): systemd-units Requires(preun): systemd-units Requires(postun): systemd-units @@ -490,7 +502,6 @@ This daemon is *not* required by %{name}. %package -n ocaml-%{name} Summary: OCaml bindings for %{name} -Group: Development/Libraries Requires: %{name} = %{epoch}:%{version}-%{release} @@ -503,7 +514,6 @@ programs which use %{name} you will also need ocaml-%{name}-devel. %package -n ocaml-%{name}-devel Summary: OCaml bindings for %{name} -Group: Development/Libraries Requires: ocaml-%{name} = %{epoch}:%{version}-%{release} @@ -514,7 +524,6 @@ required to use the OCaml bindings for %{name}. %package -n perl-Sys-Guestfs Summary: Perl bindings for %{name} (Sys::Guestfs) -Group: Development/Libraries Requires: %{name} = %{epoch}:%{version}-%{release} Requires: perl(:MODULE_COMPAT_%(eval "`%{__perl} -V:version`"; echo $version)) # RHBZ#523547 @@ -530,7 +539,6 @@ perl-Sys-Guestfs contains Perl bindings for %{name} (Sys::Guestfs). %package -n python-%{name} Summary: Python bindings for %{name} -Group: Development/Libraries Requires: %{name} = %{epoch}:%{version}-%{release} %{!?python_sitelib: %global python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")} @@ -542,7 +550,6 @@ python-%{name} contains Python bindings for %{name}. %package -n ruby-%{name} Summary: Ruby bindings for %{name} -Group: Development/Libraries Requires: %{name} = %{epoch}:%{version}-%{release} %if 0%{?fedora} >= 19 Requires: ruby(release) = 2.0.0 @@ -558,7 +565,6 @@ ruby-%{name} contains Ruby bindings for %{name}. %package java Summary: Java bindings for %{name} -Group: Development/Libraries Requires: %{name} = %{epoch}:%{version}-%{release} Requires: java >= 1.5.0 Requires: jpackage-utils @@ -572,7 +578,6 @@ you will also need %{name}-java-devel. %package java-devel Summary: Java development package for %{name} -Group: Development/Libraries Requires: %{name} = %{epoch}:%{version}-%{release} Requires: %{name}-java = %{epoch}:%{version}-%{release} @@ -585,7 +590,6 @@ See also %{name}-javadoc. %package javadoc Summary: Java documentation for %{name} -Group: Development/Libraries Requires: %{name} = %{epoch}:%{version}-%{release} Requires: %{name}-java = %{epoch}:%{version}-%{release} Requires: jpackage-utils @@ -596,7 +600,6 @@ Requires: jpackage-utils %package -n php-%{name} Summary: PHP bindings for %{name} -Group: Development/Libraries Requires: %{name} = %{epoch}:%{version}-%{release} Requires: php @@ -606,7 +609,6 @@ php-%{name} contains PHP bindings for %{name}. %package -n erlang-%{name} Summary: Erlang bindings for %{name} -Group: Development/Libraries Requires: %{name} = %{epoch}:%{version}-%{release} Requires: erlang-erts @@ -616,7 +618,6 @@ erlang-%{name} contains Erlang bindings for %{name}. %package -n lua-guestfs Summary: Lua bindings for %{name} -Group: Development/Libraries Requires: %{name} = %{epoch}:%{version}-%{release} Requires: lua @@ -626,7 +627,6 @@ lua-guestfs contains Lua bindings for %{name}. %package gobject Summary: GObject bindings for %{name} -Group: Development/Libraries Requires: %{name} = %{epoch}:%{version}-%{release} %description gobject @@ -638,7 +638,6 @@ To develop software against these bindings, you need to install %package gobject-devel Summary: GObject bindings for %{name} -Group: Development/Libraries Requires: %{name}-gobject = %{epoch}:%{version}-%{release} Requires: gtk-doc @@ -651,7 +650,6 @@ GObject bindings. It also contains GObject Introspection information. %package man-pages-ja Summary: Japanese (ja) man pages for %{name} -Group: Development/Libraries Requires: %{name} = %{epoch}:%{version}-%{release} %description man-pages-ja @@ -661,7 +659,6 @@ for %{name}. %package man-pages-uk Summary: Ukrainian (uk) man pages for %{name} -Group: Development/Libraries Requires: %{name} = %{epoch}:%{version}-%{release} %description man-pages-uk @@ -672,6 +669,9 @@ for %{name}. %prep %setup -q +%patch0001 -p1 +autoreconf -i + if [ "$(getenforce | tr '[A-Z]' '[a-z]')" != "disabled" ]; then # For sVirt to work, the local temporary directory we use in the # tests must be labelled the same way as /tmp. @@ -857,8 +857,6 @@ mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/run/libguestfs %files tools-c %doc README %config(noreplace) %{_sysconfdir}/libguestfs-tools.conf -%dir %{_sysconfdir}/bash_completion.d -%{_sysconfdir}/bash_completion.d/libguestfs-bash-completion.sh %{_bindir}/guestfish %{_mandir}/man1/guestfish.1* %{_bindir}/guestmount @@ -913,6 +911,13 @@ mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/run/libguestfs %{_mandir}/man1/virt-win-reg.1* +%files bash-completion +%dir %{_datadir}/bash-completion/completions +%{_datadir}/bash-completion/completions/guestfish +%{_datadir}/bash-completion/completions/guestmount +%{_datadir}/bash-completion/completions/virt-* + + %files live-service %doc COPYING README %{_sbindir}/guestfsd @@ -1030,9 +1035,11 @@ mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/run/libguestfs %changelog -* Thu Mar 28 2013 Richard W.M. Jones - 1:1.21.23-1 +* Thu Mar 28 2013 Richard W.M. Jones - 1:1.21.23-2 - New upstream version 1.21.23. -- Rename guestfish-bash-completion.sh -> libguestfs-bash-completion.sh +- Remove 'Group' which is not required by modern RPM. +- Add patch to use new-style demand-loaded bash-completion scripts. +- Spin bash-completion scripts into a new libguestfs-bash-completion package. * Mon Mar 18 2013 Richard W.M. Jones - 1:1.21.22-1 - New upstream version 1.21.22.