diff options
Diffstat (limited to 'test/runLint')
-rwxr-xr-x | test/runLint | 51 |
1 files changed, 36 insertions, 15 deletions
diff --git a/test/runLint b/test/runLint index 95c3887..550995d 100755 --- a/test/runLint +++ b/test/runLint @@ -1,51 +1,72 @@ -#!/bin/bash -u +#!/usr/bin/env bash +set -u gitgrep() { local out=$(git grep -I -P -n "$1" | grep -E '^(bash_completion|completions/|test/)' | grep -Ev "^test/runLint\>${filter_out:+|$filter_out}") - if [ -n "$out" ]; then + if [[ $out ]]; then printf '***** %s\n' "$2" printf '%s\n\n' "$out" fi } -unset CDPATH -cd $(dirname "$0")/.. +unset -v CDPATH +if ! cd "$(dirname "$0")/.."; then + echo 'test/runLint: failed to cd into the working tree of bash-completion' >&2 + exit 1 +fi -cmdstart='(^|[[:space:]]|\()' +cmdstart='(^|[[:space:];&|]|\()' filter_out= -gitgrep $cmdstart"awk\b.*-F([[:space:]]|[[:space:]]*[\"'][^\"']{2,})" \ - 'awk with -F char or -F ERE, use -Fchar instead (Solaris)' +# Note: Since we started to use _comp_awk, we do not have care about the small +# feature set of Solaris awk anymore. -gitgrep $cmdstart"awk\b.*\[:[a-z]*:\]" \ - 'awk with POSIX character class not supported in mawk (Debian/Ubuntu)' +gitgrep "${cmdstart}(_comp_)?awk\b.*\[:[a-z]*:\]" \ + 'awk with POSIX character class not supported in mawk-1.3.3-20090705 (Debian/Ubuntu)' -gitgrep $cmdstart'sed\b.*\\[?+]' \ +gitgrep "$cmdstart"'sed\b.*\\[?+]' \ 'sed with ? or +, use POSIX BRE instead (\{m,n\})' -gitgrep $cmdstart'sed\b.*\\\|' \ +gitgrep "$cmdstart"'sed\b.*\\\|' \ "sed with \|, use POSIX BRE (possibly multiple sed invocations) or another tool instead" # TODO: really nonportable? appears to work fine in Linux, FreeBSD, Solaris #gitgrep $cmdstart'sed\b.*;' \ # 'sed with ;, use multiple -e options instead (POSIX?) (false positives?)' -gitgrep $cmdstart'sed\b.*[[:space:]]-[^[:space:]]*[rE]' \ +gitgrep "$cmdstart"'sed\b.*[[:space:]]-[^[:space:]]*[rE]' \ 'sed with -r or -E, drop and use POSIX BRE instead' -gitgrep $cmdstart'[ef]grep\b' \ +gitgrep "$cmdstart"'[ef]grep\b' \ '[ef]grep, use grep -[EF] instead (historical/deprecated)' # TODO: $ in sed subexpression used as an anchor (POSIX BRE optional, not in # Solaris/FreeBSD) -gitgrep '(?<!command)'$cmdstart'(grep|ls|sed)(\s|$)' \ - 'invoke grep, ls, and sed through "command", e.g. "command grep"' +gitgrep '(?<!command)'"$cmdstart"'(grep|ls|sed|cd)(\s|$)' \ + 'invoke grep, ls, sed, and cd through "command", e.g. "command grep"' + +gitgrep '(?<!command)'"$cmdstart"'awk(\s|$)' \ + 'invoke awk through "_comp_awk"' + +#------------------------------------------------------------------------------ +# Bash pitfalls/styles/compatibilities (which are not detected by shellcheck) gitgrep '<<<' 'herestrings use temp files, use some other way' filter_out='^(test/|bash_completion\.sh)' gitgrep ' \[ ' \ 'use [[ ]] instead of [ ]' + +gitgrep "$cmdstart"'unset [^-]' 'Explicitly specify "unset -v/-f"' + +gitgrep "$cmdstart"'((set|shopt)\s+[+-][a-z]+\s+posix\b|(local\s+)?POSIXLY_CORRECT\b)' \ + 'fiddling with posix mode breaks keybindings with some bash versions' + +gitgrep '\$\{([^{}\n]|\{.*\})+/([^{}\n]|\{.*\})+/([^{}"\n]|\{.*\})*\$.*\}' \ + '$rep of ${var/pat/$rep} needs to be double-quoted for shopt -s patsub_replacement (bash >= 5.2) [see Sec. of patsub_replacement in doc/styleguide.md]' + +gitgrep '"([^"\n]|\\.)*\$\{([^{}\n]|\{.*\})+/([^{}\n]|\{.*\})+/([^{}"\n]|\{.*\})*"([^{}"\n]|\{.*\})*\$.*\}' \ + '$rep of "${var/pat/"$rep"}" should not be quoted for bash-4.2 or shopt -s compat42 (bash >= 4.3) [see Sec. of patsub_replacement in doc/styleguide.md]' |