From 26ab531a0abac615aaedf17622ee2aa5e19c5114 Mon Sep 17 00:00:00 2001
From: Marcel Telka <marcel@telka.sk>
Date: Fri, 05 Apr 2024 12:30:27 +0200
Subject: [PATCH] python/pipdeptree: update to 2.17.0

---
 tools/perl-meta-deps |  100 +++++++++++++++++++++++++++++++++-----------------
 1 files changed, 66 insertions(+), 34 deletions(-)

diff --git a/tools/perl-meta-deps b/tools/perl-meta-deps
index 24c6758..a8c9d70 100755
--- a/tools/perl-meta-deps
+++ b/tools/perl-meta-deps
@@ -18,7 +18,7 @@
 function usage
 {
 	[[ -n "$1" ]] && printf "ERROR: %s\n\n" "$1"
-	printf "Usage: perl-meta-deps BUILD_DIR [runtime] PERL_VERSION\n" >&2
+	printf "Usage: perl-meta-deps WS_MACH BUILD_DIR [configure|build|test|runtime]... [suggests] PERL_VERSION\n" >&2
 	[[ -n "$1" ]] && exit 1
 	exit 0
 }
@@ -26,67 +26,97 @@
 
 (($# == 0)) && usage
 
+WS_MACH="$1"
+[[ -d "$WS_MACH" ]] && shift || usage "WS_MACH does not exist"
+
 BUILD_DIR="$1"
 [[ -d "$BUILD_DIR" ]] && shift || usage "BUILD_DIR does not exist"
 
-PHASES=".configure,.build,.test,.runtime"
-[[ "$1" == "runtime" ]] && PHASES=".runtime" && shift
+PHASES=
+while true ; do
+	case "$1" in
+		configure|build|test|runtime)
+			PHASES="$PHASES,.$1" && shift ;;
+		*)	break ;;
+	esac
+done
+PHASES=${PHASES/#,}
+[[ -z "$PHASES" ]] && PHASES=".configure,.build,.test,.runtime"
+
+RELATION=".requires,.recommends"
+[[ "$1" == "suggests" ]] && RELATION=".$1" && shift
 
 (($# == 0)) && usage "PERL_VERSION missing"
 PERLVER=$1 && shift
 PLV=${PERLVER//.}
 PERL=/usr/perl5/$PERLVER/bin/perl
-[[ -x "$PERL" ]] || usage "perl $PERLVER not found"
+[[ -x "$PERL" ]] || usage "Perl $PERLVER not found"
 PERL_ARCH=$($PERL -e 'use Config; print $Config{archname}')
 
-(($# != 0)) && usage "Too much arguments"
+(($# != 0)) && usage "Too many arguments"
 
 PERL_VERSION_CONVERT="$(dirname $0)/perl-version-convert"
 [[ ! -x "$PERL_VERSION_CONVERT" ]] && printf "ERROR: perl-version-convert not found" && exit 1
 
+CACHEDIR="$WS_MACH/perl-meta-deps-cache"
+mkdir -p "$CACHEDIR"
+# Remove old entries from the cache
+find "$CACHEDIR" -type f -mtime +7 -exec rm -f {} \;
 
-printf "\n# Automatically generated dependencies based on distribution metadata\n"
 
-/usr/bin/jq -r '.prereqs|'"$PHASES"'|.requires|to_entries?|.[]|.key+" "+.value' | while read PREREQ VERSION ; do
+/usr/bin/jq -r '.prereqs|'"$PHASES"'|'"$RELATION"'|to_entries?|.[]|.key+" "+(.value|tostring)' | while read PREREQ VERSION ; do
 	# Convert perl version number to pkg(5) compatible form
 	VER=$("$PERL_VERSION_CONVERT" "$PREREQ" "$VERSION")
 	[[ "$VER" != "0" ]] && VER="@$VER" || VER=
 
-	MANIFEST="$BUILD_DIR/META-${PREREQ//::/-}"
+	CACHEFILE="$CACHEDIR/$PREREQ-$PERLVER"
 
-	# Prepare manifest
-	if [[ "$PREREQ" == "perl" ]] ; then
-		# "perl" is special case
-		cat <<#EOF > "$MANIFEST"
-			depend fmri=__TBD type=require pkg.debug.depend.file=$PREREQ \\
-				pkg.debug.depend.path=usr/perl5/$PERLVER/bin
-		EOF
-	else
-		cat <<#EOF > "$MANIFEST"
-			depend fmri=__TBD type=require pkg.debug.depend.file=${PREREQ//:://}.pm \\
-				pkg.debug.depend.path=usr/perl5/$PERLVER/lib \\
-				pkg.debug.depend.path=usr/perl5/$PERLVER/lib/$PERL_ARCH \\
-				pkg.debug.depend.path=usr/perl5/vendor_perl/$PERLVER \\
-				pkg.debug.depend.path=usr/perl5/vendor_perl/$PERLVER/$PERL_ARCH
-		EOF
+	# Resolve the dependency if not in cache already
+	if [[ ! -e "$CACHEFILE" || ("$RELATION" != ".suggests" && ! -s "$CACHEFILE") ]] ; then
+		# We must replace '::' by '-' otherwise 'pkgdepend resolve' fails
+		MANIFEST="$BUILD_DIR/META-${PREREQ//::/-}-$PERLVER"
+
+		# Prepare manifest
+		if [[ "$PREREQ" == "perl" ]] ; then
+			# "perl" is special case
+			cat <<#EOF > "$MANIFEST"
+				depend fmri=__TBD type=require pkg.debug.depend.file=$PREREQ \\
+					pkg.debug.depend.path=usr/perl5/$PERLVER/bin
+			EOF
+		else
+			cat <<#EOF > "$MANIFEST"
+				depend fmri=__TBD type=require pkg.debug.depend.file=${PREREQ//:://}.pm \\
+					pkg.debug.depend.path=usr/perl5/$PERLVER/lib \\
+					pkg.debug.depend.path=usr/perl5/$PERLVER/lib/$PERL_ARCH \\
+					pkg.debug.depend.path=usr/perl5/vendor_perl/$PERLVER \\
+					pkg.debug.depend.path=usr/perl5/vendor_perl/$PERLVER/$PERL_ARCH
+			EOF
+		fi
+
+		# Resolve dependency
+		if /usr/bin/pkgdepend resolve "$MANIFEST" ; then
+			# Remove version number and cache the result
+			cat "$MANIFEST.res" | sed -e 's/@[^ ]*//g' -e 's/-'$PLV'/-$(PLV)/g' > "$CACHEFILE"
+		else
+			if [[ "$RELATION" != ".suggests" ]] ; then
+				printf "ERROR: Prerequisite %s not found\n" "$PREREQ" >&2
+				cat "$MANIFEST"
+			fi
+			# Cache negative result
+			[[ ! -e "$CACHEFILE" ]] && > "$CACHEFILE"
+		fi
 	fi
 
-	# Resolve dependency
-	if /usr/bin/pkgdepend resolve "$MANIFEST" ; then
-		# Modify version number to pkg(5) compatible form
-		cat "$MANIFEST.res" | sed -e 's/@[^ ]*//g' -e 's/-'$PLV'/-$(PLV)/g' -e 's/\(fmri=[^ ]*\)/\1'$VER'/g'
-	else
-		printf "ERROR: Prerequisite %s not found\n" "$PREREQ" >&2
-		cat "$MANIFEST"
-	fi
+	# Use cached result, add required version number and drop runtime/perl
+	cat "$CACHEFILE" | sed -e 's/\(fmri=[^ ]*\)/\1'$VER'/g' -e '/fmri=pkg:\/runtime\/perl-\$(PLV)/d'
 done | /usr/bin/pkgfmt -u | uniq | (
 	PREV_LINE_H=
 	PREV_FMRI=
 	PREV_VER=
 	PREV_LINE_T=
 	while read LINE ; do
-		# Copy verbatim lines without "fmri="
-		[[ "${LINE//*fmri=*/FMRI}" != "FMRI" ]] && printf "%s\n" "$LINE" && continue
+		# Copy verbatim lines without "fmri=pkg:" (e.g. unresolved lines)
+		[[ "${LINE//*fmri=pkg:*/FMRI}" != "FMRI" ]] && printf "%s\n" "$LINE" && continue
 
 		LINE_H=${LINE%%fmri=*}
 		LINE_T=${LINE#*fmri=}
@@ -126,4 +156,6 @@
 		done
 	done
 	[[ -n "$PREV_LINE_H$PREV_FMRI$PREV_VER$PREV_LINE_T" ]] && printf "%s%s%s%s\n" "$PREV_LINE_H" "$PREV_FMRI" "$PREV_VER" "$PREV_LINE_T"
-)| /usr/bin/pkgfmt
+)
+
+exit 0

--
Gitblit v1.9.3