? 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