[csw-devel] SF.net SVN: gar:[19103] csw/mgar/pkg/bash_completion/trunk/files

chninkel at users.sourceforge.net chninkel at users.sourceforge.net
Sun Aug 26 21:01:44 CEST 2012


Revision: 19103
          http://gar.svn.sourceforge.net/gar/?rev=19103&view=rev
Author:   chninkel
Date:     2012-08-26 19:01:44 +0000 (Sun, 26 Aug 2012)
Log Message:
-----------
improved or fixed pkgadd, pkgrm, pkgutil and svcadm completion

Modified Paths:
--------------
    csw/mgar/pkg/bash_completion/trunk/files/changelog.CSW
    csw/mgar/pkg/bash_completion/trunk/files/pkgadd.completion
    csw/mgar/pkg/bash_completion/trunk/files/pkgrm.completion
    csw/mgar/pkg/bash_completion/trunk/files/pkgutil.completion

Added Paths:
-----------
    csw/mgar/pkg/bash_completion/trunk/files/pkg-get.completion
    csw/mgar/pkg/bash_completion/trunk/files/svcadm.completion

Removed Paths:
-------------
    csw/mgar/pkg/bash_completion/trunk/files/pkg-get.completion
    csw/mgar/pkg/bash_completion/trunk/files/smf.completion

Modified: csw/mgar/pkg/bash_completion/trunk/files/changelog.CSW
===================================================================
--- csw/mgar/pkg/bash_completion/trunk/files/changelog.CSW	2012-08-26 14:50:13 UTC (rev 19102)
+++ csw/mgar/pkg/bash_completion/trunk/files/changelog.CSW	2012-08-26 19:01:44 UTC (rev 19103)
@@ -1,3 +1,10 @@
+bash_completion (2.0,REV=2012.08.26)
+
+  * Improved pkgadd, pkgrm and svcadm completion.
+  * Fixed pkgutil completion.
+
+   -- Yann Rouillard <yann at opencsw.org>  Sun, 26 Aug 2012 20:59:36 +0200
+
 bash_completion (2.0,REV=2012.08.23)
 
   * New upstream version.

Deleted: csw/mgar/pkg/bash_completion/trunk/files/pkg-get.completion
===================================================================
--- csw/mgar/pkg/bash_completion/trunk/files/pkg-get.completion	2012-08-26 14:50:13 UTC (rev 19102)
+++ csw/mgar/pkg/bash_completion/trunk/files/pkg-get.completion	2012-08-26 19:01:44 UTC (rev 19103)
@@ -1,80 +0,0 @@
-#
-# Copyright 2006 Yann Rouillard <yann at opencsw.org>
-# All rights reserved.  Use is subject to license terms.
-#
-# Redistribution and/or use, with or without modification, is
-# permitted.  This code is without warranty of any kind.  The
-# author(s) shall not be liable in the event that use of the
-# software causes damage.
-#
-# pkg-get.completion - bash completion for opencsw pkg-get
-#
-
-_have pkg-get && 
-_pkg-get_get_catalog_file()
-{
-	local url="$1"
-	local catalog_file i conffile
-
-	for file in /etc/opt/csw/pkg-get.conf /opt/csw/etc/pkg-get.conf /etc/pkg-get.conf; do
-		if [[ -f $file ]]; then
-			conffile="$file"
-			break
-		fi
-	done
-	conffile="${conffile:-/opt/csw/etc/pkg-get.conf}"
-
-	if [[ -z "$url" ]]; then
-		url=$(awk -F= ' $1=="url" { print $2 }' $conffile)
-	fi
-
-	catalog_file="${url##*//}"
-	catalog_file="${catalog_file%%/*}"
-	catalog_file="/var/pkg-get/catalog-$catalog_file"
-
-	echo "$catalog_file"
-} &&
-_pkg-get()
-{
-	local cur prev file catalog_file url command
-	COMPREPLY=()
-	cur="${COMP_WORDS[COMP_CWORD]}"
-	prev="${COMP_WORDS[COMP_CWORD-1]}"
-
-	if [[ "${prev}" = "-s" ]]; then
-		return 1
-	fi
-
-	i=${#COMP_WORDS[*]} 
-	while [[ $i -gt 0 ]]; do
-		i=$((i-1))
-		if [[ "${COMP_WORDS[$i]}" = "-s" ]]; then
-			url="${COMP_WORDS[$((i+1))]}"
-		fi
-		if [[ "${COMP_WORDS[$i]}" == @(available|-a|describe|-D|download|-d|install|-i|list|updatecatalog|-U|upgrade|-u) ]]; then
-			command="${COMP_WORDS[$i]}"	
-		fi
-	done
-	
-	if [[ -n "$command" ]]; then
-		if [[ "$command" == @(describe|-D|download|-d|install|-i) ]]; then
-			catalog_file=$(_pkg-get_get_catalog_file "$url")
-			if [[ -f $catalog_file ]]; then
-				local packages_list=$(awk ' $0 ~ /BEGIN PGP SIGNATURE/ { exit } $1 ~ /^Hash:/ || $1 ~ /^ *(-|#|$)/ { next } { print $1 }' $catalog_file)
-				COMPREPLY=( $(compgen -W "${packages_list}" -- ${cur}) )
-			fi
-		fi
-		return 0
-	fi
-
-	if [[ ${cur} == -* ]] ; then
-		local opts="-c -d -D -f -i -l -s -S -u -U -v"
-		COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
-		return 0
-	else
-		local commands="available describe download install list updatecatalog upgrade" 
-		COMPREPLY=( $(compgen -W "${commands}" -- ${cur}) )
-		return 0
-	fi
-} &&
-complete -F _pkg-get pkg-get

Added: csw/mgar/pkg/bash_completion/trunk/files/pkg-get.completion
===================================================================
--- csw/mgar/pkg/bash_completion/trunk/files/pkg-get.completion	                        (rev 0)
+++ csw/mgar/pkg/bash_completion/trunk/files/pkg-get.completion	2012-08-26 19:01:44 UTC (rev 19103)
@@ -0,0 +1,80 @@
+#
+# Copyright 2006 Yann Rouillard <yann at opencsw.org>
+# All rights reserved.  Use is subject to license terms.
+#
+# Redistribution and/or use, with or without modification, is
+# permitted.  This code is without warranty of any kind.  The
+# author(s) shall not be liable in the event that use of the
+# software causes damage.
+#
+# pkg-get.completion - bash completion for opencsw pkg-get
+#
+
+_have pkg-get && 
+_pkg-get_get_catalog_file()
+{
+	local url="$1"
+	local catalog_file i conffile
+
+	for file in /etc/opt/csw/pkg-get.conf /opt/csw/etc/pkg-get.conf /etc/pkg-get.conf; do
+		if [[ -f $file ]]; then
+			conffile="$file"
+			break
+		fi
+	done
+	conffile="${conffile:-/opt/csw/etc/pkg-get.conf}"
+
+	if [[ -z "$url" ]]; then
+		url=$(awk -F= ' $1=="url" { print $2 }' $conffile)
+	fi
+
+	catalog_file="${url##*//}"
+	catalog_file="${catalog_file%%/*}"
+	catalog_file="/var/pkg-get/catalog-$catalog_file"
+
+	echo "$catalog_file"
+} &&
+_pkg-get()
+{
+	local cur prev file catalog_file url command
+	COMPREPLY=()
+	cur="${COMP_WORDS[COMP_CWORD]}"
+	prev="${COMP_WORDS[COMP_CWORD-1]}"
+
+	if [[ "${prev}" = "-s" ]]; then
+		return 1
+	fi
+
+	i=${#COMP_WORDS[*]} 
+	while [[ $i -gt 0 ]]; do
+		i=$((i-1))
+		if [[ "${COMP_WORDS[$i]}" = "-s" ]]; then
+			url="${COMP_WORDS[$((i+1))]}"
+		fi
+		if [[ "${COMP_WORDS[$i]}" == @(available|-a|describe|-D|download|-d|install|-i|list|updatecatalog|-U|upgrade|-u) ]]; then
+			command="${COMP_WORDS[$i]}"	
+		fi
+	done
+	
+	if [[ -n "$command" ]]; then
+		if [[ "$command" == @(describe|-D|download|-d|install|-i) ]]; then
+			catalog_file=$(_pkg-get_get_catalog_file "$url")
+			if [[ -f $catalog_file ]]; then
+				local packages_list=$(awk ' $0 ~ /BEGIN PGP SIGNATURE/ { exit } $1 ~ /^Hash:/ || $1 ~ /^ *(-|#|$)/ { next } { print $1 }' $catalog_file)
+				COMPREPLY=( $(compgen -W "${packages_list}" -- ${cur}) )
+			fi
+		fi
+		return 0
+	fi
+
+	if [[ ${cur} == -* ]] ; then
+		local opts="-c -d -D -f -i -l -s -S -u -U -v"
+		COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
+		return 0
+	else
+		local commands="available describe download install list updatecatalog upgrade" 
+		COMPREPLY=( $(compgen -W "${commands}" -- ${cur}) )
+		return 0
+	fi
+} &&
+complete -F _pkg-get pkg-get


Property changes on: csw/mgar/pkg/bash_completion/trunk/files/pkg-get.completion
___________________________________________________________________
Added: svn:executable
   + *

Modified: csw/mgar/pkg/bash_completion/trunk/files/pkgadd.completion
===================================================================
--- csw/mgar/pkg/bash_completion/trunk/files/pkgadd.completion	2012-08-26 14:50:13 UTC (rev 19102)
+++ csw/mgar/pkg/bash_completion/trunk/files/pkgadd.completion	2012-08-26 19:01:44 UTC (rev 19103)
@@ -8,37 +8,20 @@
 # software causes damage.
 #
 
-_pkgadd_complete_pkginst ()
-{
-	local device filedir
-	device=$1
-
-	for filedir in $(/bin/ls -1 $device); do
-		if [[ -d "$device/$filedir" ]] && [[ -f "$device/$filedir/pkginfo" ]]; then 
-			pkginst_list=( ${pkginst_list[@]:-} "$filedir" )
-		fi
-	done
-}
-
-have pkgadd &&
 _pkgadd ()
 {
-        local cur prev i device pkginst_list
-        COMPREPLY=()
-	pkginst_list=()
-        cur="${COMP_WORDS[COMP_CWORD]}"
-        prev="${COMP_WORDS[COMP_CWORD-1]}"
+	local cur prev words cword 
+	_init_completion -n : || return
 
 	# if a device directory was given
 	# we must complete with the package
 	# available in this directory
-	device=/var/spool/pkg;
-	i=${#COMP_WORDS[*]};
-	while [[ $i -gt 0 ]]; do
-		i=$((i-1));
-		case "${COMP_WORDS[$i]}" in
-			-d)
-			device="${COMP_WORDS[$((i+1))]}";
+	local device=/var/spool/pkg;
+	local i=$cword
+	while [[ $((i--)) -gt 0 ]]; do
+		case "${words[$i]}" in
+		-d)
+			device="${words[$((i+1))]}";
 			break
 			;;
 		esac;
@@ -62,11 +45,16 @@
 			local opts="-a -A -d -k -n -M -P -r -R -s -v -V -x"
 			COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
 		else	
+			local pkginst_list
 			if [[ -d $device ]]; then	
-				_pkgadd_complete_pkginst $device
+				for filedir in $(/bin/ls -1 $device); do
+					if [[ -d "$device/$filedir" ]] && [[ -f "$device/$filedir/pkginfo" ]]; then 
+						pkginst_list+=( ${pkginst_list[@]:-} "$filedir" )
+					fi
+				done
 				pkginst_list="${pkginst_list[@]}"
 			else
-				pkginst_list=$(strings $device | grep "^PKG=" | sort -u | cut -d= -f2)
+				pkginst_list=$(strings $(dequote $device) | grep "^PKG=" | sort -u | cut -d= -f2)
 			fi
 			COMPREPLY=( $(compgen -W "$pkginst_list" -- ${cur}) )
 		fi

Modified: csw/mgar/pkg/bash_completion/trunk/files/pkgrm.completion
===================================================================
--- csw/mgar/pkg/bash_completion/trunk/files/pkgrm.completion	2012-08-26 14:50:13 UTC (rev 19102)
+++ csw/mgar/pkg/bash_completion/trunk/files/pkgrm.completion	2012-08-26 19:01:44 UTC (rev 19103)
@@ -11,21 +11,19 @@
 _have pkgrm &&
 _pkgrm ()
 {
-    local cur prev i spool;
-    COMPREPLY=();
-    cur="${COMP_WORDS[COMP_CWORD]}";
-    prev="${COMP_WORDS[COMP_CWORD-1]}";
+    local cur prev words cword 
+    _init_completion || return
 
     # if a spool directory was given
     # we must complete with the package
     # available in this directory
-    spool=/var/sadm/pkg;
-    i=${#COMP_WORDS[*]};
-    while [[ $i -gt 0 ]]; do
+    local spool=/var/sadm/pkg;
+    local i=$cword
+    while [[ $((i--)) -gt 0 ]]; do
         i=$((i-1));
-        case "${COMP_WORDS[$i]}" in
+        case "${words[$i]}" in
             -s)
-                spool="${COMP_WORDS[$((i+1))]}";
+                spool="${words[$((i+1))]}";
                 break
             ;;
         esac;

Modified: csw/mgar/pkg/bash_completion/trunk/files/pkgutil.completion
===================================================================
--- csw/mgar/pkg/bash_completion/trunk/files/pkgutil.completion	2012-08-26 14:50:13 UTC (rev 19102)
+++ csw/mgar/pkg/bash_completion/trunk/files/pkgutil.completion	2012-08-26 19:01:44 UTC (rev 19103)
@@ -10,53 +10,95 @@
 # pkgutil.completion - bash completion for pkgutil
 #
 
-_have pkgutil && 
+
+_pkgutil_url2catalog()
+{
+	local filename="$1"
+
+	filename="${filename##*://}"
+	filename="${filename//\//_}"
+	filename="/var/opt/csw/pkgutil/catalog.${filename}_$(uname -p)_$(uname -r)"
+
+	echo "$filename"
+}
+
 _pkgutil()
 {
-	local cur prev file catalog_file url command
-	local catalog_file="/var/opt/csw/pkgutil/catalog.`uname -p`.`uname -r`"
-	COMPREPLY=()
-	cur="${COMP_WORDS[COMP_CWORD]}"
-	prev="${COMP_WORDS[COMP_CWORD-1]}"
+	local cur prev words cword 
+	_init_completion -n : || return
 
-	i=${#COMP_WORDS[*]} 
-	while [[ $i -gt 1 ]]; do
-		i=$((i-1))
-		if [[ "${COMP_WORDS[$i]}" = @(-t|--temp) ]]; then
-			url="${COMP_WORDS[$((i+1))]}"
+	local command catalog_files configuration_files
+	declare -a configuration_files=("/opt/csw/etc/pkgutil.conf" "/etc/opt/csw/pkgutil.conf")
+	declare -a catalog_files=()
+
+	i=$cword
+	while [[ $((i--)) -gt 1 ]]; do
+		if [[ "${words[$i]}" = @(-t|--temp) ]]; then
+			local url="${words[$((i+1))]}"
+			local catalog=$(_pkgutil_url2catalog "$url")
+			catalog_files=("$catalog")
+		elif [[ "${words[$i]}" = @(--config) ]]; then
+			configuration_files=( "$(dequote ${words[$((i+1))]})" )
+		elif [[ "${words[$i]}" == @(-i|--install|-u|--upgrade|-r|--remove|-d|--download|-a|--available|-c|--compare|-U|--catalog|-S|--stream) ]]; then
+			command="${words[$i]}"	
 		fi
-		if [[ "${COMP_WORDS[$i]}" == @(-i|--install|-u|--upgrade|-r|--remove|-d|--download|-a|--available|-c|--compare|-U|--catalog|-S|--stream) ]]; then
-			command="${COMP_WORDS[$i]}"	
-		fi
 	done
-	
-	if [[ -n "$command" ]]; then
-		if [[ -f $catalog_file ]]; then
-			if [[ "$command" == @(--download|-d|--install|-i|--upgrade|-u|s|--stream) ]]; then
-				local packages_list=$(awk ' $0 ~ /BEGIN PGP SIGNATURE/ { exit } $1 ~ /^Hash:/ || $1 ~ /^ *(-|#|$)/ { next } { print $1 }' $catalog_file)
-				COMPREPLY=( $(compgen -W "${packages_list}" -- ${cur}) )
-			elif [[ "$command" == @(-r|--remove) ]]; then
-				local packages_list=$(pkginfo | awk ' $2 ~ /^CSW/ { printf ("%s|",$2) }')
-				packages_list=${packages_list%|}
-				packages_list=$(nawk " \$3 ~ /^$packages_list\$/ { print \$1 }" $catalog_file)
-				COMPREPLY=( $(compgen -W "${packages_list}" -- ${cur}) )
-			fi
-		fi
+
+	if [[ "$prev" = @(-W|--workdir|-P|--pkgdir|-R|--rootpath) ]]; then
+		_filedir -d
 		return 0
 	fi
 
-	if [[ "$prev" = @(-W|--workdir) ]]; then
-		COMPREPLY=( $(compgen -d -- ${cur}) )
+	if [[ "$prev" = @(-o|--output|--config) ]]; then
+		_filedir
 		return 0
 	fi
 
-	if [[ "$prev" = @(-o|--output) ]]; then
-		COMPREPLY=( $(compgen -f -- ${cur}) )
+	if [[ "$prev" = @(-p|--param) ]]; then
+		compopt -o nospace
+		COMPREPLY=( $(compgen -W "mirror: pkgaddopts: pkgrmopts: wgetopts: use_gpg: use_md5: pkgliststyle: maxpkglist: noncsw: stop_on_hook_soft_error: exclude_pattern: gpg_homedir: root_path: deptree_filter_common: show_current: catalog_not_cached: catalog_update:" -- $cur) )
 		return 0
 	fi
 
-	local commands="-i --install -u --upgrade -r --remove -d --download -a --available -c --compare -U --catalog -e --email -t --temp=site -s --stream -T --target -o --output -x --exclude -W --workdir -y --yes -n --nomod -D --debug -h --help -v --version -V --syscheck"
-	COMPREPLY=( $(compgen -W "${commands}" -- ${cur}) )
+	if [[ "$prev" = @(-T|--target) ]]; then
+		# Work-around bash_completion issue where bash interprets a colon
+		# as a separator, borrowed from maven completion code which borrowed
+		# it from darcs completion code :)
+		local colonprefixes=${cur%"${cur##*:}"}
+		COMPREPLY=( $(compgen -W "sparc:5.9 sparc:5.10 sparc:5.11 i386:5.9 i386:5.10 i386:5.11" -- $cur) )
+		local i=${#COMPREPLY[*]}
+		while [ $((--i)) -ge 0 ]; do
+			COMPREPLY[$i]=${COMPREPLY[$i]#"$colonprefixes"}
+		done
+		return 0
+	fi
+
+	if [[ -n "$command" ]] && [[ ! "$cur" == -* ]]; then
+
+		local mirrors mirror_url
+		mirrors=$(awk -F= ' $1 ~ /^ *mirror *$/ { print $2 }' ${configuration_files[@]})
+		mirrors=${mirrors:-http://mirror.opencsw.org/opencsw/testing}
+		for mirror_url in $mirrors; do
+			local catalog=$(_pkgutil_url2catalog "$mirror_url")
+			catalog_files=( "${catalog_files[@]}" "$catalog" )
+		done
+
+		if [[ "$command" == @(--download|-d|--install|-i|--upgrade|-u|s|--stream) ]]; then
+			local packages_list=$(awk ' $0 ~ /BEGIN PGP SIGNATURE/ { exit } $1 ~ /^Hash:/ || $1 ~ /^ *(-|#|$)/ { next } { print $1 }' "${catalog_files[@]}")
+			COMPREPLY=( $(compgen -W "${packages_list}" -- $cur) )
+
+		elif [[ "$command" == @(-r|--remove) ]]; then
+			local packages_list=$(pkginfo | awk ' $2 ~ /^CSW/ { printf ("%s|",$2) }')
+			packages_list=${packages_list%|}
+			packages_list=$(nawk " \$3 ~ /^$packages_list\$/ { print \$1 }" "${catalog_files[@]}")
+			COMPREPLY=( $(compgen -W "${packages_list}" -- $cur) )
+		fi
+		return 0
+	fi
+
+	local commands="-i --install -u --upgrade -r --remove -d --download -U --catalog -a --available --describe -c --compare -C --compare-diff -A --compare-avail -e --email -t --temp -x --exclude -W --workdir -P --pkgdir -R --rootpath --config -y --yes -f --force -n --nomod -N --nodeps -D --debug --trace -h --help -v --version -V --syscheck -l --list -L --listfile -F --findfile --deptree --extract -s --stream -o --output -T --target --single -p --param --parse --cleanup --catinfo"
+	COMPREPLY=( $(compgen -W "${commands}" -- $cur) )
 	return 0
-} &&
+} 
+
 complete -F _pkgutil pkgutil

Deleted: csw/mgar/pkg/bash_completion/trunk/files/smf.completion
===================================================================
--- csw/mgar/pkg/bash_completion/trunk/files/smf.completion	2012-08-26 14:50:13 UTC (rev 19102)
+++ csw/mgar/pkg/bash_completion/trunk/files/smf.completion	2012-08-26 19:01:44 UTC (rev 19103)
@@ -1,104 +0,0 @@
-#
-# Copyright 2006 Yann Rouillard <yann at opencsw.org>
-# All rights reserved.  Use is subject to license terms.
-#
-# Redistribution and/or use, with or without modification, is
-# permitted.  This code is without warranty of any kind.  The
-# author(s) shall not be liable in the event that use of the
-# software causes damage.
-#
-
-_smf_complete_frmi ()
-{
-	local cur="$1" prefix="$2"
-	local IFS=$'\t\n' 
-	local colons nb_colons frmi pattern=""
-
-	if [[ "$cur" == "$prefix"* ]]; then
-		prefix="$cur"
-	fi
-
-	colons=${cur//[^:]/}
-	nb_colons=${#colons}
-
-	# solaris sed doesn't seem to support \(pattern\)\{number\} regex
-	while [[ "$nb_colons" -ne 0 ]]; do
-		pattern="$pattern[^:]*:"
-		nb_colons=$(( nb_colons - 1 ))
-	done
-		
-	if [[ -n "$pattern" ]]; then
-		frmi="$(svcs -H -o FMRI "$prefix*" 2>/dev/null | sed -n -e "s/$pattern//p")"
-	else
-		frmi="$(svcs -H -o FMRI "$prefix*" 2>/dev/null)"
-	fi
-	
-	cur="${cur##*:}"
-	COMPREPLY=( $(compgen -W "$frmi" -- ${cur}) )
-}
-
-_have svcadm &&
-_svcadm ()
-{
-        local cur prev command command_list command_option i
-        COMPREPLY=()
-        command_list="enable disable restart refresh clear mark milestone"
-        cur="${COMP_WORDS[COMP_CWORD]}"
-        prev="${COMP_WORDS[COMP_CWORD-1]}"
-
-	for (( i=0; i < ${#COMP_WORDS[@]}-1; i++ )); do
-                if [[ ${COMP_WORDS[i]} == @(enable|disable|restart|refresh|clear|mark|milestone) ]]; then
-                        command=${COMP_WORDS[i]}
-                fi
-        done
-
-        if [[ -z "$command" ]]; then
-                if [[ ${cur} == -* ]] ; then
-                        COMPREPLY=( $(compgen -W "-v" -- ${cur}) )
-                else
-                        COMPREPLY=( $(compgen -W "$command_list" -- ${cur}) )
-                fi
-        else
-                case "$command" in
-                        enable)
-			if [[ ${cur} == -* ]]; then
-				COMPREPLY=( $(compgen -W "-r -s -t" -- ${cur}) )
-                        else
-                                _smf_complete_frmi "${cur}" "svc:"
-                        fi;;
-
-                        disable)
-			if [[ ${cur} == -* ]]; then
-				COMPREPLY=( $(compgen -W "-s -t" -- ${cur}) )
-                        else
-                                _smf_complete_frmi "${cur}" "svc:"
-                        fi;;
-
-			restart)
-                                _smf_complete_frmi "${cur}" "svc:";;
-			refresh)	
-                                _smf_complete_frmi "${cur}" "svc:";;
-			clear)
-                                _smf_complete_frmi "${cur}" "svc:";;
-			mark)
-			if [[ ${cur} == -* ]]; then
-				COMPREPLY=( $(compgen -W "-I -t" -- ${cur}) )
-			else
-				if [[ "$prev" == @(degraded|maintenance) ]]; then
-					_smf_complete_frmi "${cur}" "svc:"
-				else
-					COMPREPLY=( $(compgen -W "degraded maintenance" -- ${cur}) )
-				fi
-                        fi;;
-
-			milestone)
-			if [[ ${cur} == -* ]]; then
-				COMPREPLY=( $(compgen -W "-d" -- ${cur}) )
-			else
-				_smf_complete_frmi "${cur}" "svc:/milestone/"
-			fi;;
-                esac
-        fi
-} &&
-complete -F _svcadm svcadm
-

Copied: csw/mgar/pkg/bash_completion/trunk/files/svcadm.completion (from rev 19076, csw/mgar/pkg/bash_completion/trunk/files/smf.completion)
===================================================================
--- csw/mgar/pkg/bash_completion/trunk/files/svcadm.completion	                        (rev 0)
+++ csw/mgar/pkg/bash_completion/trunk/files/svcadm.completion	2012-08-26 19:01:44 UTC (rev 19103)
@@ -0,0 +1,152 @@
+#
+# Copyright 2006 Yann Rouillard <yann at opencsw.org>
+# All rights reserved.  Use is subject to license terms.
+#
+# Redistribution and/or use, with or without modification, is
+# permitted.  This code is without warranty of any kind.  The
+# author(s) shall not be liable in the event that use of the
+# software causes damage.
+#
+
+
+# 
+# svcadm accept any complete FMRI or abreviated FMRI
+#  - a complete FMRI is svc:/foo/bar/bar/baz
+#  - abbreviated FMRI are foo/bar/bar/baz, bar/bar/baz, bar/baz or baz
+#
+# The goal of this function is to be able to propose all alternatives,
+# but to not clutter the interface with all completions, we will only
+# cut every completion alternative at the next slash.
+#
+# For exemple, if the user types <nothing><tab>, we will propose for svc://foo/bar/bar/baz
+# the following completion: foo/, bar/ and baz
+# If the user types <b><tab>, we will propose: bar/ and baz
+# If the user types <bar/><tab>, we will propose: bar/bar/ and bar/baz
+#
+# By default, the function proproses only abbreviated completions except if the user already
+# began to type svc:. In that case we will propose only the complete FMRI beginning with the
+# pattern
+#
+_smf_complete_fmri ()
+{
+	local cur="$1" prefix="$2"
+	local cur_prefix fmri fmri_list=""
+	local exact_mode pattern
+
+	if [[ "$cur" == $prefix* ]]; then
+		[[ "$cur" == $prefix ]] && cur+="/"
+		pattern="$cur*"
+		exact_mode=1
+	else
+		pattern="$prefix*/$cur*"
+	fi
+		
+	cur_prefix="${cur%"${cur##*/}"}"
+
+	for fmri in $(svcs -H -o FMRI "$pattern" 2>/dev/null); do
+
+		local fmri_part_list fmri_part
+
+		if [[ -z "$exact_mode" ]]; then
+
+			fmri=${fmri#$prefix/}
+
+			# we generate all possibles abbrevations for the FMRI
+			# no need to have a generic loop as we will have a finite
+			# number of components
+			local OIFS="$IFS"; IFS="/"; set -- $fmri; IFS="$OIFS"
+			case $# in
+				1) fmri_part_list=" $1";;
+				2) fmri_part_list=" $2 $1/$2";;
+				3) fmri_part_list=" $3 $2/$3 $1/$2/$3";;
+				4) fmri_part_list=" $4 $3/$4 $2/$3/$4 $1/$2/$3/$4";;
+			esac
+		else
+			fmri_part_list="$fmri"
+		fi
+
+		# Here we make sure the completions begins with the pattern and 
+		# we cut them at the first slash
+		for fmri_part in $fmri_part_list; do
+			[[ "$fmri_part" == $cur* ]] || continue
+			local first_part=${fmri_part#$cur_prefix}
+			first_part=$cur_prefix${first_part%%/*}
+			[[ "$first_part" != "$fmri_part" ]] && first_part+="/"
+			fmri_list+=" $first_part"
+		done
+	done
+
+	COMPREPLY=( $fmri_list )
+
+	# here we want to detect if there only one completion proposed and that
+	# it ends with a slash. That means the users will still have to complete
+	# after, so we gain him one tab keystroke by immediately proposing the
+	# next completion alternatives
+	local i=${#COMPREPLY[*]}
+	if [[ $i -gt 0 ]] && [[ "${COMPREPLY[$((--i))]}" == */ ]]; then
+		# we have to iterate throught the list as we may have duplicate
+		while [[ $i -ne 0 ]]; do
+			[[ "${COMPREPLY[$i]}" != "${COMPREPLY[$((i - 1))]}" ]] && break
+			((i--))
+		done
+		if [[ $i -eq 0 ]]; then
+			_smf_complete_fmri "${COMPREPLY[0]}" "$prefix"
+			return 0
+		fi
+	fi
+
+	# Work-around bash_completion issue where bash interprets a colon
+	# as a separator, borrowed from maven completion code which borrowed
+	# it from darcs completion code :)
+	local colonprefixes=${cur%"${cur##*:}"}
+	local i=${#COMPREPLY[*]}
+	while [ $((--i)) -ge 0 ]; do
+		COMPREPLY[$i]=${COMPREPLY[$i]#"$colonprefixes"}
+	done
+}
+
+_svcadm ()
+{
+	local cur prev words cword 
+	_init_completion -n : || return
+
+        local command_list="enable disable restart refresh clear mark milestone"
+        local command i
+
+	for (( i=1; i < $cword; i++ )); do
+                if [[ ${words[i]} == @(enable|disable|restart|refresh|clear|mark|milestone) ]]; then
+                        command=${words[i]}
+                fi
+        done
+
+        if [[ -z "$command" ]]; then
+                if [[ ${cur} == -* ]] ; then
+                        COMPREPLY=( $(compgen -W "-v" -- ${cur}) )
+                else
+                        COMPREPLY=( $(compgen -W "$command_list" -- ${cur}) )
+                fi
+        else
+		if [[ ${cur} == -* ]]; then
+			case "$command" in
+                        enable)
+				COMPREPLY=( $(compgen -W "-r -s -t" -- ${cur}) );;
+                        disable)
+				COMPREPLY=( $(compgen -W "-s -t" -- ${cur}) );;
+			mark)
+				COMPREPLY=( $(compgen -W "-I -t" -- ${cur}) );;
+			milestone)
+				COMPREPLY=( $(compgen -W "-d" -- ${cur}) );;
+			esac
+		else
+			if [[ "$command" == "mark" ]] && [[ "$prev" != @(degraded|maintenance) ]]; then
+				COMPREPLY=( $(compgen -W "degraded maintenance" -- ${cur}) )
+			elif [[ "$command" == "milestone" ]]; then
+				_smf_complete_fmri "${cur}" "svc:/milestone"
+			else
+				_smf_complete_fmri "${cur}" "svc:"
+                        fi
+                fi
+        fi
+} &&
+complete -F _svcadm svcadm
+

This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.



More information about the devel mailing list