diff --git a/completions/Makefile.am b/completions/Makefile.am index a5f6e84a..d7d512c4 100644 --- a/completions/Makefile.am +++ b/completions/Makefile.am @@ -57,6 +57,7 @@ bashcomp_DATA = abook \ gzip \ heimdal \ hping2 \ + htpasswd \ iconv \ iftop \ ifupdown \ diff --git a/completions/htpasswd b/completions/htpasswd new file mode 100644 index 00000000..7d4898b9 --- /dev/null +++ b/completions/htpasswd @@ -0,0 +1,41 @@ +# htpasswd(1) completion + +have htpasswd || return + +_htpasswd() +{ + local cur prev words cword + _init_completion || return + + local i o=0 # $o is index of first non-option argument + for (( i=1; i <= cword; i++ )); do + case ${words[i]} in + -*n*) return ;; + -*) ;; + *) o=$i ; break ;; + esac + done + + if [[ $o -eq 0 || $o -eq $cword ]]; then + if [[ "$cur" == -* ]]; then + COMPREPLY=( $( compgen -W '$( _parse_help "$1" )' -- "$cur" ) ) + return + fi + # Password file (first non-option argument) + _filedir + + elif [[ $o -eq $cword-1 ]]; then + # Username (second non-option argument) + COMPREPLY=( $( compgen -W \ + '$( cut -d: -f1 "${words[o]}" 2>/dev/null )' -- "$cur" ) ) + fi +} && +complete -F _htpasswd htpasswd + +# Local variables: +# mode: shell-script +# sh-basic-offset: 4 +# sh-indent-comment: t +# indent-tabs-mode: nil +# End: +# ex: ts=4 sw=4 et filetype=sh diff --git a/test/completion/htpasswd.exp b/test/completion/htpasswd.exp new file mode 100644 index 00000000..08294f35 --- /dev/null +++ b/test/completion/htpasswd.exp @@ -0,0 +1 @@ +assert_source_completions htpasswd diff --git a/test/fixtures/htpasswd/htpasswd b/test/fixtures/htpasswd/htpasswd new file mode 100644 index 00000000..5279c7c3 --- /dev/null +++ b/test/fixtures/htpasswd/htpasswd @@ -0,0 +1,2 @@ +foo:bar +quux:baz diff --git a/test/lib/completions/htpasswd.exp b/test/lib/completions/htpasswd.exp new file mode 100644 index 00000000..bb66d2f0 --- /dev/null +++ b/test/lib/completions/htpasswd.exp @@ -0,0 +1,32 @@ +proc setup {} { + save_env +} + + +proc teardown {} { + assert_env_unmodified { + /OLDPWD=/d + } +} + + +setup + + +assert_complete_any "htpasswd " +sync_after_int + + +assert_no_complete "htpasswd -n $::srcdir/fixtures/htpasswd/ht" +sync_after_int + + +assert_complete_dir "htpasswd" "htpasswd " $::srcdir/fixtures/htpasswd +sync_after_int + + +assert_complete_dir "foo quux" "htpasswd -D htpasswd " $::srcdir/fixtures/htpasswd +sync_after_int + + +teardown