aboutsummaryrefslogtreecommitdiff
path: root/repos/extra/linux-firmware/dedup-firmware.sh
blob: 51dad3e026065d1e6d60ce0a73ba9302f35d950a (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
#!/bin/sh
# SPDX-License-Identifier: GPL-2.0
#
# Deduplicate files in a given destdir
#

err() {
    echo "ERROR: $*"
    exit 1
}

verbose=:
destdir=

while test $# -gt 0; do
    case $1 in
        -v | --verbose)
            verbose=echo
            shift
            ;;
        *)
            if test -n "$destdir"; then
                err "unknown command-line options: $*"
            fi
            destdir="$1"
            shift
            ;;
    esac
done

if test -z "$destdir"; then
    err "destination directory was not specified."
fi

if ! test -d "$destdir"; then
    err "provided directory does not exist."
fi

if ! command -v rdfind >/dev/null; then
    err "rdfind is not installed."
fi

$verbose "Finding duplicate files"
rdfind -makesymlinks true -makeresultsfile true "$destdir" >/dev/null

# --relative is a GNU coreutils ln extension; not available in BusyBox.
# Compute the relative path ourselves using a portable shell function.
relpath() {
    # relpath <target_abs> <link_abs>
    # Prints the relative path from the directory of <link_abs> to <target_abs>.
    target="$1"
    link_dir=$(dirname "$2")

    # Strip common prefix component-by-component.
    t="$target"
    b="$link_dir"

    # Normalise: remove trailing slashes
    t=${t%/}
    b=${b%/}

    # Walk up from b until it is a prefix of t
    up=""
    while [ -n "$b" ] && [ "${t#$b/}" = "$t" ] && [ "$t" != "$b" ]; do
        b=$(dirname "$b")
        up="../$up"
    done

    if [ "$t" = "$b" ]; then
        # Same directory
        rel="."
    else
        rel="$up${t#$b/}"
    fi

    printf '%s\n' "$rel"
}

grep DUPTYPE_WITHIN_SAME_TREE results.txt \
    | grep -o "$destdir[^ ]*" \
    | while read -r l; do
        target=$(realpath "$l")
        $verbose "Correcting path for $l"
        rel=$(relpath "$target" "$l")
        # BusyBox ln uses short flags: -s (symbolic), -f (force)
        ln -sf "$rel" "$l"
    done

rm results.txt