aboutsummaryrefslogtreecommitdiff
path: root/linux-firmware/copy-firmware.sh
diff options
context:
space:
mode:
authorWoodpecker CI <emmett1.2miligrams@protonmail.com>2026-04-29 07:06:29 +0000
committerWoodpecker CI <emmett1.2miligrams@protonmail.com>2026-04-29 07:06:29 +0000
commit4735e72b7d83c0ac66d32a53ccf05a8841c427ef (patch)
tree961970becb7c7689616befdf5c926aebd9d883d0 /linux-firmware/copy-firmware.sh
parent9d21647e5967ea92878cf18e435d9f0ea76dd514 (diff)
downloadalicelinux-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.sh174
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