]> git.ipfire.org Git - thirdparty/snapper.git/commitdiff
Add Bash completion 680/head
authorianjazz246 <ianjazz246@gmail.com>
Wed, 24 Nov 2021 07:23:53 +0000 (23:23 -0800)
committerianjazz246 <ianjazz246@gmail.com>
Wed, 24 Nov 2021 07:28:20 +0000 (23:28 -0800)
scripts/Makefile.am
scripts/bash-completion.bash [new file with mode: 0644]

index a2e3cebdeb57992e3f51caaa1d552293055ceac8..8fa0b960573176b2301649b4c1db9cc9eb6bca8b 100644 (file)
@@ -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 (file)
index 0000000..e0fb8d8
--- /dev/null
@@ -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