From 3b6fd3c1dea070cb1882b8810e18a45158a356f2 Mon Sep 17 00:00:00 2001 From: Frantisek Sumsal Date: Tue, 20 Apr 2021 13:02:02 +0200 Subject: [PATCH] tools: shellcheck-ify most of the tool scripts --- tools/add-git-hook.sh | 4 ++-- tools/check-api-docs.sh | 15 ++++++++------- tools/check-directives.sh | 1 + tools/check-help.sh | 31 +++++++++++++++++++++---------- tools/find-build-dir.sh | 14 +++++++------- tools/find-double-newline.sh | 20 +++++++++++--------- tools/find-tabs.sh | 20 +++++++++++--------- tools/meson-apply-m4.sh | 20 ++++++++------------ tools/meson-make-symlink.sh | 11 +++++++---- tools/meson-vcs-tag.sh | 4 ++-- tools/update-hwdb-autosuspend.sh | 2 +- tools/update-hwdb.sh | 4 ++-- tools/update-syscall-tables.sh | 4 ++-- 13 files changed, 83 insertions(+), 67 deletions(-) diff --git a/tools/add-git-hook.sh b/tools/add-git-hook.sh index 66bbcd64ead..8cff62e864d 100755 --- a/tools/add-git-hook.sh +++ b/tools/add-git-hook.sh @@ -2,9 +2,9 @@ # SPDX-License-Identifier: LGPL-2.1-or-later set -eu -cd "$MESON_SOURCE_ROOT" +cd "${MESON_SOURCE_ROOT:?}" -if [ ! -f .git/hooks/pre-commit.sample -o -f .git/hooks/pre-commit ]; then +if [ ! -f .git/hooks/pre-commit.sample ] || [ -f .git/hooks/pre-commit ]; then exit 2 # not needed fi diff --git a/tools/check-api-docs.sh b/tools/check-api-docs.sh index 283e7a64d74..0bf053b5ffb 100755 --- a/tools/check-api-docs.sh +++ b/tools/check-api-docs.sh @@ -1,31 +1,32 @@ -#!/bin/sh +#!/bin/bash # SPDX-License-Identifier: LGPL-2.1-or-later set -eu +set -o pipefail sd_good=0 sd_total=0 udev_good=0 udev_total=0 -deprecated=" +deprecated=( -e sd_bus_try_close -e sd_bus_process_priority -e sd_bus_message_get_priority -e sd_bus_message_set_priority -e sd_seat_can_multi_session -e sd_journal_open_container -" +) -for symbol in `nm -g --defined-only "$@" | grep " T " | cut -d" " -f3 | grep -wv $deprecated | sort -u` ; do - if test -f ${MESON_BUILD_ROOT}/man/$symbol.3 ; then +for symbol in $(nm -g --defined-only "$@" | grep " T " | cut -d" " -f3 | grep -wv "${deprecated[@]}" | sort -u); do + if test -f "${MESON_BUILD_ROOT:?}/man/$symbol.3"; then echo "✓ Symbol $symbol() is documented." good=1 else - printf " \x1b[1;31mSymbol $symbol() lacks documentation.\x1b[0m\n" + echo -e " \x1b[1;31mSymbol $symbol() lacks documentation.\x1b[0m" good=0 fi - case $symbol in + case "$symbol" in sd_*) ((sd_good+=good)) ((sd_total+=1)) diff --git a/tools/check-directives.sh b/tools/check-directives.sh index 2274d36e601..0661da4d3b2 100755 --- a/tools/check-directives.sh +++ b/tools/check-directives.sh @@ -1,6 +1,7 @@ #!/usr/bin/env bash # SPDX-License-Identifier: LGPL-2.1-or-later set -eu +set -o pipefail SOURCE_ROOT="${1:?Missing argument: project source root}" BUILD_ROOT="${2:?Missing argument: project build root}" diff --git a/tools/check-help.sh b/tools/check-help.sh index 721dec4c64f..8e7d236dd90 100755 --- a/tools/check-help.sh +++ b/tools/check-help.sh @@ -1,30 +1,41 @@ -#!/bin/sh +#!/bin/bash # SPDX-License-Identifier: LGPL-2.1-or-later set -eu +set -o pipefail +# Note: `grep ... >/dev/null` instead of just `grep -q` is used intentionally +# here, since `grep -q` exits on the first match causing SIGPIPE being +# sent to the sender. + +BINARY="${1:?}" export SYSTEMD_LOG_LEVEL=info +if [[ ! -x "$BINARY" ]]; then + echo "$BINARY is not an executable" + exit 1 +fi + # output width -if "$1" --help | grep -v 'default:' | grep -E -q '.{80}.'; then - echo "$(basename "$1") --help output is too wide:" - "$1" --help | awk 'length > 80' | grep -E --color=yes '.{80}' +if "$BINARY" --help | grep -v 'default:' | grep -E '.{80}.' >/dev/null; then + echo "$(basename "$BINARY") --help output is too wide:" + "$BINARY" --help | awk 'length > 80' | grep -E --color=yes '.{80}' exit 1 fi # --help prints something. Also catches case where args are ignored. -if ! "$1" --help | grep -q .; then - echo "$(basename "$1") --help output is empty." +if ! "$BINARY" --help | grep . >/dev/null; then + echo "$(basename "$BINARY") --help output is empty." exit 2 fi # no --help output to stdout -if "$1" --help 2>&1 1>/dev/null | grep .; then - echo "$(basename "$1") --help prints to stderr" +if "$BINARY" --help 2>&1 1>/dev/null | grep .; then + echo "$(basename "$BINARY") --help prints to stderr" exit 3 fi # error output to stderr -if ! "$1" --no-such-parameter 2>&1 1>/dev/null | grep -q .; then - echo "$(basename "$1") with an unknown parameter does not print to stderr" +if ! ("$BINARY" --no-such-parameter 2>&1 1>/dev/null || :) | grep . >/dev/null; then + echo "$(basename "$BINARY") with an unknown parameter does not print to stderr" exit 4 fi diff --git a/tools/find-build-dir.sh b/tools/find-build-dir.sh index e449b6e8650..79a79fcc58e 100755 --- a/tools/find-build-dir.sh +++ b/tools/find-build-dir.sh @@ -1,12 +1,12 @@ #!/bin/sh # SPDX-License-Identifier: LGPL-2.1-or-later -set -e +set -eu # Try to guess the build directory: # we look for subdirectories of the parent directory that look like ninja build dirs. -if [ -n "$BUILD_DIR" ]; then - echo "$(realpath "$BUILD_DIR")" +if [ -n "${BUILD_DIR:=}" ]; then + realpath "$BUILD_DIR" exit 0 fi @@ -14,20 +14,20 @@ root="$(dirname "$(realpath "$0")")" found= for i in "$root"/../*/build.ninja; do - c="$(dirname $i)" + c="$(dirname "$i")" [ -d "$c" ] || continue [ "$(basename "$c")" != mkosi.builddir ] || continue if [ -n "$found" ]; then - echo 'Found multiple candidates, specify build directory with $BUILD_DIR' >&2 + echo "Found multiple candidates, specify build directory with \$BUILD_DIR" >&2 exit 2 fi found="$c" done if [ -z "$found" ]; then - echo 'Specify build directory with $BUILD_DIR' >&2 + echo "Specify build directory with \$BUILD_DIR" >&2 exit 1 fi -echo "$(realpath $found)" +realpath "$found" diff --git a/tools/find-double-newline.sh b/tools/find-double-newline.sh index 7ea6de83111..2999a58c0b9 100755 --- a/tools/find-double-newline.sh +++ b/tools/find-double-newline.sh @@ -1,38 +1,40 @@ #!/bin/sh # SPDX-License-Identifier: LGPL-2.1-or-later -TOP=`git rev-parse --show-toplevel` +set -eu -case "$1" in +TOP="$(git rev-parse --show-toplevel)" + +case "${1:-}" in recdiff) - if [ "$2" = "" ] ; then + if [ "${2:-}" = "" ] ; then DIR="$TOP" else DIR="$2" fi - find $DIR -type f \( -name '*.[ch]' -o -name '*.xml' \) -exec $0 diff \{\} \; + find "$DIR" -type f \( -name '*.[ch]' -o -name '*.xml' \) -exec "$0" diff \{\} \; ;; recpatch) - if [ "$2" = "" ] ; then + if [ "${2:-}" = "" ] ; then DIR="$TOP" else DIR="$2" fi - find $DIR -type f \( -name '*.[ch]' -o -name '*.xml' \) -exec $0 patch \{\} \; + find "$DIR" -type f \( -name '*.[ch]' -o -name '*.xml' \) -exec "$0" patch \{\} \; ;; diff) - T=`mktemp` - sed '/^$/N;/^\n$/D' < "$2" > "$T" + T="$(mktemp)" + sed '/^$/N;/^\n$/D' <"${2:?}" >"$T" diff -u "$2" "$T" rm -f "$T" ;; patch) - sed -i '/^$/N;/^\n$/D' "$2" + sed -i '/^$/N;/^\n$/D' "${2:?}" ;; *) diff --git a/tools/find-tabs.sh b/tools/find-tabs.sh index 54d922975c3..6cea339ac62 100755 --- a/tools/find-tabs.sh +++ b/tools/find-tabs.sh @@ -1,38 +1,40 @@ #!/bin/sh # SPDX-License-Identifier: LGPL-2.1-or-later -TOP=`git rev-parse --show-toplevel` +set -eu -case "$1" in +TOP="$(git rev-parse --show-toplevel)" + +case "${1:-}" in recdiff) - if [ "$2" = "" ] ; then + if [ "${2:-}" = "" ] ; then DIR="$TOP" else DIR="$2" fi - find $DIR -type f \( -name '*.[ch]' -o -name '*.xml' \) -exec $0 diff \{\} \; + find "$DIR" -type f \( -name '*.[ch]' -o -name '*.xml' \) -exec "$0" diff \{\} \; ;; recpatch) - if [ "$2" = "" ] ; then + if [ "${2:-}" = "" ] ; then DIR="$TOP" else DIR="$2" fi - find $DIR -type f \( -name '*.[ch]' -o -name '*.xml' \) -exec $0 patch \{\} \; + find "$DIR" -type f \( -name '*.[ch]' -o -name '*.xml' \) -exec "$0" patch \{\} \; ;; diff) - T=`mktemp` - sed 's/\t/ /g' < "$2" > "$T" + T="$(mktemp)" + sed 's/\t/ /g' <"${2:?}" >"$T" diff -u "$2" "$T" rm -f "$T" ;; patch) - sed -i 's/\t/ /g' "$2" + sed -i 's/\t/ /g' "${2:?}" ;; *) diff --git a/tools/meson-apply-m4.sh b/tools/meson-apply-m4.sh index 7b4801ff946..35d8d159ef3 100755 --- a/tools/meson-apply-m4.sh +++ b/tools/meson-apply-m4.sh @@ -1,25 +1,21 @@ -#!/bin/sh +#!/bin/bash # SPDX-License-Identifier: LGPL-2.1-or-later set -eu -CONFIG=$1 -TARGET=$2 +CONFIG="${1:?Missing path to config.h}" +TARGET="${2:?Missing target m4 file}" -if [ $# -ne 2 ]; then - echo 'Invalid number of arguments.' - exit 1 -fi - -if [ ! -f $CONFIG ]; then +if [ ! -f "$CONFIG" ]; then echo "$CONFIG not found." exit 2 fi -if [ ! -f $TARGET ]; then +if [ ! -f "$TARGET" ]; then echo "$TARGET not found." exit 3 fi -DEFINES=$(awk '$1 == "#define" && $3 == "1" { printf "-D%s ", $2 }' $CONFIG) +DEFINES=() +mapfile -t DEFINES < <(awk '$1 == "#define" && $3 == "1" { printf "-D%s\n", $2 }' "$CONFIG") -m4 -P $DEFINES $TARGET +m4 -P "${DEFINES[@]}" "$TARGET" diff --git a/tools/meson-make-symlink.sh b/tools/meson-make-symlink.sh index 96f58922810..653a73b0bd4 100755 --- a/tools/meson-make-symlink.sh +++ b/tools/meson-make-symlink.sh @@ -2,6 +2,9 @@ # SPDX-License-Identifier: LGPL-2.1-or-later set -eu +SOURCE="${1:?}" +TARGET="${2:?}" + if [ "${MESON_INSTALL_QUIET:-0}" = 1 ] ; then VERBOSE="" else @@ -11,9 +14,9 @@ fi # this is needed mostly because $DESTDIR is provided as a variable, # and we need to create the target directory... -mkdir -${VERBOSE}p "$(dirname "${DESTDIR:-}$2")" -if [ "$(dirname $1)" = . -o "$(dirname $1)" = .. ]; then - ln -${VERBOSE}fs -T -- "$1" "${DESTDIR:-}$2" +mkdir -${VERBOSE}p "$(dirname "${DESTDIR:-}$TARGET")" +if [ "$(dirname "$SOURCE")" = . ] || [ "$(dirname "$SOURCE")" = .. ]; then + ln -${VERBOSE}fs -T -- "$SOURCE" "${DESTDIR:-}$TARGET" else - ln -${VERBOSE}fs -T --relative -- "${DESTDIR:-}$1" "${DESTDIR:-}$2" + ln -${VERBOSE}fs -T --relative -- "${DESTDIR:-}$SOURCE" "${DESTDIR:-}$TARGET" fi diff --git a/tools/meson-vcs-tag.sh b/tools/meson-vcs-tag.sh index 1ec04c76b79..8ce692498ad 100755 --- a/tools/meson-vcs-tag.sh +++ b/tools/meson-vcs-tag.sh @@ -4,8 +4,8 @@ set -eu set -o pipefail -dir="$1" -fallback="$2" +dir="${1:?}" +fallback="${2:?}" # Apparently git describe has a bug where it always considers the work-tree # dirty when invoked with --git-dir (even though 'git status' is happy). Work diff --git a/tools/update-hwdb-autosuspend.sh b/tools/update-hwdb-autosuspend.sh index 7d5a9a8cf5a..c69773087df 100755 --- a/tools/update-hwdb-autosuspend.sh +++ b/tools/update-hwdb-autosuspend.sh @@ -2,7 +2,7 @@ # SPDX-License-Identifier: LGPL-2.1-or-later set -eu -cd "$1" +cd "${1:?}" (curl --fail -L 'https://chromium.googlesource.com/chromiumos/platform2/+/master/power_manager/udev/gen_autosuspend_rules.py?format=TEXT'; echo) \ | base64 -d > tools/chromiumos/gen_autosuspend_rules.py diff --git a/tools/update-hwdb.sh b/tools/update-hwdb.sh index 773a959dcf6..abbbb82f4bc 100755 --- a/tools/update-hwdb.sh +++ b/tools/update-hwdb.sh @@ -2,7 +2,7 @@ # SPDX-License-Identifier: LGPL-2.1-or-later set -eu -cd "$1" +cd "${1:?}" unset permissive if [ "${2:-}" = "-p" ]; then @@ -28,6 +28,6 @@ if [ "${2:-}" != "-n" ]; then ( set -x ./acpi-update.py >20-acpi-vendor.hwdb.base patch -p0 -o- 20-acpi-vendor.hwdb.base <20-acpi-vendor.hwdb.patch >20-acpi-vendor.hwdb -! diff -u 20-acpi-vendor.hwdb.base 20-acpi-vendor.hwdb >20-acpi-vendor.hwdb.patch +diff -u 20-acpi-vendor.hwdb.base 20-acpi-vendor.hwdb >20-acpi-vendor.hwdb.patch && exit 1 ./ids_parser.py diff --git a/tools/update-syscall-tables.sh b/tools/update-syscall-tables.sh index 4f56aeceddc..5aa85368825 100755 --- a/tools/update-syscall-tables.sh +++ b/tools/update-syscall-tables.sh @@ -2,10 +2,10 @@ # SPDX-License-Identifier: LGPL-2.1-or-later set -eu -cd "$1" && shift +cd "${1:?}" && shift curl --fail -L -o syscall-list.txt 'https://raw.githubusercontent.com/hrw/syscalls-table/master/syscall-names.text' for arch in "$@"; do - curl --fail -L -o syscalls-$arch.txt "https://raw.githubusercontent.com/hrw/syscalls-table/master/tables/syscalls-$arch" + curl --fail -L -o "syscalls-$arch.txt" "https://raw.githubusercontent.com/hrw/syscalls-table/master/tables/syscalls-$arch" done