summaryrefslogtreecommitdiffstats
path: root/copy-firmware.sh
blob: 6757c6ce03a3086816ce95b0085c281a9afaaf26 (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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#!/bin/sh
# SPDX-License-Identifier: GPL-2.0
#
# Copy firmware files based on WHENCE list
#

verbose=:
prune=no
# shellcheck disable=SC2209
compress=cat
compext=
skip_dedup=0

while test $# -gt 0; do
    case $1 in
        -v | --verbose)
            # shellcheck disable=SC2209
            verbose=echo
            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
            ;;

        --ignore-duplicates)
            skip_dedup=1
            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

if [ -z "$destdir" ]; then
	echo "ERROR: destination directory was not specified"
	exit 1
fi

if ! command -v rdfind >/dev/null; then
	if [ "$skip_dedup" != 1 ]; then
    		echo "ERROR: rdfind is not installed.  Pass --ignore-duplicates to skip deduplication"
		exit 1
	fi
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
    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

if [ "$skip_dedup" != 1 ] ; then
	$verbose "Finding duplicate files"
	rdfind -makesymlinks true -makeresultsfile false "$destdir" >/dev/null
	find "$destdir" -type l | while read -r l; do
		target="$(realpath "$l")"
		$verbose "Correcting path for $l"
		ln -fs "$(realpath --relative-to="$(dirname "$(realpath -s "$l")")" "$target")" "$l"
	done
fi

# 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

exit 0

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