commit:     13095e024d28d13f5f707b0ca94f2d67c7273459
Author:     Theo Anderson <telans <AT> posteo <DOT> de>
AuthorDate: Thu Feb 18 10:16:08 2021 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Thu Feb 18 10:16:48 2021 +0000
URL:        https://gitweb.gentoo.org/repo/proj/guru.git/commit/?id=13095e02

.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 <telans <AT> posteo.de>

 scripts/check-duplicates.sh | 108 ++++++++++++++++++++++----------------------
 1 file changed, 53 insertions(+), 55 deletions(-)

diff --git a/scripts/check-duplicates.sh b/scripts/check-duplicates.sh
index 66d1bb9a..fe86a89e 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 <[email protected]>
+# Maintainer: Theo Anderson <[email protected]>
 #
-# 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

Reply via email to