mirror of
https://github.com/kuhyx/testsAndMisc.git
synced 2026-11-10 21:07:03 +01:00
428 lines -> 121, with lib/shell_check_lint.sh (171), lib/shell_check_install.sh (86) and lib/shell_check_discover.sh (78). The temp-file paths (TMPDIR, ABS_FILES_Z, REL_FILES_Z) are set once in the entry before any lib is sourced and only read afterwards, so nothing mutable crosses a seam. shellcheck was clean on the first attempt. Runtime check is --skip-install --list-only --verbose, diffed against the same run from a detached worktree at HEAD: 318 files before, 321 now, the delta being exactly the three new libs the discovery walk now sees. Nothing removed. Not verified: the linting path itself. --skip-install does not gate the AUR branch of install_linters, so a full run cannot be done under decision 6 -- I learned that by running it, which installed four AUR build deps before I killed it. The user chose to leave them. run_linters moved as one intact block with no interior edit and the line-set diff shows zero lines lost, so the seam risk is confined to its two braces. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011w2Pj4Ek3ZNMQVYcFHgXDY
78 lines
2.2 KiB
Bash
Executable File
78 lines
2.2 KiB
Bash
Executable File
#!/bin/bash
|
|
# Shell-file discovery (git-tracked where possible, else a filesystem walk,
|
|
# matching by extension or shebang) and the file listing.
|
|
#
|
|
# Sourced by shell_check.sh; split out to keep it under the 250-line cap.
|
|
# Sourced rather than run, so it inherits the caller's options and reads the
|
|
# ABS_FILES_Z / REL_FILES_Z paths the entry sets above the source line.
|
|
|
|
discover_shell_files() {
|
|
local base="$1"
|
|
local -a all
|
|
all=()
|
|
|
|
if git -C "$base" rev-parse --is-inside-work-tree > /dev/null 2>&1; then
|
|
while IFS= read -r -d '' f; do all+=("$f"); done < <(git -C "$base" ls-files -z)
|
|
while IFS= read -r -d '' f; do all+=("$f"); done < <(git -C "$base" ls-files --others --exclude-standard -z)
|
|
else
|
|
while IFS= read -r -d '' f; do
|
|
# trim leading ./ to keep consistent style with git paths
|
|
f="${f#./}"
|
|
f="${f#"${base}"/}"
|
|
all+=("$f")
|
|
done < <(find "$base" -type f -print0)
|
|
fi
|
|
|
|
local -a shells
|
|
shells=()
|
|
|
|
for rel in "${all[@]}"; do
|
|
# skip binary-ish or huge files quickly by extension heuristic
|
|
case "$rel" in
|
|
*.png | *.jpg | *.jpeg | *.gif | *.ico | *.pdf | *.svg | *.zip | *.tar | *.gz | *.xz | *.7z | *.so | *.o | *.bin)
|
|
continue
|
|
;;
|
|
esac
|
|
|
|
local abs="$base/$rel"
|
|
[[ -f $abs && -r $abs ]] || continue
|
|
|
|
if [[ $rel == *.sh || $rel == *.bash || $rel == *.zsh ]]; then
|
|
shells+=("$rel")
|
|
continue
|
|
fi
|
|
|
|
# Check shebang
|
|
local first
|
|
first=$(head -n 1 -- "$abs" 2> /dev/null || true)
|
|
if [[ $first =~ ^#! && $first =~ (ba|z|d|k)?sh ]]; then
|
|
shells+=("$rel")
|
|
continue
|
|
fi
|
|
|
|
# Also catch executable files with shell shebang even without extension
|
|
if [[ -x $abs ]]; then
|
|
if [[ $first =~ ^#! && $first =~ (ba|z|d|k)?sh ]]; then
|
|
shells+=("$rel")
|
|
fi
|
|
fi
|
|
done
|
|
|
|
# write lists
|
|
: > "$REL_FILES_Z"
|
|
: > "$ABS_FILES_Z"
|
|
for rel in "${shells[@]}"; do
|
|
printf '%s\0' "$rel" >> "$REL_FILES_Z"
|
|
printf '%s\0' "$base/$rel" >> "$ABS_FILES_Z"
|
|
done
|
|
}
|
|
|
|
print_file_list() {
|
|
local count
|
|
count=$(tr -cd '\0' < "$REL_FILES_Z" | wc -c)
|
|
log_info "Discovered $count shell file(s) under $ROOT_DIR"
|
|
if [[ $VERBOSE == "true" ]]; then
|
|
tr '\0' '\n' < "$REL_FILES_Z" | sed 's/^/ - /'
|
|
fi
|
|
}
|