Files
bpfire/tools/find-linux-firmware-changes
2024-08-29 12:03:13 +00:00

140 lines
2.5 KiB
Bash
Executable File

#!/bin/bash
URL="https://git.ipfire.org/?p=thirdparty/linux-firmware.git;a=snapshot;h=TAG;sf=tgz"
download() {
local version="${1}"
local install="${2}"
local target
local url="${URL/TAG/${version}}"
echo "Downloading ${version}..."
# Download and extract
if ! curl --silent "${url}" | tar xz -C "${tmp}"; then
echo "${0}: Could not download ${version}" >&2
return 1
fi
echo "Installing ${version}..."
# Install
pushd "linux-firmware-${version}" &>/dev/null
case "${version}" in
2023*)
target="install"
;;
*)
target="install-nodedup"
;;
esac
# Install to a new directory
if ! make "${target}" DESTDIR="${install}"; then
echo "${0}: Could not install ${version}" >&2
popd &>/dev/null
return 1
fi
popd &>/dev/null
return 0
}
compare() {
local removed_files=()
local changed_files=()
local line
while read -r line; do
# Find changed files
if [[ ${line} =~ ^Files\ OLD/(.*)\ and ]]; then
changed_files+=( "${BASH_REMATCH[1]}" )
elif [[ ${line} =~ ^Only\ in\ NEW/(.*):\ (.*)$ ]]; then
changed_files+=( "${BASH_REMATCH[1]}/${BASH_REMATCH[2]}" )
elif [[ ${line} =~ ^Only\ in\ OLD/(.*):\ (.*)$ ]]; then
removed_files+=( "${BASH_REMATCH[1]}/${BASH_REMATCH[2]}" )
# Handle unknown lines
else
echo "Unknown line: ${line}" >&2
fi
done <<< "$(diff --recursive --brief OLD NEW)"
local file
# List all changed files
if [ "${#changed_files[@]}" -gt 0 ]; then
echo "# Changed files"
for file in "${changed_files[@]}"; do
echo "${file}"
done
echo # newline
fi
# List all removed files
if [ "${#removed_files[@]}" -gt 0 ]; then
echo "# Removed files"
echo "rm -vrf \\"
for file in "${removed_files[@]}"; do
echo " /${file} \\"
done
fi
# Total size
{
pushd NEW &>/dev/null
du -csh "${changed_files[@]}" | tail -n1
popd &>/dev/null
}
return 0
}
run() {
# Download the old and new versions
download "${version_old}" "${tmp}/OLD" || return $?
download "${version_new}" "${tmp}/NEW" || return $?
compare || return $?
}
main() {
local version_old="${1}"
local version_new="${2}"
local r=0
# Check if we have enough arguments
if [ -z "${version_old}" -o -z "${version_new}" ]; then
echo "${0}: An old and a new version are required" >&2
return 2
fi
# Create a temporary directory
local tmp="$(mktemp -d)"
# Change into the directory
pushd "${tmp}" &>/dev/null
# Run the operation...
run || r="${?}"
popd &>/dev/null
# Remove the temporary directory
rm -rf "${tmp}"
return "${r}"
}
main "$@" || exit $?