diff --git a/Makefile b/Makefile index ac43c97f..216dd488 100644 --- a/Makefile +++ b/Makefile @@ -26,21 +26,22 @@ deb: rpm: ./build_packages.py --rpm -install: - install -d $(DESTDIR)$(FIRMWAREDIR) - ./copy-firmware.sh $(COPYOPTS) $(DESTDIR)$(FIRMWAREDIR) +install: install-nodedup + ./dedup-firmware.sh $(DESTDIR)$(FIRMWAREDIR) install-nodedup: install -d $(DESTDIR)$(FIRMWAREDIR) - ./copy-firmware.sh --ignore-duplicates $(DESTDIR)$(FIRMWAREDIR) + ./copy-firmware.sh $(DESTDIR)$(FIRMWAREDIR) install-xz: install -d $(DESTDIR)$(FIRMWAREDIR) ./copy-firmware.sh --xz $(DESTDIR)$(FIRMWAREDIR) + ./dedup-firmware.sh $(DESTDIR)$(FIRMWAREDIR) install-zst: install -d $(DESTDIR)$(FIRMWAREDIR) ./copy-firmware.sh --zstd $(DESTDIR)$(FIRMWAREDIR) + ./dedup-firmware.sh $(DESTDIR)$(FIRMWAREDIR) clean: rm -rf release dist diff --git a/check_whence.py b/check_whence.py index afe97a76..09dbdd54 100755 --- a/check_whence.py +++ b/check_whence.py @@ -91,6 +91,7 @@ def main(): "contrib/templates/debian.copyright", "contrib/templates/rpm.spec", "copy-firmware.sh", + "dedup-firmware.sh", ] ) known_prefixes = set(name for name in whence_list if name.endswith("/")) diff --git a/copy-firmware.sh b/copy-firmware.sh index 6c557f23..344f478d 100755 --- a/copy-firmware.sh +++ b/copy-firmware.sh @@ -9,7 +9,6 @@ prune=no # shellcheck disable=SC2209 compress=cat compext= -skip_dedup=0 while test $# -gt 0; do case $1 in @@ -45,11 +44,6 @@ while test $# -gt 0; do shift ;; - --ignore-duplicates) - skip_dedup=1 - shift - ;; - -*) if test "$compress" = "cat"; then echo "ERROR: unknown command-line option: $1" @@ -75,13 +69,6 @@ if [ -z "$destdir" ]; then 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 @@ -95,16 +82,6 @@ grep -E '^(RawFile|File):' WHENCE | sed -E -e 's/^(RawFile|File): */\1 /;s/"//g' 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 diff --git a/dedup-firmware.sh b/dedup-firmware.sh new file mode 100755 index 00000000..2bbd637f --- /dev/null +++ b/dedup-firmware.sh @@ -0,0 +1,52 @@ +#!/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) + # shellcheck disable=SC2209 + verbose=echo + ;; + *) + 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 exit." +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 + +grep DUPTYPE_WITHIN_SAME_TREE results.txt | grep -o "$destdir.*" | while read -r l; do + target="$(realpath "$l")" + $verbose "Correcting path for $l" + ln --force --symbolic --relative "$target" "$l" +done + +rm results.txt