-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
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"
}