scripts: Rewrite lint scripts
Rewrite lint scripts to report what they do and if they pass. In the case they fail list the files that caused the failure, except for clang-format, which will be slow to run of every file individually (should just run `make fmt` anyway). Also add a script to run all the lints in order with a single command. Signed-off-by: Tim Crawford <tcrawford@system76.com>
This commit is contained in:
committed by
Jeremy Soller
parent
b03c960b4f
commit
1aadc68257
16
.github/workflows/ci.yml
vendored
16
.github/workflows/ci.yml
vendored
@ -8,15 +8,13 @@ jobs:
|
|||||||
lint:
|
lint:
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
- name: Check SPDX identifiers
|
|
||||||
run: ./scripts/lint/spdx.sh
|
- name: Check SPDX tags
|
||||||
- name: Check indentation
|
run: ./scripts/lint/01-spdx-tags.sh
|
||||||
run: ./scripts/lint/indent.sh
|
|
||||||
|
|
||||||
- name: Check formatting
|
- name: Check formatting
|
||||||
run: ./scripts/clang-format.sh
|
run: ./scripts/lint/02-clang-format.sh
|
||||||
continue-on-error: true
|
|
||||||
|
|
||||||
tool:
|
tool:
|
||||||
strategy:
|
strategy:
|
||||||
@ -27,7 +25,7 @@ jobs:
|
|||||||
|
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: ./scripts/deps.sh
|
run: ./scripts/deps.sh
|
||||||
@ -90,7 +88,7 @@ jobs:
|
|||||||
board: oryp9
|
board: oryp9
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: ./scripts/deps.sh
|
run: ./scripts/deps.sh
|
||||||
|
6
Makefile
6
Makefile
@ -69,6 +69,10 @@ include $(ARCH_DIR)/toolchain.mk
|
|||||||
# The architecture defines build targets, no more is required
|
# The architecture defines build targets, no more is required
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Target to remove build artifacts
|
.PHONY: clean
|
||||||
clean:
|
clean:
|
||||||
rm -rf $(obj)
|
rm -rf $(obj)
|
||||||
|
|
||||||
|
.PHONY: lint
|
||||||
|
lint:
|
||||||
|
./scripts/lint/lint.sh
|
||||||
|
52
scripts/lint/01-spdx-tags.sh
Executable file
52
scripts/lint/01-spdx-tags.sh
Executable file
@ -0,0 +1,52 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
|
||||||
|
# Check that all files have a SPDX license identifier
|
||||||
|
# TODO: Validate license tags against a whitelist
|
||||||
|
|
||||||
|
LINT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &> /dev/null && pwd)
|
||||||
|
. "$LINT_DIR/util.sh"
|
||||||
|
|
||||||
|
echo -n "Checking for SPDX tags..."
|
||||||
|
|
||||||
|
EXCLUDES=(
|
||||||
|
# Ignore license files
|
||||||
|
':!:LICENSE'
|
||||||
|
':!:**/LICENSE'
|
||||||
|
# Ignore cargo files
|
||||||
|
':!:**/Cargo.lock'
|
||||||
|
':!:**/Cargo.toml'
|
||||||
|
':!:rust-toolchain.toml'
|
||||||
|
# Ignore text files
|
||||||
|
':!:*.md'
|
||||||
|
':!:*.txt'
|
||||||
|
# Ignore dotfiles
|
||||||
|
':!:\.*'
|
||||||
|
':!:**/\.*'
|
||||||
|
)
|
||||||
|
|
||||||
|
needs_tag=()
|
||||||
|
|
||||||
|
for file in $(git ls-files "${EXCLUDES[@]}"); do
|
||||||
|
# Only check regular files
|
||||||
|
if [[ ! -f "$file" ]]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# SPDX must appear at head of file
|
||||||
|
if ! head "$file" | grep -q 'SPDX-License-Identifier:'; then
|
||||||
|
needs_tag+=("$file")
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ "${#needs_tag[@]}" != "0" ]]; then
|
||||||
|
failed
|
||||||
|
|
||||||
|
for file in "${needs_tag[@]}"; do
|
||||||
|
echo "- $file"
|
||||||
|
done
|
||||||
|
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
passed
|
34
scripts/lint/02-clang-format.sh
Executable file
34
scripts/lint/02-clang-format.sh
Executable file
@ -0,0 +1,34 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
|
||||||
|
# Check if any C files or headers need to be formatted.
|
||||||
|
|
||||||
|
LINT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &> /dev/null && pwd)
|
||||||
|
. "$LINT_DIR/util.sh"
|
||||||
|
|
||||||
|
echo -n "Checking C style..."
|
||||||
|
|
||||||
|
if ! command -v clang-format > /dev/null; then
|
||||||
|
skipped "clang-format not found"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
readarray -t FILES < <(git ls-files '*.c' '*.h')
|
||||||
|
|
||||||
|
FMT_OPTS=(
|
||||||
|
"-style=file"
|
||||||
|
"--fallback-style=none"
|
||||||
|
"--dry-run"
|
||||||
|
"--Werror"
|
||||||
|
)
|
||||||
|
|
||||||
|
# NOTE: It is too slow to run clang-format on every file individually to report
|
||||||
|
# which ones fail. Leave it up to the user to apply formatting via `make fmt`.
|
||||||
|
|
||||||
|
_output=$(clang-format "${FMT_OPTS[@]}" "${FILES[@]}" 2>&1)
|
||||||
|
if [[ $_output != "" ]]; then
|
||||||
|
failed
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
passed
|
@ -1,6 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# SPDX-License-Identifier: GPL-3.0-only
|
|
||||||
# Check files do not use tabs for indentation
|
|
||||||
|
|
||||||
git ls-files '*.[c\|h\|rs\|sh]' | xargs grep --line-number $'^\s*\t' && exit 1
|
|
||||||
exit 0
|
|
14
scripts/lint/lint.sh
Executable file
14
scripts/lint/lint.sh
Executable file
@ -0,0 +1,14 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
|
||||||
|
# Run all lints.
|
||||||
|
|
||||||
|
LINT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &> /dev/null && pwd)
|
||||||
|
LINTS=$(find "$LINT_DIR" -type f -name "[0-9][0-9]-*" | sort)
|
||||||
|
FAILED=0
|
||||||
|
|
||||||
|
for lint in $LINTS; do
|
||||||
|
$lint || FAILED=1
|
||||||
|
done
|
||||||
|
|
||||||
|
[[ "$FAILED" = "0" ]] || exit 1
|
@ -1,35 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# SPDX-License-Identifier: GPL-3.0-only
|
|
||||||
# Check that all files have a SPDX license identifier
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# File patterns to check
|
|
||||||
FILE_TYPES=(
|
|
||||||
'*.c'
|
|
||||||
'*.h'
|
|
||||||
'*.mk'
|
|
||||||
'*.rs'
|
|
||||||
'*.sh'
|
|
||||||
'Makefile'
|
|
||||||
)
|
|
||||||
|
|
||||||
ret=0
|
|
||||||
|
|
||||||
for ft in "${FILE_TYPES[@]}"; do
|
|
||||||
files=$(git ls-files "$ft")
|
|
||||||
for f in ${files}; do
|
|
||||||
# Skip empty files
|
|
||||||
if [[ "$(wc -l < "$f")" = "0" ]]; then
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
# SPDX must appear at head of file
|
|
||||||
if ! head "$f" | grep -q 'SPDX-License-Identifier:'; then
|
|
||||||
echo "$f: Missing SPDX identifier"
|
|
||||||
ret=1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
done
|
|
||||||
|
|
||||||
exit ${ret}
|
|
15
scripts/lint/util.sh
Normal file
15
scripts/lint/util.sh
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
|
||||||
|
passed() {
|
||||||
|
echo -e "\x1B[32mPASSED\x1B[0m"
|
||||||
|
}
|
||||||
|
|
||||||
|
skipped() {
|
||||||
|
local reason=$1
|
||||||
|
echo -e "\x1B[33mSKIPPED\x1B[0m ($reason)"
|
||||||
|
}
|
||||||
|
|
||||||
|
failed() {
|
||||||
|
echo -e "\x1B[31mFAILED\x1B[0m"
|
||||||
|
}
|
Reference in New Issue
Block a user