From 35fa43dadf532267fdbe94548c595caf79024723 Mon Sep 17 00:00:00 2001 From: Ben Grande Date: Sat, 6 Jul 2024 22:25:54 +0200 Subject: [PATCH] perf: make pre-commit hooks pass file extensions - shell-lint: faster evaluation of shell scripts, hook 40% faster; - *-lint: unify method to find the "find" utility; and - pre-commit: pass file extensions to lint tools. --- .pre-commit-config.yaml | 31 +++++++++++++------------ scripts/best-program.sh | 18 +++++++++++++++ scripts/markdown-lint.sh | 11 ++------- scripts/python-lint.sh | 10 ++------- scripts/qubesbuilder-gen.sh | 1 + scripts/salt-fix.sh | 12 +++------- scripts/salt-lint.sh | 11 ++------- scripts/shell-lint.sh | 45 ++++++++++++++----------------------- scripts/spec-build.sh | 3 +-- scripts/spec-get.sh | 2 +- scripts/unicode-prohibit.sh | 3 +-- 11 files changed, 65 insertions(+), 82 deletions(-) create mode 100755 scripts/best-program.sh diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index cb45260..b5c3140 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -14,19 +14,19 @@ repos: pass_filenames: true description: Prohibit Unicode - - id: reuse-lint - name: reuse-lint - entry: reuse - args: [lint] - language: python - pass_filenames: false - description: Lint files to comply with the REUSE Specification + - id: shell-lint + name: shell-lint + entry: scripts/shell-lint.sh + language: script + pass_filenames: true + description: Lint Shellscripts - id: markdown-lint name: markdown-lint entry: scripts/markdown-lint.sh language: script pass_filenames: true + files: \.md$ description: Lint markdown files - id: python-lint @@ -34,6 +34,7 @@ repos: entry: scripts/python-lint.sh language: script pass_filenames: true + files: \.py$ description: Lint python files - id: salt-lint @@ -41,15 +42,9 @@ repos: entry: scripts/salt-lint.sh language: script pass_filenames: true + files: \.(sls|top)$ description: Lint Salt files - - id: shell-lint - name: shell-lint - entry: scripts/shell-lint.sh - language: script - pass_filenames: true - description: Lint Shellscripts - - id: qubesbuilder-gen name: qubesbuilder-gen entry: scripts/qubesbuilder-gen.sh @@ -67,6 +62,14 @@ repos: # # pass_filenames: true # description: Check if RPM SPEC files are up to date + - id: reuse-lint + name: reuse-lint + entry: reuse + args: [lint] + language: python + pass_filenames: false + description: Lint files to comply with the REUSE Specification + - id: git-lint name: git-lint language: python diff --git a/scripts/best-program.sh b/scripts/best-program.sh new file mode 100755 index 0000000..7f2b6b5 --- /dev/null +++ b/scripts/best-program.sh @@ -0,0 +1,18 @@ +#!/bin/sh + +## SPDX-FileCopyrightText: 2024 Benjamin Grande M. S. +## +## SPDX-License-Identifier: AGPL-3.0-or-later + +# shellcheck disable=SC2086 +set -eu + +command -v git >/dev/null || { echo "Missing program: git" >&2; exit 1; } +cd "$(git rev-parse --show-toplevel)" || exit 1 + +for tool in "${@}"; do + if ./scripts/requires-program.sh "${tool}" >/dev/null 2>&1; then + echo "${tool}" + break + fi +done diff --git a/scripts/markdown-lint.sh b/scripts/markdown-lint.sh index 5edd537..92aae3e 100755 --- a/scripts/markdown-lint.sh +++ b/scripts/markdown-lint.sh @@ -7,19 +7,12 @@ # shellcheck disable=SC2086 set -eu -command -v git >/dev/null || - { printf "Missing program: git\n" >&2; exit 1; } +command -v git >/dev/null || { echo "Missing program: git" >&2; exit 1; } cd "$(git rev-parse --show-toplevel)" || exit 1 ./scripts/requires-program.sh mdl extra_files_rules="~MD002,~MD012,~MD022,~MD032,~MD041" - -find_tool="find" -if command -v fd; then - find_tool="fd" -elif command -v fdfind >/dev/null; then - find_tool="fdfind" -fi +find_tool="$(./scripts/best-program.sh fd fdfind find)" if test -n "${1-}"; then files="" diff --git a/scripts/python-lint.sh b/scripts/python-lint.sh index 5de7b88..05ffd6b 100755 --- a/scripts/python-lint.sh +++ b/scripts/python-lint.sh @@ -7,17 +7,11 @@ # shellcheck disable=SC2086 set -eu -command -v git >/dev/null || - { printf "Missing program: git\n" >&2; exit 1; } +command -v git >/dev/null || { echo "Missing program: git" >&2; exit 1; } cd "$(git rev-parse --show-toplevel)" || exit 1 ./scripts/requires-program.sh pylint -find_tool="find" -if command -v fd; then - find_tool="fd" -elif command -v fdfind >/dev/null; then - find_tool="fdfind" -fi +find_tool="$(./scripts/best-program.sh fd fdfind find)" if test -n "${1-}"; then files="" diff --git a/scripts/qubesbuilder-gen.sh b/scripts/qubesbuilder-gen.sh index 8cec170..ae99554 100755 --- a/scripts/qubesbuilder-gen.sh +++ b/scripts/qubesbuilder-gen.sh @@ -15,6 +15,7 @@ intended_target="${target}" if test "${1-}" = "test"; then tmpdir="$(mktemp -d)" target="${tmpdir}/.qubesbuilder" + # shellcheck disable=SC2154 trap 'ec="$?"; rm -rf -- "${tmpdir}"; exit "$ec"' EXIT INT HUP QUIT ABRT fi ignored="$(git ls-files --exclude-standard --others --ignored salt/)" diff --git a/scripts/salt-fix.sh b/scripts/salt-fix.sh index 0cb1da3..8be920f 100755 --- a/scripts/salt-fix.sh +++ b/scripts/salt-fix.sh @@ -1,6 +1,6 @@ #!/bin/sh -## SPDX-FileCopyrightText: 2013-2018 Will Thames will@thames.id.au +## SPDX-FileCopyrightText: 2013 - 2018 Will Thames will@thames.id.au ## SPDX-FileCopyrightText: 2018 Ansible by Red Hat ## SPDX-FileCopyrightText: 2020 - 2023 Warpnet B.V. ## SPDX-FileCopyrightText: 2023 Benjamin Grande M. S. @@ -12,16 +12,10 @@ # shellcheck disable=SC2086 set -eu -command -v git >/dev/null || - { printf "Missing program: git\n" >&2; exit 1; } +command -v git >/dev/null || { echo "Missing program: git" >&2; exit 1; } cd "$(git rev-parse --show-toplevel)" || exit 1 -find_tool="find" -if command -v fd; then - find_tool="fd" -elif command -v fdfind >/dev/null; then - find_tool="fdfind" -fi +find_tool="$(./scripts/best-program.sh fd fdfind find)" case "${find_tool}" in fd|fdfind) files="$(${find_tool} . minion.d/ --extension=conf) $(${find_tool} . salt/ --max-depth=2 --type=f --extension=sls)";; diff --git a/scripts/salt-lint.sh b/scripts/salt-lint.sh index c8fca7c..fa6e74b 100755 --- a/scripts/salt-lint.sh +++ b/scripts/salt-lint.sh @@ -7,22 +7,15 @@ # shellcheck disable=SC2086 set -eu -command -v git >/dev/null || - { printf "Missing program: git\n" >&2; exit 1; } +command -v git >/dev/null || { echo "Missing program: git" >&2; exit 1; } cd "$(git rev-parse --show-toplevel)" || exit 1 ./scripts/requires-program.sh salt-lint +find_tool="$(./scripts/best-program.sh fd fdfind find)" possible_conf="${PWD}/.salt-lint" conf="" test -f "${possible_conf}" && conf="-c ${possible_conf}" -find_tool="find" -if command -v fd; then - find_tool="fd" -elif command -v fdfind >/dev/null; then - find_tool="fdfind" -fi - if test -n "${1-}"; then files="" for f in "$@"; do diff --git a/scripts/shell-lint.sh b/scripts/shell-lint.sh index ab099c6..f9a52ba 100755 --- a/scripts/shell-lint.sh +++ b/scripts/shell-lint.sh @@ -1,7 +1,6 @@ #!/bin/sh -## SPDX-FileCopyrightText: 2018 Andreas Kusalananda -## SPDX-FileCopyrightText: 2023 Benjamin Grande M. S. +## SPDX-FileCopyrightText: 2023 - 2024 Benjamin Grande M. S. ## ## SPDX-License-Identifier: AGPL-3.0-or-later @@ -10,34 +9,27 @@ # shellcheck disable=SC2086 set -eu -command -v shellcheck >/dev/null || - { printf >&2 "Missing program: shellcheck\n"; exit 1; } -command -v file >/dev/null || - { printf >&2 "Missing program: file\n"; exit 1; } -command -v git >/dev/null || - { printf "Missing program: git\n" >&2; exit 1; } +command -v git >/dev/null || { echo "Missing program: git" >&2; exit 1; } cd "$(git rev-parse --show-toplevel)" || exit 1 +./scripts/requires-program.sh shellcheck file -if command -v fd; then - find_tool="fd" -elif command -v fdfind >/dev/null; then - find_tool="fdfind" -fi +find_tool="$(./scripts/best-program.sh fd fdfind find)" if test -n "${1-}"; then files="" sh_files="" for f in "$@"; do test -f "$f" || continue - if test "${f##*/}" = "rc.local"; then - sh_files="$sh_files $f" - continue - fi - case $( file -bi "$f" ) in - (*/x-shellscript*) files="$files $f";; + case "${f}" in + */zsh/*) continue;; + *.yml|*.yaml|*.vim|*.sls|*.top|*.toml|*.timer|*.service|*.socket| \ + *.spec|*/config|*.txt|*/version|*.sources|*.asc|*.repo) continue;; + */rc.local) sh_files="$sh_files $f"; continue;; + *) files="$files $f" esac done - if test -n "$files" || test -n "$sh_files"; then + files="$(file $files | awk -F ":" '/ shell script,/{ print $1 }')" + if test -z "$files" && test -z "$sh_files"; then exit 0 fi test -z "$files" || shellcheck ${files} @@ -49,16 +41,13 @@ case "${find_tool}" in fd|fdfind) # shellcheck disable=2016,2215 files="$(${find_tool} . scripts/ salt/ --hidden --exclude=zsh --type=f \ - --exec sh -c ' - case $( file -bi "$1" ) in (*/x-shellscript*) - printf "%s\n" "$1";; esac' sh)" + --exec-batch file | awk -F ":" '/ shell script,/{ print $1 }')" ## No Shebang sh_files="$(${find_tool} rc.local salt/ --type=f)" ;; find) - files="$(find scripts/ salt/ -not \( -path "*/zsh" -prune \) -type f -exec sh -c ' - case $( file -bi "$1" ) in (*/x-shellscript*) exit 0;; esac - exit 1' sh {} \; -print)" + files="$(find scripts/ salt/ -not \( -path "*/zsh" -prune \) -type f \ + -exec file {} \+ | awk -F ":" '/ shell script,/{ print $1 }')" ## No Shebang sh_files="$(find salt/ -type f -name "rc.local")" ;; @@ -66,5 +55,5 @@ esac files="$(echo "$files" | sort -u)" sh_files="$(echo "$sh_files" | sort -u)" -shellcheck ${files} -shellcheck -s sh ${sh_files} +test -z "${files}" || shellcheck ${files} +test -z "${sh_files}" || shellcheck -s sh ${sh_files} diff --git a/scripts/spec-build.sh b/scripts/spec-build.sh index a3e4422..4804176 100755 --- a/scripts/spec-build.sh +++ b/scripts/spec-build.sh @@ -16,7 +16,6 @@ build_rpm(){ project="${1}" group="$(${spec_get} "${project}" group)" version="$(${spec_get} "${project}" version)" - license_csv="$(${spec_get} "${project}" license_csv)" spec="rpm_spec/${group}-${project}.spec" "${spec_gen}" "${project}" @@ -52,7 +51,7 @@ build_rpm(){ tmp_file="${dbpath}/${key_id}.asc" "${gpg}" --export --armor "${key_id}" | tee "${tmp_file}" >/dev/null rpmkeys --dbpath="${dbpath}" --import "${tmp_file}" - ## TODO: target only the latest relase + ## TODO: target only the latest release rpmkeys --dbpath="${dbpath}" --checksig --verbose \ -- "${rpm_basename}"*"${rpm_suffix}" fi diff --git a/scripts/spec-get.sh b/scripts/spec-get.sh index 951d0fd..1026b5b 100755 --- a/scripts/spec-get.sh +++ b/scripts/spec-get.sh @@ -41,7 +41,7 @@ case "${1-}" in *) key="${1}"; shift;; esac if test -z "${key##* }"; then - echo "Key is emtpy: ${key}" >&2 + echo "Key is empty: ${key}" >&2 exit 1 fi diff --git a/scripts/unicode-prohibit.sh b/scripts/unicode-prohibit.sh index 6dbed6f..e238706 100755 --- a/scripts/unicode-prohibit.sh +++ b/scripts/unicode-prohibit.sh @@ -8,8 +8,7 @@ set -eu -command -v git >/dev/null || - { printf "Missing program: git\n" >&2; exit 1; } +command -v git >/dev/null || { echo "Missing program: git" >&2; exit 1; } cd "$(git rev-parse --show-toplevel)" || exit 1 files=""