Subject: Re: pkg/36298 (improvements for pkgtools/pkg_chk)
To: None <abs@NetBSD.org, gnats-admin@netbsd.org, pkgsrc-bugs@netbsd.org,>
From: Aleksey Cheusov <cheusov@tut.by>
List: pkgsrc-bugs
Date: 06/20/2007 18:15:05
The following reply was made to PR pkg/36298; it has been noted by GNATS.

From: Aleksey Cheusov <cheusov@tut.by>
To: gnats-bugs@NetBSD.org
Cc: abs@NetBSD.org, pkg-manager@netbsd.org, pkgsrc-bugs@netbsd.org,
	gnats-admin@netbsd.org, wiz@netbsd.org
Subject: Re: pkg/36298 (improvements for pkgtools/pkg_chk)
Date: Wed, 20 Jun 2007 21:10:41 +0300

 --=-=-=
 
 > Synopsis: improvements for pkgtools/pkg_chk
 
 New patch is in attachment.
 
 Cache format is changed to that of pkg_summary.gz.
 External tool (wip/pkg_update_summary)
 discussed in pkgsrc-users@ (Subject: pkg_summary)
 is used for keeping pkg_summary.gz up-to-date
 
 
 --=-=-=
 Content-Type: text/x-patch
 Content-Disposition: attachment; filename=pkg_chk_summary.diff
 Content-Description: patch for using/updating pkg_summary.gz
 
 ? pkg_chk-1.85.diff
 ? pkg_chk_summary.diff
 Index: Makefile
 ===================================================================
 RCS file: /cvsroot/pkgsrc/pkgtools/pkg_chk/Makefile,v
 retrieving revision 1.54
 diff -u -r1.54 Makefile
 --- Makefile	19 Jun 2007 16:08:47 -0000	1.54
 +++ Makefile	20 Jun 2007 18:00:37 -0000
 @@ -12,6 +12,8 @@
  
  PKG_INSTALLATION_TYPES=	overwrite pkgviews
  
 +DEPENDS+=	pkg_update_summary-[0-9]*:../../wip/pkg_update_summary
 +
  WRKSRC=		${WRKDIR}
  EXTRACT_ONLY=	# empty
  USE_LANGUAGES=	# empty
 Index: files/pkg_chk.sh
 ===================================================================
 RCS file: /cvsroot/pkgsrc/pkgtools/pkg_chk/files/pkg_chk.sh,v
 retrieving revision 1.49
 diff -u -r1.49 pkg_chk.sh
 --- files/pkg_chk.sh	19 Jun 2007 13:45:50 -0000	1.49
 +++ files/pkg_chk.sh	20 Jun 2007 18:00:37 -0000
 @@ -176,18 +176,27 @@
  	extract_make_vars Makefile \
  		AWK GREP GZIP_CMD ID PACKAGES PKGCHK_CONF PKGCHK_NOTAGS \
  		PKGCHK_TAGS PKGCHK_UPDATE_CONF PKG_ADD PKG_DBDIR PKG_DELETE \
 -		PKG_INFO PKG_SUFX SED SORT SU_CMD TSORT
 +		PKG_INFO PKG_SUFX SED SORT SU_CMD TSORT PKG_BIN_CACHE
  	if [ -z "$PACKAGES" ];then
  	    PACKAGES=$PKGSRCDIR/packages
  	fi
      elif [ $MAKECONF != /dev/null ] ; then
  	extract_make_vars $MAKECONF PACKAGES PKGCHK_CONF PKGCHK_UPDATE_CONF \
 -			PKGCHK_TAGS PKGCHK_NOTAGS PKG_SUFX
 +			PKGCHK_TAGS PKGCHK_NOTAGS PKG_SUFX PKG_BIN_CACHE
  	if [ -z "$PACKAGES" ] ; then
  	    PACKAGES=`pwd`
  	fi
      fi
  
 +    # compress and uncompress commands
 +    if echo "$PKG_BIN_CACHE" | $GREP '[.]gz$' > /dev/null; then
 +	COMPRESS="$GZIP_CMD -c"
 +	DECOMPRESS="$GZIP_CMD -dc"
 +    else
 +	COMPRESS='cat'
 +	DECOMPRESS='cat'
 +    fi
 +
      # .tgz/.tbz to regexp
      PKG_SUFX_RE=`echo $PKG_SUFX | sed 's/[.]/[.]/'`
  
 @@ -680,6 +689,9 @@
  fi
  
  MY_TMPDIR=`mktemp -d ${TMPDIR-/tmp}/${0##*/}.XXXXXX`
 +if [ -z "$MY_TMPDIR" ]; then
 +    exit 1
 +fi
  MY_TMPFILE=$MY_TMPDIR/tmp
  
  # Hide PKG_PATH to avoid breakage in 'make' calls
 @@ -726,7 +738,7 @@
  fi
  
  if [ -n "$opt_L" ] ; then
 -    rm -f $opt_L
 +    printf '' > $opt_L
  fi
  
  basedir=$(pwd)
 @@ -741,6 +753,40 @@
      PACKAGES="$PACKAGES/All"
  fi
  
 +list_bin_pkgs (){
 +    ls -t $PACKAGES | grep "$PKG_SUFX_RE"'$' |
 +    awk "{print \"$PACKAGES/\" \$0}"
 +}
 +
 +bin_pkg_info_is_up_to_date (){
 +    if test -f "$PKG_BIN_CACHE" && \
 +	test "$PKG_BIN_CACHE" -nt "$PACKAGES"
 +    then
 +	return 0
 +    else
 +	return 1
 +    fi
 +}
 +
 +get_bin_pkg_info (){
 +    if test -z "$PKG_BIN_CACHE"; then
 +	list_bin_pkgs | xargs ${PKG_INFO} -X
 +    elif bin_pkg_info_is_up_to_date; then
 +	$DECOMPRESS "$PKG_BIN_CACHE"
 +    else
 +	pkg_update_summary "$PKG_BIN_CACHE" "$PACKAGES" \
 +	    "$DECOMPRESS" "$COMPRESS"
 +
 +	$DECOMPRESS "$PKG_BIN_CACHE"
 +    fi
 +}
 +
 +bin_pkg_info2pkgdb (){
 +    ${SED} -n -e 's|^PKGPATH=||p' \
 +	      -e 's|^PKGNAME=||p' |
 +    ${AWK} '{getline name; printf "%s:%s ", name, $0}'
 +}
 +
  if [ "`${ID} -u`" = 0 ] ; then
      SU_CMD=
  fi
 @@ -775,13 +821,7 @@
  	*)
  	    if [ -d "$PACKAGES" ] ; then
  		msg_progress Scan $PACKAGES
 -		cd $PACKAGES
 -		for f in `ls -t | grep "$PKG_SUFX_RE"'$'` ; do # Sort by time to pick up newest first
 -		    PKGDIR=`${PKG_INFO} -. -B $PACKAGES/$f|${AWK} -F= '$1=="PKGPATH"{print $2}'`
 -		    PKGNAME=`echo $f | ${SED} "s/$PKG_SUFX"'$//'`
 -		    PKGDB="${PKGDB} $PKGDIR:$PKGNAME"
 -		done
 -		PKGSRCDIR=NONE
 +		PKGDB=$(get_bin_pkg_info | bin_pkg_info2pkgdb)
  	    fi;;
      esac
  fi
 
 --=-=-=
 
 
 -- 
 Best regards, Aleksey Cheusov.
 
 --=-=-=--