flatpak-builder/completion/flatpak

406 lines
16 KiB
Plaintext

[ -z "$BASH_VERSION" ] && return
__contains_word () {
local w word=$1; shift
for w in "$@"; do
[[ $w = "$word" ]] && return
done
}
_flatpak() {
local cur prev
local cur=${COMP_WORDS[COMP_CWORD]}
local prev=${COMP_WORDS[COMP_CWORD-1]}
if [[ $cur == "=" ]] && [[ "$prev" = -* ]]; then
cur=""
elif [[ $prev == "=" ]] && [[ "${COMP_WORDS[COMP_CWORD-2]}" = -* ]]; then
prev=${COMP_WORDS[COMP_CWORD-2]}
fi
local i verb comps mode kind bundle
local remote name
local file dir cmd sdk loc
local -A VERBS=(
[ALL]='remote-add remote-modify remote-delete remote-ls remote-list install update uninstall list run override enter export-file build-init build build-finish build-export build-bundle build-update-repo make-current'
[MODE]='remote-add remote-modify remote-delete remote-ls remote-list install update uninstall list list make-current'
[KIND]='install update uninstall list remote-ls'
[PERMS]='run override build build-finish'
[UNINSTALL]='uninstall'
[SHOW_DETAILS]='list remote-list remote-ls'
[ARCH]='build-init install build-bundle run uninstall update make-current'
[USER_AND_SYSTEM]='run remote-list list'
[APP_AND_RUNTIME]='install update uninstall'
)
local -A OPTS=(
[GENERAL]='--help --verbose --version'
[MODE]='--user --system'
[KIND]='--app --runtime'
[ARCH]='--arch='
[SHOW_DETAILS]='-d --show-details'
[PERMS]='--share= --unshare= --socket= --nosocket= --device= --nodevice= --filesystem= --env= --own-name= --talk-name= --persist='
[ADD_REMOTE]='--no-gpg-verify --if-not-exists --title= --gpg-import= --gpg-key='
[MODIFY_REMOTE]='--no-gpg-verify --gpg-verify --title= --gpg-import= --gpg-key='
[LIST_REMOTES]='--show-details'
[LS_REMOTE]='--show-details --updates'
[UNINSTALL]='--keep-ref --force-remove'
[INSTALL]='--bundle --gpg-file='
[BUILD_BUNDLE]='--gpg-keys= --runtime --arch= --repo-url='
[RUN]='--command= --branch= --devel --runtime='
[BUILD_INIT]='--arch= --var='
[BUILD]='--runtime'
[BUILD_FINISH]='--command= --allow'
[BUILD_EXPORT]='--subject= --body='
[EXPORT_FILE]='--app= --allow-write --allow-delete --allow-grant-permission --unique --transient'
[ARG]='--arch --command --branch --var --share --unshare --socket --nosocket --device --nodevice --subject --body --title --runtime --filesystem'
)
for ((i=0; i < COMP_CWORD; i++)); do
if [[ "${COMP_WORDS[i]}" = -* ]]; then
continue
fi
if __contains_word "${COMP_WORDS[i-1]}" ${OPTS[ARG]}; then
continue
fi
if __contains_word "${COMP_WORDS[i]}" ${VERBS[*]} &&
test -z $first_verb; then
first_verb=${COMP_WORDS[i]}
fi
done
if __contains_word "--bundle" ${COMP_WORDS[*]}; then
bundle="true"
else
bundle="false"
fi
if __contains_word "--user" ${COMP_WORDS[*]}; then
if __contains_word "--system" ${COMP_WORDS[*]}; then
mode="--user --system"
else
mode="--user"
fi
else
if __contains_word "--system" ${COMP_WORDS[*]}; then
mode=--system
else
if __contains_word "$first_verb" ${VERBS[USER_AND_SYSTEM]}; then
mode="--user --system"
else
mode="--system"
fi
fi
fi
if __contains_word "--app" ${COMP_WORDS[*]}; then
if __contains_word "--runtime" ${COMP_WORDS[*]}; then
kind="--app --runtime"
else
kind="--app"
fi
else
if __contains_word "--runtime" ${COMP_WORDS[*]}; then
kind="--runtime"
else
if __contains_word "$first_verb" ${VERBS[APP_AND_RUNTIME]}; then
kind="--app --runtime"
else
kind="--app"
fi
fi
fi
if __contains_word "$prev" ${OPTS[ARG]}; then
case $prev in
--arch)
comps='x86_64 i686'
;;
--command)
comps=$(compgen -A command)
;;
--var)
comps=$(flatpak $mode list --runtime)
;;
--runtime)
if __contains_word "$verb" ${VERBS[KIND]}; then
comps=XXX
else
comps=$(flatpak $mode list --runtime)
fi
;;
--share|--noshare)
comps='network ipc'
;;
--device|--nodevice)
comps='dri'
;;
--socket|--nosocket)
comps='x11 wayland pulseaudio system-bus session-bus'
;;
--branch|--subject|--body|--title)
comps=''
;;
--filesystem)
comps='host home xdg-desktop xdg-documents xdg-download xdg-music xdg-pictures xdg-public-share xdg-templates xdg-videos'
;;
esac
if [[ $comps != "XXXX" ]] ; then
COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
return 0
fi
fi
for ((i=0; i < COMP_CWORD; i++)); do
if [[ "${COMP_WORDS[i]}" = -* ]]; then
continue
fi
if __contains_word "${COMP_WORDS[i-1]}" ${OPTS[ARG]}; then
continue
fi
if __contains_word "${COMP_WORDS[i]}" ${VERBS[*]} &&
test -z $verb; then
verb=${COMP_WORDS[i]}
elif [[ $verb = install && $bundle = "true" ]]; then
if [[ -z $file ]]; then
file=${COMP_WORDS[i]}
fi
elif [[ $verb = install ]]; then
if [[ -z $remote ]]; then
remote=${COMP_WORDS[i]}
elif [[ -z $name ]]; then
name=${COMP_WORDS[i]}
fi
elif [[ $verb =~ (update|uninstall|run) ]]; then
if [[ -z $name ]]; then
name=${COMP_WORDS[i]}
fi
elif [[ $verb = build-init ]]; then
if [[ -z $dir ]]; then
dir=${COMP_WORDS[i]}
elif [[ -z $sdk ]]; then
sdk=${COMP_WORDS[i]}
elif [[ -z $name ]]; then
name=${COMP_WORDS[i]}
fi
elif [[ $verb = build ]]; then
if [[ -z $dir ]]; then
dir=${COMP_WORDS[i]}
elif [[ -z $cmd ]]; then
cmd=${COMP_WORDS[i]}
fi
elif [[ $verb = build-finish ]]; then
if [[ -z $dir ]]; then
dir=${COMP_WORDS[i]}
fi
elif [[ $verb = build-export ]]; then
if [[ -z $loc ]]; then
loc=${COMP_WORDS[i]}
elif [[ -z $dir ]]; then
dir=${COMP_WORDS[i]}
elif [[ -z $name ]]; then
name=${COMP_WORDS[i]}
fi
elif [[ $verb = build-bundle ]]; then
if [[ -z $loc ]]; then
loc=${COMP_WORDS[i]}
elif [[ -z $file ]]; then
file=${COMP_WORDS[i]}
elif [[ -z $name ]]; then
name=${COMP_WORDS[i]}
fi
elif [[ $verb = build-update-repo ]]; then
if [[ -z $loc ]]; then
loc=${COMP_WORDS[i]}
fi
elif [[ $verb = export-file ]]; then
if [[ -z $file ]]; then
file=${COMP_WORDS[i]}
fi
fi
done
if [[ -z $verb ]]; then
comps="${VERBS[*]}"
elif [[ "$cur" = -* ]]; then
comps="${OPTS[GENERAL]}"
if __contains_word "$verb" ${VERBS[MODE]}; then
comps="$comps ${OPTS[MODE]}"
fi
if __contains_word "$verb" ${VERBS[KIND]}; then
comps="$comps ${OPTS[KIND]}"
fi
if __contains_word "$verb" ${VERBS[PERMS]}; then
comps="$comps ${OPTS[PERMS]}"
fi
if [ "$verb" = "remote-list" ]; then
comps="$comps ${OPTS[LIST_REMOTES]}"
fi
if __contains_word "$verb" ${VERBS[ARCH]}; then
comps="$comps ${OPTS[ARCH]}"
fi
if __contains_word "$verb" ${VERBS[SHOW_DETAILS]}; then
comps="$comps ${OPTS[SHOW_DETAILS]}"
fi
if __contains_word "$verb" ${VERBS[UNINSTALL]}; then
comps="$comps ${OPTS[UNINSTALL]}"
fi
if [ "$verb" = "run" ]; then
comps="$comps ${OPTS[RUN]}"
fi
if [ "$verb" = "export-file" ]; then
comps="$comps ${OPTS[EXPORT_FILE]}"
fi
if [ "$verb" = "remote-ls" ]; then
comps="$comps ${OPTS[LS_REMOTE]}"
fi
if [ "$verb" = "build-init" ]; then
comps="$comps ${OPTS[BUILD_INIT]}"
fi
if [ "$verb" = "build" ]; then
comps="$comps ${OPTS[BUILD]}"
fi
if [ "$verb" = "build-finish" ]; then
comps="$comps ${OPTS[BUILD_FINISH]}"
fi
if [ "$verb" = "build-bundle" ]; then
comps="$comps ${OPTS[BUILD_BUNDLE]}"
fi
if [ "$verb" = "install" ]; then
comps="$comps ${OPTS[INSTALL]}"
fi
if [ "$verb" = "build-export" ]; then
comps="$comps ${OPTS[BUILD_EXPORT]}"
fi
if [ "$verb" = "repo-update" ]; then
comps="$comps ${OPTS[REPO_UPDATE]}"
fi
if [ "$verb" = "remote-add" ]; then
comps="$comps ${OPTS[ADD_REMOTE]}"
fi
if [ "$verb" = "remote-modify" ]; then
comps="$comps ${OPTS[MODIFY_REMOTE]}"
fi
else
case "$verb" in
remote-add|remote-modify|remote-delete|remote-ls)
comps=$(flatpak $mode remote-list)
;;
install)
if [[ $bundle == "true" ]]; then
comps=''
compopt -o filenames
else
if [[ -z $remote ]]; then
comps=$(flatpak $mode remote-list)
if [[ $mode == "--system" ]]; then
comps="$comps --user"
fi
elif [[ -z $name ]]; then
comps=$(flatpak remote-ls $mode $kind $remote)
else
comps='' # FIXME: branches
fi
fi
;;
remote-list|list)
comps=''
;;
update|uninstall)
if [[ -z $name ]]; then
comps=$(flatpak $mode $kind list)
else
comps='' # FIXME: branches
fi
;;
run|override)
# run doesn't take --user or --system, so don't use mode here
if [[ -z $name ]]; then
comps=$(flatpak list --app)
fi
;;
build-init)
if [[ -z $dir ]]; then
comps=''
compopt -o dirnames
elif [[ -z $sdk ]]; then
comps="$(flatpak list --runtime) $(flatpak --user list --runtime)"
elif [[ -z $name ]]; then
comps="$(flatpak list --runtime) $(flatpak --user list --runtime)"
else
comps='' # FIXME: branches
fi
;;
build)
if [[ -z $dir ]]; then
comps=''
compopt -o dirnames
elif [[ -z $cmd ]]; then
comps=''
compopt -o bashdefault
fi
;;
build-finish)
if [[ -z $dir ]]; then
comps=''
compopt -o dirnames
fi
;;
build-export)
if [[ -z $loc ]]; then
comps=''
compopt -o dirnames
elif [[ -z $dir ]]; then
comps=''
compopt -o dirnames
fi
;;
build-bundle)
if [[ -z $loc ]]; then
comps=''
compopt -o dirnames
elif [[ -z $file ]]; then
comps=''
compopt -o filenames
else
comps='' # FIXME: list apps/runtimes
fi
;;
build-update-repo)
if [[ -z $loc ]]; then
comps=''
compopt -o dirnames
fi
;;
export-file)
if [[ -z $file ]]; then
comps=''
compopt -o dirnames
fi
;;
esac
fi
COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
[[ $COMPREPLY == *= ]] && compopt -o nospace
return 0
}
complete -F _flatpak flatpak