diff options
| author | Woodpecker CI <emmett1.2miligrams@protonmail.com> | 2026-04-29 07:06:29 +0000 |
|---|---|---|
| committer | Woodpecker CI <emmett1.2miligrams@protonmail.com> | 2026-04-29 07:06:29 +0000 |
| commit | 4735e72b7d83c0ac66d32a53ccf05a8841c427ef (patch) | |
| tree | 961970becb7c7689616befdf5c926aebd9d883d0 /linux-firmware/copy-firmware.sh | |
| parent | 9d21647e5967ea92878cf18e435d9f0ea76dd514 (diff) | |
| download | alicelinux-4735e72b7d83c0ac66d32a53ccf05a8841c427ef.tar.gz alicelinux-4735e72b7d83c0ac66d32a53ccf05a8841c427ef.zip | |
Woodpecker CI de685447a26906ca5cbba8311fdc48733038e124 [SKIP CI]
Diffstat (limited to 'linux-firmware/copy-firmware.sh')
| -rw-r--r-- | linux-firmware/copy-firmware.sh | 174 |
1 files changed, 110 insertions, 64 deletions
diff --git a/linux-firmware/copy-firmware.sh b/linux-firmware/copy-firmware.sh index 184fdfc0..b1cb47b6 100644 --- a/linux-firmware/copy-firmware.sh +++ b/linux-firmware/copy-firmware.sh @@ -5,7 +5,6 @@ # verbose=: -# shellcheck disable=SC2209 compress=cat compext= destdir= @@ -26,25 +25,17 @@ warn() { } has_gnu_parallel() { - if command -v parallel > /dev/null; then - # The moreutils package comes with a simpler version of "parallel" - # that does not support the --version or -a options. Check for - # that first. In some distros, installing the "parallel" package - # will replace the moreutils version with the GNU version. - if ! parallel --version > /dev/null 2>&1; then - return 1 - fi - if parallel --version | grep -Fqi 'gnu parallel'; then - return 0 - fi - fi - return 1 + command -v parallel > /dev/null || return 1 + # moreutils parallel doesn't support --version; if it fails, not GNU + parallel --version > /dev/null 2>&1 || return 1 + # Use tolower() instead of IGNORECASE (gawk-only extension) + parallel --version 2>/dev/null \ + | awk '{if(tolower($0)~/gnu parallel/)found=1} END{exit !found}' } while test $# -gt 0; do case $1 in -v | --verbose) - # shellcheck disable=SC2209 verbose=echo shift ;; @@ -53,7 +44,7 @@ while test $# -gt 0; do num_jobs=$(echo "$1" | sed 's/-j//') num_jobs=${num_jobs:-1} if [ "$num_jobs" -gt 1 ] && ! has_gnu_parallel; then - err "the GNU parallel command is required to use -j" + err "the GNU parallel command is required to use -j" fi parallel_args_file=$(mktemp) trap 'rm -f $parallel_args_file' EXIT INT QUIT TERM @@ -73,7 +64,6 @@ while test $# -gt 0; do if test "$compext" = ".xz"; then err "cannot mix XZ and ZSTD compression" fi - # shellcheck disable=SC2209 compress="zstd --compress --quiet --stdout" compext=".zst" shift @@ -85,8 +75,6 @@ while test $# -gt 0; do ;; -*) - # Ignore anything else that begins with - because that confuses - # the "test" command below warn "ignoring option $1" shift ;; @@ -95,7 +83,6 @@ while test $# -gt 0; do if test -n "$destdir"; then err "unknown command-line options: $*" fi - destdir="$1" shift ;; @@ -107,7 +94,10 @@ if test -z "$destdir"; then fi if test -d "$destdir"; then - find "$destdir" -type d -empty >/dev/null || warn "destination folder is not empty." + # BusyBox find does not support -empty; count entries instead + if [ "$(find "$destdir" | wc -l)" -gt 1 ]; then + warn "destination folder is not empty." + fi fi if test -e .git/config; then @@ -115,59 +105,115 @@ if test -e .git/config; then ./check_whence.py || err "check_whence.py has detected errors." fi -# shellcheck disable=SC2162 # file/folder name can include escaped symbols -grep -E '^(RawFile|File):' WHENCE | sed -E -e 's/^(RawFile|File): */\1 /;s/"//g' | while read k f; do - install -d "$destdir/$(dirname "$f")" - $verbose "copying/compressing file $f$compext" - if test "$compress" != "cat" && test "$k" = "RawFile"; then - $verbose "compression will be skipped for file $f" - if [ "$num_jobs" -gt 1 ]; then - echo "cat \"$f\" > \"$destdir/$f\"" >> "$parallel_args_file" - else - cat "$f" > "$destdir/$f" - fi - else - if [ "$num_jobs" -gt 1 ]; then - echo "$compress \"$f\" > \"$destdir/$f$compext\"" >> "$parallel_args_file" +# sed -E is GNU-only; rewrite with basic BRE substitutions instead. +# File/RawFile lines: strip the keyword prefix and any surrounding quotes, +# then emit "K\tFILENAME" (tab-separated) so filenames with spaces are safe. +grep -E '^(RawFile|File):' WHENCE \ + | sed 's/^RawFile:/RawFile/;s/^File:/File/;s/"//g' \ + | awk '{k=$1; sub(/^[^ ]+ +/,""); printf "%s\t%s\n", k, $0}' \ + | while IFS="$(printf '\t')" read -r k f; do + install -d "$destdir/$(dirname "$f")" + $verbose "copying/compressing file $f$compext" + if test "$compress" != "cat" && test "$k" = "RawFile"; then + $verbose "compression will be skipped for file $f" + if [ "$num_jobs" -gt 1 ]; then + printf 'cat\t%s\t%s\n' "$f" "$destdir/$f" >> "$parallel_args_file" + else + cat "$f" > "$destdir/$f" + fi else - $compress "$f" > "$destdir/$f$compext" + if [ "$num_jobs" -gt 1 ]; then + printf '%s\t%s\t%s\n' "$compress" "$f" "$destdir/$f$compext" >> "$parallel_args_file" + else + $compress "$f" > "$destdir/$f$compext" + fi fi - fi -done + done + if [ "$num_jobs" -gt 1 ]; then - parallel -j"$num_jobs" -a "$parallel_args_file" - echo > "$parallel_args_file" # prepare for next run + # Tab-separated columns: {1}=cmd+args {2}=src {3}=dest + # parallel --colsep splits on the tab so spaces in paths are safe. + parallel -j"$num_jobs" --colsep '\t' '{1} "{2}" > "{3}"' \ + < "$parallel_args_file" + printf '' > "$parallel_args_file" fi -# shellcheck disable=SC2162 # file/folder name can include escaped symbols -grep -E '^Link:' WHENCE | sed -e 's/^Link: *//g;s/-> //g' | while read l t; do - directory="$destdir/$(dirname "$l")" - install -d "$directory" - target="$(cd "$directory" && realpath "$t")" - if test -e "$target"; then - $verbose "creating link $l -> $t" - if [ "$num_jobs" -gt 1 ]; then - echo "ln -s \"$t\" \"$destdir/$l\"" >> "$parallel_args_file" - else - ln -s "$t" "$destdir/$l" - fi - else - $verbose "creating link $l$compext -> $t$compext" - if [ "$num_jobs" -gt 1 ]; then - echo "ln -s \"$t$compext\" \"$destdir/$l$compext\"" >> "$parallel_args_file" +# Link lines look like: Link: some/name with spaces -> target with spaces +# Split on ' -> ' as a unit using awk so spaces inside names are preserved. +grep -E '^Link:' WHENCE \ + | sed 's/^Link: *//' \ + | awk '{ + idx = index($0, " -> ") + if (idx > 0) { + printf "%s\t%s\n", substr($0,1,idx-1), substr($0,idx+4) + } + }' \ + | while IFS="$(printf '\t')" read -r l t; do + directory="$destdir/$(dirname "$l")" + install -d "$directory" + + # BusyBox realpath lacks -m (allow non-existent) and -s (no symlink + # resolution). Replicate by walking each component manually. + target=$( + cd "$directory" 2>/dev/null || exit 1 + result=$(pwd) + set -f + IFS=/ + for part in $t; do + case "$part" in + '') ;; + '.') ;; + '..') result=$(dirname "$result") ;; + *) result="$result/$part" ;; + esac + done + printf '%s\n' "$result" + ) + + if test -e "$target"; then + $verbose "creating link $l -> $t" + if [ "$num_jobs" -gt 1 ]; then + printf 'ln -s\t%s\t%s\n' "$t" "$destdir/$l" >> "$parallel_args_file" + else + ln -s "$t" "$destdir/$l" + fi else - ln -s "$t$compext" "$destdir/$l$compext" + $verbose "creating link $l$compext -> $t$compext" + if [ "$num_jobs" -gt 1 ]; then + printf 'ln -s\t%s\t%s\n' \ + "$t$compext" "$destdir/$l$compext" >> "$parallel_args_file" + else + ln -s "$t$compext" "$destdir/$l$compext" + fi fi - fi -done + done + if [ "$num_jobs" -gt 1 ]; then - parallel -j"$num_jobs" -a "$parallel_args_file" + parallel -j"$num_jobs" --colsep '\t' '{1} "{2}" "{3}"' \ + < "$parallel_args_file" fi -# Verify no broken symlinks -#if test "$(find "$destdir" -xtype l | wc -l)" -ne 0 ; then -# err "Broken symlinks found:\n$(find "$destdir" -xtype l)" -#fi +# Verify no broken symlinks. +# BusyBox find has no -xtype; use -type l then resolve each target manually. +# Relative targets are relative to the symlink's own directory. +find "$destdir" -type l | while read -r lnk; do + lnk_target=$(readlink "$lnk") + case "$lnk_target" in + /*) check="$lnk_target" ;; + *) check="$(dirname "$lnk")/$lnk_target" ;; + esac + if ! test -e "$check"; then + printf "ERROR: Broken symlink: %s -> %s\n" "$lnk" "$lnk_target" >&2 + fi +done +find "$destdir" -type l | while read -r lnk; do + lnk_target=$(readlink "$lnk") + case "$lnk_target" in + /*) check="$lnk_target" ;; + *) check="$(dirname "$lnk")/$lnk_target" ;; + esac + test -e "$check" || exit 1 +done || err "Broken symlinks found in $destdir" exit 0 |