From 13095e024d28d13f5f707b0ca94f2d67c7273459 Mon Sep 17 00:00:00 2001 From: Theo Anderson Date: Thu, 18 Feb 2021 23:16:08 +1300 Subject: .github/workflows/duplicates.yml: update/reformat - add self as maintainer - update variable names - un-nest for loops - check for matching package name before starting loops - speed improvements: ~3s vs 5m Package-Manager: Portage-3.0.14, Repoman-3.0.2 Signed-off-by: Theo Anderson --- scripts/check-duplicates.sh | 108 ++++++++++++++++++++++---------------------- 1 file changed, 53 insertions(+), 55 deletions(-) (limited to 'scripts/check-duplicates.sh') diff --git a/scripts/check-duplicates.sh b/scripts/check-duplicates.sh index 66d1bb9a19..fe86a89ebb 100755 --- a/scripts/check-duplicates.sh +++ b/scripts/check-duplicates.sh @@ -1,75 +1,73 @@ -#!/usr/bin/env bash +#! /usr/bin/env bash # Maintainer: Andrew Ammerlaan +# Maintainer: Theo Anderson # -# This checks if packages in ::guru are also in ::gentoo -# +# This checks for potential and exact package matches within ::guru & ::gentoo # Note that this is not going to be 100% accurate # -# - -printf "\nChecking for duplicates....\n" - -gentoo_location="/var/db/repos/gentoo" -guru_location="." -gentoo_packs=$(find ${gentoo_location} -mindepth 2 -maxdepth 2 -printf "%P\n" | sort | grep -Ev "^(.git|.github|metadata|profiles|scripts)/") -guru_packs=$(find ${guru_location} -mindepth 2 -maxdepth 2 -printf "%P\n" | sort | grep -Ev "^(.git|.github|metadata|profiles|scripts)/") +GENTOO_DIR="/var/db/repos/gentoo" +GENTOO_PACKAGES=( + $(find ${GENTOO_DIR} -mindepth 2 -maxdepth 2 -printf "%P\n" \ + | sort | grep -Ev "^(.git|.github|metadata|profiles|scripts)/" + ) +) +GURU_PACKAGES=( + $(find . -mindepth 2 -maxdepth 2 -printf "%P\n" \ + | sort | grep -Ev "^(.git|.github|metadata|profiles|scripts)/" + ) +) -pack_overrides="" pack_close_match_in_cat="" pack_close_match="" -for guru_pack in ${guru_packs}; do - # separate category and packages - guru_pack_cat="${guru_pack%%/*}" - guru_pack_name="${guru_pack##*/}" +printf "\nChecking for duplicates...\n" - # convert all to lowercase - guru_pack_name="${guru_pack_name,,}" - - # stip all numbers, dashes, underscores and pluses - guru_pack_name="${guru_pack_name/[0-9-_+]}" - - for gentoo_pack in ${gentoo_packs}; do - # separate category and packages - gentoo_pack_cat="${gentoo_pack%%/*}" - gentoo_pack_name="${gentoo_pack##*/}" +for GENTOO_PKG in ${GENTOO_PACKAGES[@]}; do + GENTOO_CATEGORIES+=( ${GENTOO_PKG%%/*} ) # Separate category + GENTOO_PKG_NAME=${GENTOO_PKG##*/} # Separate name + GENTOO_PKG_NAME=${GENTOO_PKG_NAME,,} # Force lower case + GENTOO_PKG_NAMES+=( ${GENTOO_PKG_NAME} ) +done - # convert all to lowercase - gentoo_pack_name="${gentoo_pack_name,,}" +printf "Testing ${#GURU_PACKAGES[@]} GURU packages against ${#GENTOO_PKG_NAMES[@]} Gentoo packages\n" - # stip all numbers, dashes, underscores and pluses - gentoo_pack_name="${gentoo_pack_name/[0-9-_+]}" +for GURU_PKG in ${GURU_PACKAGES[@]}; do + GURU_PKG_CATEGORY=${GURU_PKG%%/*} + GURU_PKG_NAME=${GURU_PKG##*/} + GURU_PKG_NAME=${GURU_PKG_NAME,,} - #TODO: check DESCRIPTION, HOMEPAGE and SRC_URI for close matches + if [[ ${GENTOO_PKG_NAMES[@]} =~ " ${GURU_PKG_NAME} " ]]; then # Check for a matcing name in the Gentoo tree, + for (( i=0; i<${#GENTOO_PKG_NAMES[@]}; i++ )); do # otherwise there is no need to continue + [[ ${GENTOO_PKG_NAMES[$i]} == ${GURU_PKG_NAME} ]] && index+=( $i ) # Find the category/index for multiple matching names + done - if [[ "${gentoo_pack_name}" == "${guru_pack_name}" ]]; then - if [[ "${gentoo_pack_cat}" == "${guru_pack_cat}" ]]; then - if [[ "${gentoo_pack}" == "${guru_pack}" ]]; then - pack_overrides+="\t${guru_pack}::guru exact match of ${gentoo_pack}::gentoo\n" - else - pack_close_match_in_cat+="\t${guru_pack}::guru possible duplicate of ${gentoo_pack}::gentoo\n" - fi - else - pack_close_match+="\t${guru_pack}::guru possible duplicate of ${gentoo_pack}::gentoo\n" + for i in ${index[@]}; do # For each possible match + if [[ ${GENTOO_PACKAGES[$i]} == ${GURU_PKG} ]]; then + PKG_EXACT_MATCH+="\t${GURU_PKG}::guru exact match of ${GENTOO_PACKAGES[$i]}::gentoo\n" + break # An exact match is fatal, no need to continue + elif [[ ${GENTOO_CATEGORIES[$i]} == ${GURU_PKG_CATEGORY} ]]; then # Possible match within the same category + PKG_CATEGORY_MATCH+="\t${GURU_PKG}::guru possible duplicate of ${GENTOO_PACKAGES[$i]}::gentoo\n" + else # Possible match in a different category + PKG_SPECULATIVE_MATCH+="\t${GURU_PKG}::guru possible duplicate of ${GENTOO_PACKAGES[$i]}::gentoo\n" fi - fi - done + done + unset index + fi done -if [ -n "${pack_close_match}" ]; then - printf "\nWARNING: The following packages closely match packages in the main Gentoo repository\n" - printf "${pack_close_match}" - printf "Please check these manually\n" +if [[ -n ${PKG_SPECULATIVE_MATCH} ]]; then + printf "\nWARNING: The following packages closely match packages in the main Gentoo repository:\n" + printf "${PKG_SPECULATIVE_MATCH}" + printf "Please check these manually.\n" fi -if [ -n "${pack_close_match_in_cat}" ]; then - printf "\nWARNING: The following packages closely match packages in the main Gentoo repository in the same category\n" - printf "${pack_close_match_in_cat}" - printf "Please check these manually\n" +if [[ -n ${PKG_CATEGORY_MATCH} ]]; then + printf "\nWARNING: The following packages closely match packages in the main Gentoo repository, in the same category:\n" + printf "${PKG_CATEGORY_MATCH}" + printf "Please check these manually.\n" fi -if [ -n "${pack_overrides}" ]; then - printf "\nERROR: The following packages override packages in the main Gentoo repository\n" - printf "${pack_overrides}" - printf "Please remove these packages\n" +if [[ -n ${PKG_EXACT_MATCH} ]]; then + printf "\nERROR: The following packages override packages in the main Gentoo repository:\n" + printf "${PKG_EXACT_MATCH}" + printf "Please remove these packages.\n" exit 1 fi -exit 0 -- cgit v1.2.3-65-gdbad