From db8a15a5012d4af1a2e761f3f69f380cf1bc2979 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Thu, 29 Aug 2024 11:37:49 +0000 Subject: [PATCH] tools: Add a script to find changes in linux-firmware Signed-off-by: Michael Tremer --- tools/find-linux-firmware-changes | 139 ++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100755 tools/find-linux-firmware-changes diff --git a/tools/find-linux-firmware-changes b/tools/find-linux-firmware-changes new file mode 100755 index 000000000..c432e4fcd --- /dev/null +++ b/tools/find-linux-firmware-changes @@ -0,0 +1,139 @@ +#!/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 $? -- 2.39.5