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
						Jeremy Soller
					
				
			
			
				
	
			
			
			
						parent
						
							b03c960b4f
						
					
				
				
					commit
					1aadc68257
				
			
							
								
								
									
										16
									
								
								.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
								
							| @@ -8,15 +8,13 @@ jobs: | ||||
|   lint: | ||||
|     runs-on: ubuntu-22.04 | ||||
|     steps: | ||||
|       - uses: actions/checkout@v2 | ||||
|       - name: Check SPDX identifiers | ||||
|         run: ./scripts/lint/spdx.sh | ||||
|       - name: Check indentation | ||||
|         run: ./scripts/lint/indent.sh | ||||
|       - uses: actions/checkout@v3 | ||||
|  | ||||
|       - name:  Check SPDX tags | ||||
|         run: ./scripts/lint/01-spdx-tags.sh | ||||
|  | ||||
|       - name: Check formatting | ||||
|         run: ./scripts/clang-format.sh | ||||
|         continue-on-error: true | ||||
|         run: ./scripts/lint/02-clang-format.sh | ||||
|  | ||||
|   tool: | ||||
|     strategy: | ||||
| @@ -27,7 +25,7 @@ jobs: | ||||
|  | ||||
|     runs-on: ubuntu-22.04 | ||||
|     steps: | ||||
|       - uses: actions/checkout@v2 | ||||
|       - uses: actions/checkout@v3 | ||||
|  | ||||
|       - name: Install dependencies | ||||
|         run: ./scripts/deps.sh | ||||
| @@ -90,7 +88,7 @@ jobs: | ||||
|             board: oryp9 | ||||
|  | ||||
|     steps: | ||||
|       - uses: actions/checkout@v2 | ||||
|       - uses: actions/checkout@v3 | ||||
|  | ||||
|       - name: Install dependencies | ||||
|         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 | ||||
| endif | ||||
|  | ||||
| # Target to remove build artifacts | ||||
| .PHONY: clean | ||||
| clean: | ||||
| 	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