Subject: pkg/30893: pkg_chk tag support needs work
To: None <pkg-manager@netbsd.org, gnats-admin@netbsd.org,>
From: None <lukem@NetBSD.org>
List: pkgsrc-bugs
Date: 08/02/2005 11:44:01
>Number: 30893
>Category: pkg
>Synopsis: pkg_chk tag support needs work
>Confidential: no
>Severity: non-critical
>Priority: medium
>Responsible: pkg-manager
>State: open
>Class: change-request
>Submitter-Id: net
>Arrival-Date: Tue Aug 02 11:44:00 +0000 2005
>Originator: Luke Mewburn
>Release: NetBSD 3.0_BETA
>Organization:
>Environment:
>Description:
pkg_chk supports the ability to add and remove tags to the
current machine's set [of tags] to control how entries
will be matched from pkgchk.conf.
There's two problems with this.
1. The tag "*" is documented to match any tag.
However, invoking
pkg_chk -D '*' ...
or
env PKGCHK_TAGS='*' pkgchk ...
doesn't work due to the `*' being expanded by shell globbing.
I have a patch to resolve this, converting pkg_chk to using
getopts(1) instead of getopt(1).
2. Even when the tag parsing is fixed, the matching algorithm
won't treat a `*' in the current machine's set as acting as
"match every entry in pkgchk.conf".
It seems that "*" is only supported as a tag on a filename
within pkgchk.conf, which seems rather useless, since you
can emulate "match all tags" by commenting out _all_ the
tags in an entry (i.e, no tags == "all systems).
The behaviour I think it should be is that providing '*'
via -D or PKGCHK_TAGS says "match all entries in pkgchk.conf"
>How-To-Repeat:
Setup pkgchk.conf with some entries containing tags
that don't match the current machine.
Invoke
pkgchk -D '*' -cv
and notice that those entries won't be checked.
>Fix:
This patch fixes the first problem.
The program's tag matching logic needs work to fix the second.
Index: files/pkg_chk.sh
===================================================================
RCS file: /cvsroot/pkgsrc/pkgtools/pkg_chk/files/pkg_chk.sh,v
retrieving revision 1.16
diff -p -p -u -r1.16 pkg_chk.sh
--- files/pkg_chk.sh 1 Jun 2005 14:14:47 -0000 1.16
+++ files/pkg_chk.sh 2 Aug 2005 09:58:19 -0000
@@ -516,38 +516,32 @@ verbose()
fi
}
-args=$(getopt BC:D:L:P:U:abcfghiklNnrsuv $*)
-if [ $? != 0 ]; then
- opt_h=1
-fi
-set -- $args
-while [ $# != 0 ]; do
- case "$1" in
- -a ) opt_a=1 ; opt_c=1 ;;
- -B ) opt_B=1 ; opt_i=1 ;;
- -b ) opt_b=1 ;;
- -C ) opt_C="$2" ; shift;;
- -c ) opt_c=1 ;;
- -D ) opt_D="$2" ; shift;;
- -f ) opt_f=1 ;;
- -g ) opt_g=1 ;;
- -h ) opt_h=1 ;;
- -i ) opt_i=1 ;;
- -k ) opt_k=1 ;;
- -L ) opt_L="$2" ; shift;;
- -l ) opt_l=1 ;;
- -N ) opt_N=1 ;;
- -n ) opt_n=1 ;;
- -P ) opt_P="$2" ; shift;;
- -r ) opt_r=1 ; opt_i=1 ;;
- -s ) opt_s=1 ;;
- -U ) opt_U="$2" ; shift;;
- -u ) opt_u=1 ; opt_i=1 ;;
- -v ) opt_v=1 ;;
- -- ) shift; break ;;
+while getopts BC:D:L:P:U:abcfghiklNnrsuv ch; do
+ case "$ch" in
+ a ) opt_a=1 ; opt_c=1 ;;
+ B ) opt_B=1 ; opt_i=1 ;;
+ b ) opt_b=1 ;;
+ C ) opt_C="$OPTARG" ;;
+ c ) opt_c=1 ;;
+ D ) opt_D="$OPTARG" ;;
+ f ) opt_f=1 ;;
+ g ) opt_g=1 ;;
+ h | \?) opt_h=1 ;;
+ i ) opt_i=1 ;;
+ k ) opt_k=1 ;;
+ L ) opt_L="$OPTARG" ;;
+ l ) opt_l=1 ;;
+ N ) opt_N=1 ;;
+ n ) opt_n=1 ;;
+ P ) opt_P="$OPTARG" ;;
+ r ) opt_r=1 ; opt_i=1 ;;
+ s ) opt_s=1 ;;
+ U ) opt_U="$OPTARG" ;;
+ u ) opt_u=1 ; opt_i=1 ;;
+ v ) opt_v=1 ;;
esac
- shift
done
+shift $(($OPTIND - 1))
if [ -z "$opt_b" -a -z "$opt_s" ];then
opt_b=1; opt_s=1;