summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard W.M. Jones <rjones@redhat.com>2013-03-28 19:07:02 (GMT)
committerRichard W.M. Jones <rjones@redhat.com>2013-03-28 19:08:23 (GMT)
commit61f528f2a0448a7946a9e6a6c6e831bc104d309f (patch)
tree59d1dcb730027978519e0b150caeddc877270ae1
parent9670e20a7d0d29884836b8a49704e0f5c78f8eb3 (diff)
downloadlibguestfs-61f528f2a0448a7946a9e6a6c6e831bc104d309f.zip
libguestfs-61f528f2a0448a7946a9e6a6c6e831bc104d309f.tar.gz
libguestfs-61f528f2a0448a7946a9e6a6c6e831bc104d309f.tar.xz
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.
-rw-r--r--0001-Use-new-style-demand-loaded-bash-completion-scripts.patch965
-rw-r--r--libguestfs.spec57
2 files changed, 997 insertions, 25 deletions
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" <rjones@redhat.com>
+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 <domain>
+- doms=$(_guestfs_virsh_list "$flag_ro")
+- COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W "$doms" -- "$word"))
+- elif [ "$flag_a" -eq 1 ]; then
+- # -a <file>
+- 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 <domain>
+- 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 <domain>
+- 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 <domain>
+- 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<virt-alignment-scan(1)> command and documentation.
+
+ The libguestfs appliance, build scripts and so on.
+
++=item C<bash>
++
++Bash tab-completion scripts.
++
+ =item C<build-aux>
+
+ 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 <rjones@redhat.com> - 1:1.21.23-1
+* Thu Mar 28 2013 Richard W.M. Jones <rjones@redhat.com> - 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 <rjones@redhat.com> - 1:1.21.22-1
- New upstream version 1.21.22.