aboutsummaryrefslogtreecommitdiff
path: root/linux-firmware/copy-firmware.sh
diff options
context:
space:
mode:
authorWoodpecker CI <emmett1.2miligrams@protonmail.com>2026-04-28 23:46:06 +0000
committerWoodpecker CI <emmett1.2miligrams@protonmail.com>2026-04-28 23:46:06 +0000
commit9d21647e5967ea92878cf18e435d9f0ea76dd514 (patch)
tree81171df5a3277a27440d74d71948fbe9dc5add8f /linux-firmware/copy-firmware.sh
parent99cda6551ec3050c9061d87e8011b9f1bb57be1d (diff)
downloadalicelinux-9d21647e5967ea92878cf18e435d9f0ea76dd514.tar.gz
alicelinux-9d21647e5967ea92878cf18e435d9f0ea76dd514.zip
Woodpecker CI 4ce71d772da8a401958771eb19293b6ef2190126 [SKIP CI]
Diffstat (limited to 'linux-firmware/copy-firmware.sh')
-rw-r--r--linux-firmware/copy-firmware.sh174
1 files changed, 64 insertions, 110 deletions
diff --git a/linux-firmware/copy-firmware.sh b/linux-firmware/copy-firmware.sh
index b1cb47b6..184fdfc0 100644
--- a/linux-firmware/copy-firmware.sh
+++ b/linux-firmware/copy-firmware.sh
@@ -5,6 +5,7 @@
#
verbose=:
+# shellcheck disable=SC2209
compress=cat
compext=
destdir=
@@ -25,17 +26,25 @@ warn() {
}
has_gnu_parallel() {
- 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}'
+ 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
}
while test $# -gt 0; do
case $1 in
-v | --verbose)
+ # shellcheck disable=SC2209
verbose=echo
shift
;;
@@ -44,7 +53,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
@@ -64,6 +73,7 @@ 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
@@ -75,6 +85,8 @@ while test $# -gt 0; do
;;
-*)
+ # Ignore anything else that begins with - because that confuses
+ # the "test" command below
warn "ignoring option $1"
shift
;;
@@ -83,6 +95,7 @@ while test $# -gt 0; do
if test -n "$destdir"; then
err "unknown command-line options: $*"
fi
+
destdir="$1"
shift
;;
@@ -94,10 +107,7 @@ if test -z "$destdir"; then
fi
if test -d "$destdir"; then
- # BusyBox find does not support -empty; count entries instead
- if [ "$(find "$destdir" | wc -l)" -gt 1 ]; then
- warn "destination folder is not empty."
- fi
+ find "$destdir" -type d -empty >/dev/null || warn "destination folder is not empty."
fi
if test -e .git/config; then
@@ -105,115 +115,59 @@ if test -e .git/config; then
./check_whence.py || err "check_whence.py has detected errors."
fi
-# 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
+# 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
- 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
+ cat "$f" > "$destdir/$f"
fi
- done
-
+ else
+ if [ "$num_jobs" -gt 1 ]; then
+ echo "$compress \"$f\" > \"$destdir/$f$compext\"" >> "$parallel_args_file"
+ else
+ $compress "$f" > "$destdir/$f$compext"
+ fi
+ fi
+done
if [ "$num_jobs" -gt 1 ]; then
- # 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"
+ parallel -j"$num_jobs" -a "$parallel_args_file"
+ echo > "$parallel_args_file" # prepare for next run
fi
-# 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
+# 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
- $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
+ ln -s "$t" "$destdir/$l"
fi
- done
-
+ 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"
+ else
+ ln -s "$t$compext" "$destdir/$l$compext"
+ fi
+ fi
+done
if [ "$num_jobs" -gt 1 ]; then
- parallel -j"$num_jobs" --colsep '\t' '{1} "{2}" "{3}"' \
- < "$parallel_args_file"
+ parallel -j"$num_jobs" -a "$parallel_args_file"
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"
+# 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
exit 0