aboutsummaryrefslogtreecommitdiffstats
path: root/copy-firmware.sh
blob: 59ff976e1a539afa20bfb2ea34fdfafb853a3a4f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#!/bin/sh
# SPDX-License-Identifier: GPL-2.0
#
# Copy firmware files based on WHENCE list
#

verbose=:
prune=no
# shellcheck disable=SC2209
compress=cat
compext=
quiet=">/dev/null"
rdfind_results=/dev/null

while test $# -gt 0; do
    case $1 in
        -v | --verbose)
            # shellcheck disable=SC2209
            verbose=echo
            quiet=
            rdfind_results=results.txt
            shift
            ;;

        -P | --prune)
            prune=yes
            shift
            ;;

        --xz)
            if test "$compext" = ".zst"; then
                echo "ERROR: cannot mix XZ and ZSTD compression"
                exit 1
            fi
            compress="xz --compress --quiet --stdout --check=crc32"
            compext=".xz"
            shift
            ;;

        --zstd)
            if test "$compext" = ".xz"; then
                echo "ERROR: cannot mix XZ and ZSTD compression"
                exit 1
            fi
            # shellcheck disable=SC2209
            compress="zstd --compress --quiet --stdout"
            compext=".zst"
            shift
            ;;

        -*)
            if test "$compress" = "cat"; then
                echo "ERROR: unknown command-line option: $1"
                exit 1
            fi
            compress="$compress $1"
            shift
            ;;
        *)
            if test "x$destdir" != "x"; then
                echo "ERROR: unknown command-line options: $*"
                exit 1
            fi

            destdir="$1"
            shift
            ;;
    esac
done

# 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
    test -f "$f" || continue
    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"
        cat "$f" > "$destdir/$f"
    else
        $compress "$f" > "$destdir/$f$compext"
    fi
done

# shellcheck disable=SC2162 # file/folder name can include escaped symbols
grep -E '^Link:' WHENCE | sed -e 's/^Link: *//g;s/-> //g' | while read f d; do
    if test -L "$f$compext"; then
        test -f "$destdir/$f$compext" && continue
        $verbose "copying link $f$compext"
        install -d "$destdir/$(dirname "$f")"
        cp -d "$f$compext" "$destdir/$f$compext"

        if test "x$d" != "x"; then
            target="$(readlink "$f")"

            if test "x$target" != "x$d"; then
                $verbose "WARNING: inconsistent symlink target: $target != $d"
            else
                if test "x$prune" != "xyes"; then
                    $verbose "WARNING: unneeded symlink detected: $f"
                else
                    $verbose "WARNING: pruning unneeded symlink $f"
                    rm -f "$f$compext"
                fi
            fi
        else
            $verbose "WARNING: missing target for symlink $f"
        fi
    else
        directory="$destdir/$(dirname "$f")"
        install -d "$directory"
        target="$(cd "$directory" && realpath -m -s "$d")"
        if test -d "$target"; then
            $verbose "creating link $f -> $d"
            ln -s "$d" "$destdir/$f"
        else
            $verbose "creating link $f$compext -> $d$compext"
            ln -s "$d$compext" "$destdir/$f$compext"
        fi
    fi
done

$verbose rdfind -makesymlinks true "$destdir" -outputname $rdfind_results "$quiet"
find "$destdir" -type l | while read -r l; do
    target="$(realpath "$l")"
    ln -fs "$(realpath --relative-to="$(dirname "$(realpath -s "$l")")" "$target")" "$l"
done

exit 0

# vim: et sw=4 sts=4 ts=4