From: ianjazz246 Date: Wed, 24 Nov 2021 07:23:53 +0000 (-0800) Subject: Add Bash completion X-Git-Tag: v0.10.0~23^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F680%2Fhead;p=thirdparty%2Fsnapper.git Add Bash completion --- diff --git a/scripts/Makefile.am b/scripts/Makefile.am index a2e3cebd..8fa0b960 100644 --- a/scripts/Makefile.am +++ b/scripts/Makefile.am @@ -14,9 +14,10 @@ pam_snapper_SCRIPTS = \ endif -EXTRA_DIST = snapper-hourly snapper-daily $(pam_snapper_SCRIPTS) +EXTRA_DIST = snapper-hourly snapper-daily bash-completion.bash $(pam_snapper_SCRIPTS) install-data-local: install -D snapper-hourly $(DESTDIR)/etc/cron.hourly/suse.de-snapper install -D snapper-daily $(DESTDIR)/etc/cron.daily/suse.de-snapper + install -D bash-completion.bash $(DESTDIR)/usr/share/bash-completion/completions/snapper diff --git a/scripts/bash-completion.bash b/scripts/bash-completion.bash new file mode 100644 index 00000000..e0fb8d86 --- /dev/null +++ b/scripts/bash-completion.bash @@ -0,0 +1,269 @@ +# snapper(8) autocompletion + +_snapper() +{ + local configdir="/etc/snapper/configs" + local cur prev words cword + _init_completion || return + + local GLOBAL_SNAPPER_OPTIONS=' + -q --quiet + -v --verbose + --utc + --iso + -t --table-style + --abbreviate + --machine-readable + --csvout + --jsonout + --separator + -c --config + --no-dbus + -r --root + -a --ambit + --version + --help + ' + + # see if the user selected a command already + local COMMANDS=( + "list-configs" "create-config" "delete-config" "get-config" "set-config" + "list" "ls" + "create" "modify" "delete" "remove" "rm" + "mount" "umount" + "status" "diff" "xadiff" + "undochange" "rollback" + "setup-quota" + "cleanup") + + local command i + for (( i=0; i < ${#words[@]}-1; i++ )); do + # Match word only either from start of string or after space to prevent options + # like -c from matching commands that have -c in them, like list-configs + if [[ ${COMMANDS[@]} =~ (^| )"${words[i]}" ]]; then + command=${words[i]} + break + fi + done + + # Global options autocomplete + case $prev in + --version|--help) + return 0 + ;; + --config|-c) + local configs=() + # Get basenames of config files in "$configdir" + for configfile in "$configdir"/*; do + configs+=("${configfile##*/}") + done + COMPREPLY=( $( compgen -W "${configs[*]}" -- "$cur" ) ) + return 0 + ;; + --machine-readable) + COMPREPLY=( $( compgen -W 'csv json' -- "$cur" ) ) + return 0 + ;; + --root|-r) + COMPREPLY=( $( compgen -f -- "$cur" ) ) + return 0 + ;; + esac + + # supported options per command + if [[ "$cur" == -* ]]; then + case $command in + list-configs) + # --columns completion not implemented + COMPREPLY=( $( compgen -W '--columns + ' -- "$cur" )) + return 0 + ;; + create-config) + COMPREPLY=( $( compgen -W '--fstype -f + --template -t' -- "$cur" ) ) + return 0 + ;; + list|ls) + COMPREPLY=( $( compgen -W '--type -t + --disable-used-space + --all-configs -a + --columns' -- "$cur" ) ) + return 0 + ;; + create) + COMPREPLY=( $( compgen -W '--type -t + --pre-number + --print-number -p + --description -d + --cleanup-algorithm -c + --userdata -u + --command + --read-only + --read-write + --from' -- "$cur" ) ) + return 0 + ;; + modify) + COMPREPLY=( $( compgen -W '--description -d + --cleanup-algorithm -c + --userdata -u' -- "$cur" ) ) + return 0 + ;; + delete|remove|rm) + COMPREPLY=( $( compgen -W '--sync -s + ' -- "$cur" ) ) + return 0 + ;; + status) + COMPREPLY=( $( compgen -W '--output -o + ' -- "$cur" ) ) + return 0 + ;; + diff) + COMPREPLY=( $( compgen -W '--input -i + --diff-cmd + --extensions -x' -- "$cur" ) ) + return 0 + ;; + undochange) + COMPREPLY=( $( compgen -W '--input -i + ' -- "$cur" ) ) + return 0 + ;; + rollback) + COMPREPLY=( $( compgen -W '--print-number -p + --description -d + --cleanup-algorithm -c + --userdata -u' -- "$cur" ) ) + return 0 + ;; + cleanup) + COMPREPLY=( $( compgen -W '--path --free-space + ' -- "$cur" ) ) + return 0 + ;; + *) + COMPREPLY=( $( compgen -W "$GLOBAL_SNAPPER_OPTIONS" -- "$cur" ) ) + return 0 + ;; + esac + fi + + # specific command arguments + if [[ -n $command ]]; then + case $command in + list-configs) + case "$prev" in + --columns) + COMPREPLY=( $( compgen -W 'config subvolume + ' -- "$cur" ) ) + ;; + esac + return 0 + ;; + create-config) + case "$prev" in + --fstype|-f) + COMPREPLY=( $( compgen -W 'btrfs ext4 lvm(xfs) lvm(ext4) + ' -- "$cur" ) ) + ;; + --template|-t) + ;; + *) + COMPREPLY=( $( compgen -f -- "$cur" ) ) + ;; + esac + return 0 + ;; + list) + case "$prev" in + --type|-t) + COMPREPLY=( $( compgen -W 'all single pre-post + ' -- "$cur" ) ) + ;; + --columns) + COMPREPLY=( $( compgen -W 'config subvolume number + default active type date user used-space cleanup + description userdata pre-number post-number + post-date + ' -- "$cur" ) ) + ;; + esac + return 0 + ;; + create) + case "$prev" in + --type|-t) + COMPREPLY=( $( compgen -W 'single pre post + ' -- "$cur" ) ) + ;; + --pre-number) + COMPREPLY=( $( compgen -W ' + ' -- "$cur" ) ) + ;; + --cleanup-algorithm|-c) + COMPREPLY=( $( compgen -W 'empty-pre-post timeline number + ' -- "$cur" ) ) + ;; + esac + return 0 + ;; + modify) + case "$prev" in + --cleanup-algorithm|-c) + COMPREPLY=( $( compgen -W 'empty-pre-post timeline number + ' -- "$cur" ) ) + ;; + esac + return 0 + ;; + status) + case "$prev" in + --output|-o) + COMPREPLY=( $( compgen -f -- "$cur" ) ) + ;; + esac + return 0 + ;; + cleanup) + case "$prev" in + empty-pre-post|timeline|number) + ;; + --path) + COMPREPLY=( $( compgen -f -- "$cur" ) ) + ;; + *) + COMPREPLY=( $( compgen -W 'empty-pre-post timeline number + ' -- "$cur" ) ) + ;; + esac + return 0 + ;; + diff) + return 0 + ;; + undochange) + return 0 + ;; + rollback) + case "$prev" in + --cleanup-algorithm|-c) + COMPREPLY=( $( compgen -W 'empty-pre-post timeline number + ' -- "$cur" ) ) + ;; + esac + return 0 + ;; + esac + fi + + # no command yet, show what commands we have + if [ "$command" = "" ]; then + #COMPREPLY=( $( compgen -W '${COMMANDS[@]} ${GLOBAL_SNAPPER_OPTIONS[@]}' -- "$cur" ) ) + COMPREPLY=( $( compgen -W "${COMMANDS[*]}" -- "$cur" ) ) + fi + + return 0 +} && +complete -F _snapper snapper