# centpkg bash completion _centpkg() { COMPREPLY=() in_array() { local i for i in $2; do [[ $i = $1 ]] && return 0 done return 1 } _filedir_exclude_paths() { _filedir "$@" for ((i=0; i<=${#COMPREPLY[@]}; i++)); do [[ ${COMPREPLY[$i]} =~ /?\.git/? ]] && unset COMPREPLY[$i] done } local cur prev _get_comp_words_by_ref cur prev # global options local options="--help -v -q" local options_value="--dist --release --user --path --user-config --name --namespace" local commands="build chain-build ci clean clog clone co commit compile \ container-build diff gimmespec giturl help gitbuildhash import install lint \ local mockbuild mock-config module-build module-build-cancel \ module-build-local module-build-info module-build-watch module-overview \ module-scratch-build \ new new-sources patch prep pull push retire request-branch request-repo \ request-tests-repo request-side-tag list-side-tags remove-side-tag \ scratch-build sources srpm switch-branch tag unused-patches update upload \ verify-files verrel override fork" # parse main options and get command local command= local command_first= local path= local i w for (( i = 0; i < ${#COMP_WORDS[*]} - 1; i++ )); do w="${COMP_WORDS[$i]}" # option if [[ ${w:0:1} = - ]]; then if in_array "$w" "$options_value"; then ((i++)) [[ "$w" = --path ]] && path="${COMP_WORDS[$i]}" fi # command elif in_array "$w" "$commands"; then command="$w" command_first=$((i+1)) break fi done # complete base options if [[ -z $command ]]; then if [[ $cur == -* ]]; then COMPREPLY=( $(compgen -W "$options $options_value" -- "$cur") ) return 0 fi case "$prev" in --dist | --release | --user | -u | --config) ;; --path) _filedir_exclude_paths ;; --namespace) COMPREPLY=( $(compgen -W "$(_centpkg_namespaces)" -- "$cur") ) ;; *) COMPREPLY=( $(compgen -W "$commands" -- "$cur") ) ;; esac return 0 fi # parse command specific options local options= local options_target= options_arches= options_branch= options_string= options_file= options_dir= options_srpm= options_mroot= options_builder= options_namespace= local options_update_type= options_update_request= local options_yaml= local after= after_more= case $command in help|gimmespec|gitbuildhash|giturl|new|push|unused-patches|verrel) ;; build) options="--nowait --background --skip-tag --scratch --skip-remote-rules-validation --fail-fast" options_arches="--arches" options_srpm="--srpm" options_target="--target" ;; chain-build) options="--nowait --background" options_target="--target" after="package" after_more=true ;; clean) options="--dry-run -x" ;; clog) options="--raw" ;; clone|co) options="--branches --anonymous" options_branch="-b" after="package" ;; commit|ci) options="--push --clog --raw --tag --with-changelog" options_string="--message" options_file="--file" after="file" after_more=true ;; compile|install) options="--short-circuit" options_arches="--arch" options_dir="--builddir" ;; container-build) options="--scratch --nowait --repo-url --skip-remote-rules-validation" options_arches="--arches" options_target="--target" ;; diff) options="--cached" after="file" after_more=true ;; import) options="--create" options_branch="--branch" after="srpm" ;; lint) options="--info" options_file="--rpmlintconf" ;; list-side-tags) options="--mine" options_string="--user --base-tag" ;; local) options="--md5" options_arches="--arch" options_string="--with --without" options_dir="--builddir" ;; mock-config) options="--target" options_arches="--arch" ;; mockbuild) options="--md5 --no-clean --no-cleanup-after --no-clean-all --shell" options_string="--with --without" options_mroot="--root --mock-config" ;; module-build) options="--scratch --watch" options_string="--optional --requires --buildrequires" options_yaml="--file" options_srpm="--srpm" ;; module-build-local) options="--skip-tests" options_string="--add-local-build --stream --set-default-stream" options_yaml="--file" options_srpm="--srpm" ;; module-overview) options="--unfinished" options_string="--limit" ;; module-scratch-build) options="--watch" options_string="--optional --requires --buildrequires" options_yaml="--file" options_srpm="--srpm" ;; patch) options="--rediff" options_string="--suffix" ;; prep|verify-files) options_arches="--arch" options_dir="--builddir" ;; pull) options="--rebase --no-rebase" ;; remove-side-tag) after_more=true ;; retire) after_more=true ;; request-branch) options="--no-git-branch --all-releases --no-auto-module" options_string="--sl --repo" ;; request-repo) options="--exception --no-initial-commit" options_string="--description --monitor --upstreamurl --summary" options_namespace="--namespace" ;; request-tests-repo) options_string="--bug" ;; request-side-tag) options_string="--base-tag" ;; scratch-build) options="--nowait --background" options_target="--target" options_arches="--arches" options_srpm="--srpm" ;; sources) options_dir="--outdir" ;; srpm) options="--md5" ;; switch-branch) options="--list" after="branch" ;; tag) options="--clog --raw --force --list --delete" options_string="--message" options_file="--file" after_more=true ;; upload|new-sources) after="file" after_more=true ;; update) options="--not-close-bugs --suggest-reboot --disable-autokarma" options_string="--notes --bugs --stable-karma --unstable-karma" options_update_type="--type" options_update_request="--request" ;; esac local all_options="--help $options" local all_options_value="$options_target $options_arches $options_branch \ $options_string $options_file $options_dir $options_srpm $options_mroot \ $options_builder $options_namespace $options_update_type $options_update_request \ $options_yaml" # count non-option parameters local i w local last_option= local after_counter=0 for (( i = $command_first; i < ${#COMP_WORDS[*]} - 1; i++)); do w="${COMP_WORDS[$i]}" if [[ ${w:0:1} = - ]]; then if in_array "$w" "$all_options"; then last_option="$w" continue elif in_array "$w" "$all_options_value"; then last_option="$w" ((i++)) continue fi fi in_array "$last_option" "$options_arches" || ((after_counter++)) done # completion if [[ -n $options_target ]] && in_array "$prev" "$options_target"; then COMPREPLY=( $(compgen -W "$(_centpkg_target)" -- "$cur") ) elif [[ -n $options_arches ]] && in_array "$last_option" "$options_arches"; then COMPREPLY=( $(compgen -W "$(_centpkg_arch) $all_options" -- "$cur") ) elif [[ -n $options_srpm ]] && in_array "$prev" "$options_srpm"; then _filedir_exclude_paths "*.src.rpm" elif [[ -n $options_yaml ]] && in_array "$prev" "$options_yaml"; then _filedir_exclude_paths "yaml" elif [[ -n $options_branch ]] && in_array "$prev" "$options_branch"; then COMPREPLY=( $(compgen -W "$(_centpkg_branch "$path")" -- "$cur") ) elif [[ -n $options_file ]] && in_array "$prev" "$options_file"; then _filedir_exclude_paths elif [[ -n $options_dir ]] && in_array "$prev" "$options_dir"; then _filedir_exclude_paths -d elif [[ -n $options_string ]] && in_array "$prev" "$options_string"; then COMPREPLY=( ) elif [[ -n $options_mroot ]] && in_array "$prev" "$options_mroot"; then COMPREPLY=( ) if declare -F _mock_root &>/dev/null; then _mock_root elif declare -F _xfunc &>/dev/null; then _xfunc mock _mock_root fi elif [[ -n $options_namespace ]] && in_array "$prev" "$options_namespace"; then COMPREPLY=( $(compgen -W "$(_centpkg_namespaces)" -- "$cur") ) elif [[ -n $options_update_type ]] && in_array "$prev" "$options_update_type"; then COMPREPLY=( $(compgen -W "bugfix security enhancement newpackage" -- "$cur") ) elif [[ -n $options_update_request ]] && in_array "$prev" "$options_update_request"; then COMPREPLY=( $(compgen -W "testing stable" -- "$cur") ) else local after_options= if [[ $after_counter -eq 0 ]] || [[ $after_more = true ]]; then case $after in file) _filedir_exclude_paths ;; srpm) _filedir_exclude_paths "*.src.rpm" ;; branch) after_options="$(_centpkg_branch "$path")" ;; package) after_options="$(_centpkg_package "$cur")";; esac fi if [[ $cur != -* ]]; then all_options= all_options_value= fi COMPREPLY+=( $(compgen -W "$all_options $all_options_value $after_options" -- "$cur" ) ) fi return 0 } && complete -F _centpkg centpkg _centpkg_target() { koji list-targets --quiet 2>/dev/null | cut -d" " -f1 } _centpkg_arch() { echo "i386 i686 x86_64 armv5tel armv7hl armv7hnl ppc ppc64 ppc64le ppc64p7 s390 s390x" } _centpkg_branch() { local git_options= format="--format %(refname:short)" [[ -n $1 ]] && git_options="--git-dir=$1/.git" git $git_options for-each-ref $format 'refs/remotes' | sed 's,.*/,,' git $git_options for-each-ref $format 'refs/heads' } _centpkg_package() { repoquery -C --qf=%{sourcerpm} "$1*" 2>/dev/null | sort -u | sed -r 's/(-[^-]*){2}\.src\.rpm$//' } _centpkg_namespaces() { grep "^distgit_namespaces =" /etc/rpkg/centpkg.conf | cut -d'=' -f2 } # 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