From a91a3b2299e208d5d1ade672bb278a066458acf4 Mon Sep 17 00:00:00 2001 From: eximus Date: Wed, 5 Mar 2025 16:54:49 -0500 Subject: [PATCH] Add bash completion for services defined in ~/.pg_service.conf --- AUTHORS | 1 + changelog.rst | 1 + pgcli-completion.bash | 57 +++++++++++++++++++++++++++---------------- 3 files changed, 38 insertions(+), 21 deletions(-) diff --git a/AUTHORS b/AUTHORS index 4bbaba26c..97d972fbd 100644 --- a/AUTHORS +++ b/AUTHORS @@ -138,6 +138,7 @@ Contributors: * Mathieu Dupuy (deronnax) * Chris Novakovic * Josh Lynch (josh-lynch) + * Fabio (3ximus) Creator: -------- diff --git a/changelog.rst b/changelog.rst index 62c1faeaa..304251bda 100644 --- a/changelog.rst +++ b/changelog.rst @@ -5,6 +5,7 @@ Features -------- * Add a `--ping` command line option; allows pgcli to replace `pg_isready` * Changed the packaging metadata from setup.py to pyproject.toml +* Add bash completion for services defined in the service file `~/.pg_service.conf` Bug fixes: ---------- diff --git a/pgcli-completion.bash b/pgcli-completion.bash index 3549b5614..620563d27 100644 --- a/pgcli-completion.bash +++ b/pgcli-completion.bash @@ -3,9 +3,9 @@ _pg_databases() # -w was introduced in 8.4, https://launchpad.net/bugs/164772 # "Access privileges" in output may contain linefeeds, hence the NF > 1 COMPREPLY=( $( compgen -W "$( psql -AtqwlF $'\t' 2>/dev/null | \ - awk 'NF > 1 { print $1 }' )" -- "$cur" ) ) + awk 'NF > 1 { print $1 }' )" -- "$cur" ) ) } - + _pg_users() { # -w was introduced in 8.4, https://launchpad.net/bugs/164772 @@ -13,12 +13,23 @@ _pg_users() template1 2>/dev/null )" -- "$cur" ) ) [[ ${#COMPREPLY[@]} -eq 0 ]] && COMPREPLY=( $( compgen -u -- "$cur" ) ) } - + +_pg_services() +{ + # return list of available services + local services + if [[ -f "$HOME/.pg_service.conf" ]]; then + services=$(grep -oP '(?<=^\[).*?(?=\])' "$HOME/.pg_service.conf") + fi + local suffix="${cur#*=}" + COMPREPLY=( $(compgen -W "$services" -- "$suffix") ) +} + _pgcli() { local cur prev words cword _init_completion -s || return - + case $prev in -h|--host) _known_hosts_real "$cur" @@ -39,23 +50,27 @@ _pgcli() esac case "$cur" in - --*) - # return list of available options - COMPREPLY=( $( compgen -W '--host --port --user --password --no-password - --single-connection --version --dbname --pgclirc --dsn - --row-limit --help' -- "$cur" ) ) - [[ $COMPREPLY == *= ]] && compopt -o nospace - return 0 - ;; - -) - # only complete long options - compopt -o nospace - COMPREPLY=( -- ) - return 0 - ;; - *) + service=*) + _pg_services + return 0 + ;; + --*) + # return list of available options + COMPREPLY=( $( compgen -W '--host --port --user --password --no-password + --single-connection --version --dbname --pgclirc --dsn + --row-limit --help' -- "$cur" ) ) + [[ $COMPREPLY == *= ]] && compopt -o nospace + return 0 + ;; + -) + # only complete long options + compopt -o nospace + COMPREPLY=( -- ) + return 0 + ;; + *) # return list of available databases - _pg_databases + _pg_databases esac -} && +} && complete -F _pgcli pgcli