? DIFF
? changelog
Index: Makefile
===================================================================
RCS file: /cvsroot/pkgsrc/pkgtools/pkg_chk/Makefile,v
retrieving revision 1.79
diff -u -u -r1.79 Makefile
--- Makefile	3 Aug 2012 10:35:31 -0000	1.79
+++ Makefile	20 Aug 2012 14:13:06 -0000
@@ -1,6 +1,6 @@
 # $NetBSD: Makefile,v 1.79 2012/08/03 10:35:31 abs Exp $
 
-DISTNAME=	pkg_chk-2.0.4
+DISTNAME=	pkg_chk-2.0.5
 CATEGORIES=	pkgtools
 MASTER_SITES=	# empty
 DISTFILES=	# empty
@@ -31,7 +31,7 @@
 SUBST_STAGE.vars=	pre-configure
 SUBST_MESSAGE.vars=	Configuring sources.
 SUBST_FILES.vars=	pkg_chk.sh pkg_chk.8
-SUBST_VARS.vars=	AWK GREP GZCAT GZIP_CMD ID MAKE MAKECONF MKTEMP \
+SUBST_VARS.vars=	AWK BZCAT GREP GZCAT GZIP_CMD ID MAKE MAKECONF MKTEMP \
 			PKG_ADD PKG_ADMIN PKG_DELETE PKG_INFO \
 			SED SH SORT TSORT PREFIX PKG_DBDIR XARGS
 
Index: files/pkg_chk.sh
===================================================================
RCS file: /cvsroot/pkgsrc/pkgtools/pkg_chk/files/pkg_chk.sh,v
retrieving revision 1.69
diff -u -u -r1.69 pkg_chk.sh
--- files/pkg_chk.sh	3 Aug 2012 10:35:31 -0000	1.69
+++ files/pkg_chk.sh	20 Aug 2012 14:13:06 -0000
@@ -7,7 +7,7 @@
 #	out automatically installed packages
 # TODO: List user-installed packages that are not in config
 
-# Copyright (c) 2012 David Brownlee (Standard 2 clause BSD licence)
+# Copyright (c) 2001-2012 David Brownlee (Standard 2 clause BSD licence)
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -34,33 +34,24 @@
 
 PATH=${PATH}:/usr/sbin:/usr/bin
 
-SUMMARY_FILE=pkg_summary.gz
-OLD_SUMMARY_FILE=pkg_chk-summary
-
-is_binary_available()
-    {
-    if [ -n "$PKGDB" ]; then
-	for iba_pkg in $PKGDB; do
-	    case $iba_pkg in
-		*:"$1")
-		    return 0;
-		;;
-	    esac
-	done
-	return 1;
-    else
-	if [ -f "$PACKAGES/$1$PKG_SUFX" ]; then
-	    return 0;
-	else
-	    return 1;
-	fi
-    fi
-    }
+SUMMARY_FILES="pkg_summary.bz2 pkg_summary.gz pkg_summary.txt"
 
 bin_pkg_info2pkgdb()
     {
-    ${AWK} '/^PKGNAME=/ {sub("^PKGNAME=", ""); PKGNAME=$0} \
-	    /^PKGPATH=/ {sub("^PKGPATH=", ""); printf("%s:%s ", $0, PKGNAME)}'
+    # For each PKGPATH return a set of valid package versions
+    ${AWK} -F= '
+    $1=="PKGNAME"{pkgname=$2}
+    $1=="PKGPATH"{pkgpath=$2}
+    NF==0 {
+      if (pkgpath && pkgname) pkgs[pkgpath]=pkgs[pkgpath]" "pkgname;
+      pkgpath="";
+      pkgname=""
+    }
+    END {
+      if (pkgpath && pkgname) pkgs[pkgpath]=pkgname;
+      for (pkg in pkgs) { sub(" ", "",pkgs[pkg]); print pkg ":" pkgs[pkg]; }
+    }
+    '
     }
 
 check_packages_installed()
@@ -75,13 +66,53 @@
 	elif [ -n "$opt_s" ] ; then
 	    extract_pkg_vars $pkgdir PKGNAME
 	else
-	    PKGNAME=`pkgdir2pkgname $pkgdir`
+	    PKGNAMES="$(pkgdir2pkgnames $pkgdir)"
+	    case "$PKGNAMES" in
+		# multiple packages - determine which (if any) is installed
+		*' '* )
+		    # Sort so highest matching package picked first
+		    PKGNAMES="$(echo $PKGNAMES | tr ' ' '\n' | ${SORT} -r)"
+		    for pkgname in $PKGNAMES ; do
+			if [ -d $PKG_DBDIR/$pkgname ];then
+			    PKGNAME=$pkgname
+			    break;
+			fi
+		    done
+		    # In the absence of any better way to determine which
+		    # should be picked, use the highest version
+		    if [ -z "$PKGNAME" ] ; then
+			PKGNAME=$(echo $PKGNAMES | ${SED} 's/ .*//')
+		    fi
+		    ;;
+		* ) PKGNAME=$PKGNAMES ;;
+	    esac
 	fi
 	if [ -z "$PKGNAME" ]; then
 	    MISSING_DONE=$MISSING_DONE" "$pkgdir
 	    continue
 	fi
-	if [ ! -d $PKG_DBDIR/$PKGNAME ];then
+
+	if [ -d "$PKG_DBDIR/$PKGNAME" ];then
+	    if [ -n "$opt_B" ];then
+		# sort here temporarily to handle older +BUILD_VERSION
+		current_build_ver=$(get_build_ver | ${SED} 's|.*\$Net''BSD\: ||' | ${SORT} -u)
+		installed_build_ver=$(${SED} 's|.*\$Net''BSD\: ||' $PKG_DBDIR/$PKGNAME/+BUILD_VERSION | ${SORT} -u)
+		if [ x"$current_build_ver" != x"$installed_build_ver" ];then
+		    msg "$pkgdir - $PKGNAME build_version mismatch"
+		    verbose "--current--"
+		    verbose "$current_build_ver"
+		    verbose "--installed--"
+		    verbose "$installed_build_ver"
+		    verbose "----"
+		    MISMATCH_TODO="$MISMATCH_TODO $PKGNAME"
+		else
+		    verbose "$pkgdir - $PKGNAME OK"
+		fi
+	    else
+		verbose "$pkgdir - $PKGNAME OK"
+	    fi
+	else
+	    # XXX need to handle multiple matching package case
 	    msg_n "$pkgdir - "
 	    pkg=$(echo $PKGNAME | ${SED} 's/-[0-9].*//')
 	    pkginstalled=$(sh -c "${PKG_INFO} -e $pkg" || true)
@@ -112,25 +143,6 @@
 		msg_n " (has binary package)"
 	    fi
 	    msg
-	else
-	    if [ -n "$opt_B" ];then
-		# sort here temporarily to handle older +BUILD_VERSION
-		current_build_ver=$(get_build_ver | ${SED} 's|.*\$Net''BSD\: ||' | ${SORT} -u)
-		installed_build_ver=$(${SED} 's|.*\$Net''BSD\: ||' $PKG_DBDIR/$PKGNAME/+BUILD_VERSION | ${SORT} -u)
-		if [ x"$current_build_ver" != x"$installed_build_ver" ];then
-		    msg "$pkgdir - $PKGNAME build_version mismatch"
-		    verbose "--current--"
-		    verbose "$current_build_ver"
-		    verbose "--installed--"
-		    verbose "$installed_build_ver"
-		    verbose "----"
-		    MISMATCH_TODO="$MISMATCH_TODO $PKGNAME"
-		else
-		    verbose "$PKGNAME: OK"
-		fi
-	    else
-		verbose "$PKGNAME: OK"
-	    fi
 	fi
     done
     }
@@ -234,13 +246,13 @@
 	    extract_make_vars $MAKECONF PACKAGES PKGCHK_CONF \
 			PKGCHK_UPDATE_CONF PKGCHK_TAGS PKGCHK_NOTAGS PKG_SUFX
 	    if [ -z "$PACKAGES" ] ; then
-		PACKAGES=`pwd`
+		PACKAGES="$(pwd)"
 	    fi
 	fi
     fi
 
     # .tgz/.tbz to regexp
-    PKG_SUFX_RE=`echo $PKG_SUFX | ${SED} 's/[.]/[.]/'`
+    PKG_SUFX_RE="$(echo $PKG_SUFX | ${SED} 's/[.]/[.]/')"
 
     if [ ! -d $PKG_DBDIR ] ; then
 	fatal "Unable to access PKG_DBDIR ($PKG_DBDIR)"
@@ -294,15 +306,15 @@
 
 get_bin_pkg_info()
     {
-    summary_file=$PACKAGES/$SUMMARY_FILE
-    if [ -f $summary_file ] ; then
-	if [ -z "$(find $PACKAGES -type f -newer $summary_file -name '*.t[bg]z')" ] ; then
-	    msg_progress Reading $summary_file
-	    ${GZCAT} $summary_file
-	    return;
+    for summary_file in $SUMMARY_FILES ; do
+	if [ -f $PACKAGES/$summary_file ] ; then
+	    if [ -z "$(find $PACKAGES -type f -newer $PACKAGES/$summary_file -name '*.tgz')" ] ; then
+		uncompress_filter $summary_file < $PACKAGES/$summary_file
+		return;
+	    fi
+	    echo "*** Ignoring $summary_file as newer pkgs in $PACKAGES" >&2
 	fi
-	echo "*** Ignoring $SUMMARY_FILE as PACKAGES contains newer files" >&2
-    fi
+    done
     msg_progress Scan $PACKAGES
     list_bin_pkgs | ${XARGS} ${PKG_INFO} -X
     }
@@ -320,6 +332,22 @@
     cat $MY_TMPFILE
     }
 
+is_binary_available()
+    {
+    if [ -n "$PKGDB" ]; then
+        case "$(pkgdir2pkgnames)" in
+	    *"$1"*) return 0;;
+	esac
+	return 1
+    else
+	if [ -f "$PACKAGES/$1$PKG_SUFX" ]; then
+	    return 0;
+	else
+	    return 1;
+	fi
+    fi
+    }
+
 list_bin_pkgs ()
     {
     # XXX ls -t is usually enough to get newer packages first, but it
@@ -343,12 +371,12 @@
     # Convert passed in list of pkgdirs to a list of binary package files
     pkglist=''
     for pkgdir in $* ; do
-	pkgname=`pkgdir2pkgname $pkgdir`
+	pkgname="$(pkgdir2pkgnames $pkgdir| ${SED} 's/ .*//')"
 	if [ -z "$pkgname" ]; then
 	    fatal_later "$pkgdir - Unable to extract pkgname"
 	    continue
 	fi
-	if is_binary_available $pkgname ; then
+	if is_binary_available "$pkgname" ; then
 	    pkglist="$pkglist $pkgname$PKG_SUFX"
 	else
 	    fatal_later "$pkgname - no binary package found"
@@ -398,17 +426,22 @@
     printf "$pairlist" | ${TSORT}
     }
 
-pkgdir2pkgname()
+pkgdir2pkgnames()
     {
     pkgdir=$1
+    oIFS="$IFS"
+    IFS="
+"
+    # PKGDIR is a newline separated list of "pkgdir:pkgnamever[ pkgnamever ..]"
     for pkgline in $PKGDB ; do
-	case $pkgline in
+	case "$pkgline" in
 	    "$pkgdir:"*)
 		echo $pkgline | ${SED} 's/[^:]*://'
-		return;
+		break;
 	    ;;
 	esac
     done
+    IFS="$oIFS"
     }
 
 determine_tags()
@@ -666,6 +699,15 @@
     fi
     }
 
+uncompress_filter()
+    {
+    case "$1" in
+	*.gz) ${GZCAT} ;;
+	*.bz2) ${BZCAT} ;;
+	*)	cat ;;
+    esac
+    }
+
 set_path()
     {
     arg=$1
@@ -789,6 +831,7 @@
 unset PKG_PATH || true
 
 test -n "$AWK"	      || AWK="@AWK@"
+test -n "$BZCAT"      || BZCAT="@BZCAT@"
 test -n "$GREP"	      || GREP="@GREP@"
 test -n "$GZCAT"      || GZCAT="@GZCAT@"
 test -n "$GZIP_CMD"   || GZIP_CMD="@GZIP_CMD@"
@@ -873,22 +916,24 @@
 	done
 fi
 
-AWK_PARSE_SUMMARY='$1=="PKGNAME"{pkgname=$2} $1=="PKGPATH"{pkgpath=$2} NF==0{if (pkgpath && pkgname) print pkgpath ":" pkgname; pkgpath=""; pkgname=""} END{if (pkgpath && pkgname) print pkgpath ":" pkgname}'
-
 if [ -n "$opt_b" -a -z "$opt_s" ] ; then
     case $PACKAGES in
 	http://*|ftp://*)
-	    PKGDB=`ftp -o - $PACKAGES/$SUMMARY_FILE | ${GZIP_CMD} -cd \
-		| ${AWK} -F= "$AWK_PARSE_SUMMARY"`
-	    if [ -z "$PKGDB" ]
-	    then
-		PKGDB=`ftp -o - $PACKAGES/$OLD_SUMMARY_FILE`
-	    fi;;
+	    for summary_file in $SUMMARY_FILES ; do
+		verbose "parse pkg_summary $PACKAGES/$summary_file"
+	        PKGDB="$(ftp -o - $PACKAGES/$summary_file \
+		    | uncompress_filter $summary_file | bin_pkg_info2pkgdb)"
+		if [ -n "$PKGDB" ]; then
+		    break
+		fi
+	    done
+	    ;;
 	*)
 	    if [ -d "$PACKAGES" ] ; then
-		PKGDB=$(get_bin_pkg_info | bin_pkg_info2pkgdb)
+		PKGDB="$(get_bin_pkg_info | bin_pkg_info2pkgdb)"
 		PKGSRCDIR=NONE
-	    fi;;
+	    fi
+	    ;;
     esac
 fi