diff options
| author | Woodpecker CI <emmett1.2miligrams@protonmail.com> | 2026-04-28 23:46:06 +0000 |
|---|---|---|
| committer | Woodpecker CI <emmett1.2miligrams@protonmail.com> | 2026-04-28 23:46:06 +0000 |
| commit | 9d21647e5967ea92878cf18e435d9f0ea76dd514 (patch) | |
| tree | 81171df5a3277a27440d74d71948fbe9dc5add8f /linux-firmware/copy-firmware.sh | |
| parent | 99cda6551ec3050c9061d87e8011b9f1bb57be1d (diff) | |
| download | alicelinux-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.sh | 174 |
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 |