Add checks for common mistakes when installing bash completion files:
legacy directory, incorrect naming, missing aliases, deprecated 'have'
function.

Changes in v2:

- silenced output (error) when sourcing completion files,

- faked _have() to enable all conditional completions in the tested
  files.

Changes in v3:

- missing EPREFIX.
---
 bin/misc-functions.sh | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 124 insertions(+)

diff --git a/bin/misc-functions.sh b/bin/misc-functions.sh
index e45d810..f6c3c1c 100755
--- a/bin/misc-functions.sh
+++ b/bin/misc-functions.sh
@@ -610,6 +610,130 @@ install_qa_check() {
                fi
        fi
 
+       # Check for correct bash-completion install path.
+       local syscompdir=$(pkg-config --variable=completionsdir bash-completion 
2>/dev/null)
+       : ${syscompdir:=${EPREFIX}/usr/share/bash-completion/completions}
+
+       local instcompdir
+       if [[ -d ${ED}/usr/share/bash-completion/completions ]]; then
+               instcompdir=${ED}/usr/share/bash-completion/completions
+       elif [[ -d ${ED}/usr/share/bash-completion ]]; then
+               if [[ ${syscompdir} != ${EPREFIX}/usr/share/bash-completion ]]; 
then
+                       eqawarn "Bash completions were installed in legacy 
location. Please update"
+                       eqawarn "the ebuild to get the install paths using 
bash-completion-r1.eclass."
+                       eqawarn
+               fi
+
+               instcompdir=${ED}/usr/share/bash-completion
+       fi
+
+       # Do a few QA tests on bash completions.
+       if [[ -n ${instcompdir} && -f 
${EROOT}/usr/share/bash-completion/bash_completion ]]; then
+               (
+                       _get_completions() {
+                               # source the file
+                               source "${1}" &>/dev/null
+
+                               [[ ${USED_HAVE} == yes ]] && echo 
'__HAVE_USED__'
+
+                               # print the completed commands
+                               while read -a args; do
+                                       [[ ${args[0]} == complete ]] || continue
+                                       # command always comes last, one per 
line
+                                       echo "${args[$(( ${#args[@]} - 1))]}"
+                               done < <(complete -p)
+                       }
+
+                       # load the global helpers
+                       source 
"${EROOT}"/usr/share/bash-completion/bash_completion
+
+                       # clean up predefined completions
+                       complete -r
+
+                       # force all completions on
+                       _have() {
+                               return 0
+                       }
+
+                       local USED_HAVE=no
+                       # add a replacement for have()
+                       have() {
+                               USED_HAVE=yes
+
+                               unset -v have
+                               _have ${1} && have=yes
+                       }
+
+                       local f c completions
+                       local all_compls=()
+                       local all_files=()
+                       local qa_warnings=()
+
+                       for f in "${instcompdir}"/*; do
+                               # ignore directories and other non-files
+                               [[ ! -f ${f} ]] && continue
+
+                               # skip the common code file
+                               # (in case we're run in 
/usr/share/bash-completion)
+                               [[ ${f##*/} == bash_completion ]] && continue
+
+                               completions=( $(_get_completions "${f}") )
+
+                               if [[ ${completions[0]} == __HAVE_USED__ ]]; 
then
+                                       qa_warnings+=(
+                                               "${f##*/}: 'have' command is 
deprecated and must not be used."
+                                       )
+                                       unset 'completions[0]'
+                               fi
+
+                               if [[ -z ${completions[@]} ]]; then
+                                       qa_warnings+=(
+                                               "${f##*/}: does not define any 
completions (failed to source?)."
+                                       )
+                                       continue
+                               fi
+
+                               for c in "${completions[@]}"; do
+                                       if [[ ${c} == /* ]]; then
+                                               qa_warnings+=(
+                                                       "${f##*/}: absolute 
paths can not be used for completions (on '${c}')."
+                                               )
+                                       else
+                                               all_compls+=( "${c}" )
+                                       fi
+                               done
+
+                               if ! has "${f##*/}" "${all_compls[@]}"; then
+                                       qa_warnings+=(
+                                               "${f##*/}: incorrect name, no 
completions for '${f##*/}' command defined."
+                                       )
+                               fi
+
+                               all_files+=( "${f##*/}" )
+                       done
+
+                       for c in "${all_compls[@]}"; do
+                               if ! has "${c}" "${all_files[@]}"; then
+                                       qa_warnings+=(
+                                               "${c}: missing alias (symlink) 
for completed command."
+                                       )
+                               fi
+                       done
+
+                       if [[ -n ${qa_warnings[@]} ]]; then
+                               eqawarn "Problems with installed bash 
completions were found:"
+                               eqawarn
+                               for c in "${qa_warnings[@]}"; do
+                                       eqawarn "       ${c}"
+                               done
+                               eqawarn
+                               eqawarn "For more details on installing 
bash-completions, please see:"
+                               eqawarn 
"https://wiki.gentoo.org/wiki/Bash/Installing_completion_files";
+                               eqawarn
+                       fi
+               )
+       fi
+
        # Look for leaking LDFLAGS into pkg-config files
        f=$(egrep -sH '^Libs.*-Wl,(-O[012]|--hash-style)' 
"${ED}"/usr/*/pkgconfig/*.pc)
        if [[ -n ${f} ]] ; then
-- 
2.1.0


Reply via email to