#!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-2020 Ian Leonard (antonlacon@gmail.com) # # Scan through the given directory looking for out of date source packages. # If a source tarball is found that is different from what is currently in # tree, then print out the discovered files. # # If -d is passed, also delete obsolete files. # If -f is passed, fetch updated source tarballs. # If -b is passed, build a new SOURCES, populated from the old SOURCES # Set NEW_SOURCES_DIR to customize the temp dir to use in building # If -r is passed, replace the old SOURCES when finished building new SOURCES set -e . config/options "" # default variables DESTRUCTIVE_RUN="false" FETCH_UPDATES="false" PACKAGES_TO_UPDATE=() BUILD_SOURCES="false" REPLACE_OLD="false" NEW_SOURCES="${NEW_SOURCES_DIR:-${SOURCES}.new}" # helper functions help(){ echo "Usage: ${0} [-hdfbr]" echo "Set PROJECT, DEVICE and ARCH as required." echo " -h this help" echo " -d delete obsolete source packages (default no)" echo " -f fetch updated source packages (default: no)" echo " -b build new SOURCES content (default: no)" echo " -r replace old SOURCES when rebuilding (default: no)" } # command line opts while getopts hdfrb OPT; do case "${OPT}" in h) help exit 0 ;; d) DESTRUCTIVE_RUN="true" ;; f) FETCH_UPDATES="true" ;; b) BUILD_SOURCES="true" ;; r) REPLACE_OLD="true" ;; \?) # error and output help on unknown help die ;; esac done shift $((${OPTIND}-1)) # sanity checking if [ ! -d "${SOURCES}" ]; then die "error: ${SOURCES} is not a directory" elif [ "${DESTRUCTIVE_RUN}" = "true" -a "${BUILD_SOURCES}" = "true" ]; then die "error: options '-d' and '-b' are mutually exclusive" fi # main # process files in SOURCES for SOURCE_PACKAGE in $(find "${SOURCES}/" -mindepth 1 -type d); do PACKAGE_NAME=$(basename "${SOURCE_PACKAGE}") # check if package is still in the tree to selectively prune, or delete the dir PACKAGE_DIR=$(get_pkg_directory "${PACKAGE_NAME}" || true) if [ -n "${PACKAGE_DIR}" ]; then PACKAGE_SOURCE_FILE=$(get_pkg_variable "${PACKAGE_NAME}" "PKG_SOURCE_NAME") fi # PACKAGE_DIR is null if not in tree, PACKAGE_SOURCE_FILE is null if PKG_ARCH mismatch if [ -n "${PACKAGE_DIR}" -a -n "${PACKAGE_SOURCE_FILE}" ]; then CUR_PACKAGE_FILE=$(basename "${PACKAGE_SOURCE_FILE}") for FILE in $(find "${SOURCE_PACKAGE}/" -type f); do # don't test auxilliary files if [[ "${FILE}" = *.url ]] || [[ "${FILE}" = *.sha256 ]]; then continue fi # obsolete file handling if [ "${FILE}" != "${SOURCES}/${PACKAGE_NAME}/${CUR_PACKAGE_FILE}" ]; then ls -1 "${FILE}"* PACKAGES_TO_UPDATE+="${PACKAGE_NAME}" if [ "${DESTRUCTIVE_RUN}" = "true" ]; then rm -f "${FILE}"* fi # current file handling elif [ "${BUILD_SOURCES}" = "true" ]; then echo "Relocating ${PACKAGE_NAME} files..." mkdir -p "${NEW_SOURCES}/${PACKAGE_NAME}" mv "${FILE}"* "${NEW_SOURCES}/${PACKAGE_NAME}/" fi done else echo "info: ${PACKAGE_NAME} no longer in tree" if [ "${DESTRUCTIVE_RUN}" = "true" ]; then rm -rf "${SOURCE_PACKAGE}" fi fi done if [ "${BUILD_SOURCES}" = "true" -a "${REPLACE_OLD}" = "true" ]; then rm -rf "${SOURCES}" mv "${NEW_SOURCES}" "${SOURCES}" fi if [ "${FETCH_UPDATES}" = "true" ]; then if "${BUILD_SOURCES}" = "true" -a "${REPLACE_OLD}" = "false" ]; then SOURCES="${NEW_SOURCES}" fi for PACKAGE in "${PACKAGES_TO_UPDATE[@]}"; do # scripts/get determines if tarball is present before downloading SOURCES_DIR="${SOURCES}" "${SCRIPTS}/get" "${PACKAGE}" done fi exit