attila <att...@stalphonsos.com> writes:

> Jasper Lievisse Adriaanse <jas...@openbsd.org> writes:
>
>> On Thu, Aug 13, 2015 at 04:09:02PM -0500, attila wrote:
>>> 
>>> Jasper Lievisse Adriaanse <jas...@openbsd.org> writes:
>>> 
>>> > On Tue, Aug 11, 2015 at 01:20:24PM -0500, attila wrote:
>>> >> Hello tech@,
>>> >> 
>>> >> On the 6 Aug snap I ran into this issue:
>>> >> 
>>> >>   $ pkg_info | grep libevent
>>> >>   libevent-2.0.22     event notification library
>>> >>   $ pkg-config --atleast-version=2.0.1 libevent && echo yes
>>> >>   Argument "22-stabl" isn't numeric in numeric eq (==) at 
>>> >> /usr/bin/pkg-config line 662.
>>> >>   yes
>>> >> 
>>> >> So it works but spits out that error.  The issue is that the libevent
>>> >> port reports its version as 2.0.22-stable, which does not follow the
>>> >> convention used by the compare() sub in pkg-config.  The attached
>>> >> patch gets rid of the error albeit in a very pointilistic way; perhaps
>>> >> a more general solution is desired, but I'm not sure what the best
>>> >> approach is, especially given that there is something called
>>> >> pkg-config available pretty much everywhere but based on very
>>> >> different implementations...
>>> >> 
>>> >> It doesn't appear as though my patch introduces any regressions,
>>> >> although I'm still sussing out how the regression tests work so I'm
>>> >> not sure if I'm doing anything wrong... it appears that five of
>>> >> pkg-config's regression tests fail regardless of my patch:
>>> >> 
>>> >>   FAIL usr.bin/pkg-config/static-cflags2
>>> >>   FAIL usr.bin/pkg-config/static-libs2
>>> >>   FAIL usr.bin/pkg-config/static-libs3
>>> >>   FAIL usr.bin/pkg-config/static-libs4
>>> >>   FAIL usr.bin/pkg-config/missing-req-2
>>> >> 
>>> >> In all cases it looks like the difference is ordering, except for the
>>> >> last where two errors are produced but only one is expected.  I'll
>>> >> work on a patch to fix these failures next.
>>> > That's indeed the case and patches to fix that are welcome.
>>> >  
>>> >> Feedback, comments most welcome.
>>> > Could you please add regress tests for this issue you're solving too?
>>> 
>>> This turned out to be not so much difficult as cognitive
>>> dissonance-inducing.  The details are numbingly boring but I'll
>>> happily discuss if there's an issue.  In the end I have done what you
>>> asked.
>>> 
>>> The first patch attached modifies pkg-config itself in the following
>>> ways:
>>> 
>>> * Adds a (looks like libevent-specific) fix to compare() so that
>>>   libevent's version number in e.g. libevent.pc (2.0.22-stable) does
>>>   not cause warnings;
>>> * Hoists the code that redirected stderr -> stdout when
>>>   --errors-to-stdout was specified from say_msg() into the main
>>>   program, so that such warnings (if they ever appear again) appear in
>>>   the .got files produced by regression tests;
>>> * Cleans up a couple stylistic nits (add a space between ")" and "{")
>>>   in a few places to be consistent with how all the other Perl code
>>>   looks.
>>> 
>>> The second patch attached cleans up the failing regression tests.
>>> I've verified that our pkg-config produces the same output as the(a?)
>>> one on at least Linux given our test cases, and manually examined all
>>> the output.  It looks right to me.
>>> 
>>> As always feedback, comments, beatings most welcome.
>> Could you please send the spacing as a separate diff? I'm fine with that 
>> going
>> in first, but it's making it less obvious where the real goodies are ;-)
>>
>
> This is reminding me of a Troma movie: I keep sticking a fork in its
> eye but the beast just won't go down...
>
> Forget my previous patches.  There are two new patches attached.
>
> First patch in src/usr.bin/pkg-config does the following:
>
> 1. Factors out the regular expression used to check a version number
>    for validity into a variable so that we have the same idea about
>    this everywhere;
> 2. Uses this regexp in the main loop;
> 3. Uses this regexp in compare() and adjusts the captured subexp
>    variables used to get the components of the optional suffix
>    e.g. "alpha1";
> 4. Hoists the stderr->stdout redirection code to early in the main
>    program for the same reason my previous patch did (which, BTW,
>    helped me find bugs in my patch after earlier versions of it caused
>    other regression tests to fail, so... yay?).
>
> Second patch in src/regress/usr.bin/pkg-config does the following:
>
> 1. Cleans up the broken tests that were expecting the wrong thing;
> 2. Adds five new tests to make sure I didn't screw anything up,
>    which includes two new files in pcdir.
>
> If this patch is acceptable I'll submit another with whitespace
> cleanups.
>
> As usual feedback, comments most welcome.
>
> Pax, -A

Sigh.  My patches got mangled by emacs in another new and exciting
way.  Here they are inline:

Index: pkg-config
===================================================================
RCS file: /cvs/src/usr.bin/pkg-config/pkg-config,v
retrieving revision 1.85
diff -u -p -r1.85 pkg-config
--- pkg-config  17 Nov 2014 22:16:23 -0000      1.85
+++ pkg-config  14 Aug 2015 19:11:33 -0000
@@ -48,6 +48,10 @@ my $found_uninstalled = 0;
 
 my $version = '0.27.1'; # pretend to be this version of pkgconfig
 
+# Regexp that captures our idea of a version number which accomodates
+# version numbers found in practice in e.g. the ports tree:
+my $vers_regexp = qr/^([\d\.]+)(|(-stable|rc|beta|alpha|[a-zA-Z])(|\d+))*$/;
+
 my %configs = ();
 setup_self();
 
@@ -109,6 +113,17 @@ GetOptions(        'debug'                 => 
\$mode{debug},
                'define-variable=s'     => $variables,
        );
 
+# If --errors-to-stdout was given, close STDERR (to be safe),
+# then dup the output to STDOUT and delete the key from %mode so we
+# won't keep checking it. STDERR stays dup'ed.
+# We do this early so any other warnings also get redirected, since
+# they might indicate a bug that a regression test should catch.
+if ($mode{estdout}) {
+       close(STDERR);
+       open(STDERR, ">&STDOUT") or die "Can't dup STDOUT: $!";
+       delete($mode{estdout});
+}
+
 # Unconditionally switch to static mode on static arches as --static
 # may not have been passed explicitly, but we don't want to re-order
 # and simplify the libs like we do for shared architectures.
@@ -166,7 +181,7 @@ while (@ARGV){
        my $op = undef;
        my $v = undef;
        if (@ARGV >= 2  && $ARGV[0] =~ /^[<=>!]+$/ &&
-           $ARGV[1] =~ /^[\d\.]+[\w\.]*$/) {
+           $ARGV[1] =~ $vers_regexp) {
                $op = shift @ARGV;
                $v = shift @ARGV;
        }
@@ -623,30 +638,23 @@ sub compare
        return 0 if ($a eq $b);
 
        # is there a valid non-numeric suffix to deal with later?
-       # accepted are (in order): a(lpha) < b(eta) < rc < ' '.
+       # accepted are listed in $vers_regexp, above, and are compared
+       # in alphabetical order, so e.g. 'beta' beats 'alpha'.
        # suffix[0] is the 'alpha' part, suffix[1] is the '1' part in 'alpha1'.
-       if ($a =~ s/(rc|beta|b|alpha|a)(\d+)$//) {
-               say_debug("valid suffix $1$2 found in $a$1$2.");
-               $suffix_a[0] = $1;
-               $suffix_a[1] = $2;
-       }
-
-       if ($b =~ s/(rc|beta|b|alpha|a)(\d+)$//) {
-               say_debug("valid suffix $1$2 found in $b$1$2.");
-               $suffix_b[0] = $1;
-               $suffix_b[1] = $2;
-       }
-
-       # The above are standard suffixes; deal with single alphabetical
-       # suffixes too, e.g. 1.0.1h
-       if ($a =~ s/([a-zA-Z]){1}$//) {
-           say_debug("valid suffix $1 found in $a$1.");
-           $suffix_a[0] = $1;
-       }
-
-       if ($b =~ s/([a-zA-Z]){1}$//) {
-           say_debug("valid suffix $1 found in $b$1.");
-           $suffix_b[0] = $1;
+       # $2 will be the optional separator (currently nothing or dash)
+       if ($a =~ $vers_regexp && ($3 || $4)) {
+               $a = $1;
+               say_debug("valid suffix $3$4 found in $a$3$4");
+               $suffix_a[0] = $3;
+               $suffix_a[0] =~ s/^-//;
+               $suffix_a[1] = $4 || 0;
+       }
+       if ($b =~ $vers_regexp && ($3 || $4)) {
+               $b = $1;
+               say_debug("valid suffix $3$4 found in $b$3$4");
+               $suffix_b[0] = $3;
+               $suffix_b[0] =~ s/^-//;
+               $suffix_b[1] = $4 || 0;
        }
 
        my @a = split(/\./, $a);
@@ -823,15 +831,6 @@ sub say_warning
 sub say_msg
 {
        my $str = shift;
-
-       # If --errors-to-stdout was given, close STDERR (to be safe),
-       # then dup the output to STDOUT and delete the key from %mode so we
-       # won't keep checking it. STDERR stays dup'ed.
-       if ($mode{estdout}) {
-               close(STDERR);
-               open(STDERR, ">&STDOUT") or die "Can't dup STDOUT: $!";
-               delete($mode{estdout});
-       }
 
        print STDERR $str . "\n";
 }



Index: Makefile
===================================================================
RCS file: /cvs/src/regress/usr.bin/pkg-config/Makefile,v
retrieving revision 1.49
diff -u -p -r1.49 Makefile
--- Makefile    2 Nov 2014 10:34:52 -0000       1.49
+++ Makefile    14 Aug 2015 19:14:19 -0000
@@ -38,6 +38,10 @@ REGRESS_TARGETS=cmp-vers1-1 \
                cmp-vers7-2 \
                cmp-vers7-3 \
                cmp-vers7-4 \
+               cmp-vers8-1 \
+               cmp-vers8-2 \
+               cmp-vers8-3 \
+               cmp-vers8-4 \
                corrupt1 \
                corrupt2 \
                corrupt3 \
@@ -79,7 +83,8 @@ REGRESS_TARGETS=cmp-vers1-1 \
                variables-2 \
                variables-3 \
                variables-4 \
-               variables-5
+               variables-5 \
+               dash-stable
 
 PKG_CONFIG?=   pkg-config
 PCONFIG =      PKG_CONFIG_PATH=${.CURDIR}/pcdir/ ${PKG_CONFIG}
@@ -343,6 +348,30 @@ cmp-vers7-4:
        @${VPCONFIG} "vers3 > 1.0.1"
        @diff -u ${WANT} ${GOT}
 
+cmp-vers8-1:
+       # Test -stable version (2.0.22-stable >= 2.0.22)
+       @touch ${WANT}
+       @${VPCONFIG} "dash-stable > 2.0.22"
+       @diff -u ${WANT} ${GOT}
+
+cmp-vers8-2:
+       # Test -stable version (2.0.22-stable >= 2.0.22beta)
+       @touch ${WANT}
+       @${VPCONFIG} "dash-stable > 2.0.22beta"
+       @diff -u ${WANT} ${GOT}
+
+cmp-vers8-3:
+       # Test -stable version (2.0.22-stable >= 2.0.22beta2)
+       @touch ${WANT}
+       @${VPCONFIG} "dash-stable > 2.0.22beta2"
+       @diff -u ${WANT} ${GOT}
+
+cmp-vers8-4:
+       # Test -stable version (2.0.22rc1 < 2.0.22-stable)
+       @touch ${WANT}
+       @${VPCONFIG} "rc1 < 2.0.22-stable"
+       @diff -u ${WANT} ${GOT}
+
 # Tests for various environment variables
 builddir:
        # Test PKG_CONFIG_TOP_BUILD_DIR
@@ -375,7 +404,7 @@ static-cflags1:
 
 static-cflags2:
        # Test grabbing Cflags (with Requires.private)
-       @echo "-I/usr/local/include/foo -I/usr/local/include" > ${WANT}
+       @echo "-I/usr/local/include -I/usr/local/include/foo" > ${WANT}
        @${VPCONFIG} --cflags --static static2
        @diff -u ${WANT} ${GOT}
 
@@ -387,19 +416,19 @@ static-libs1:
 
 static-libs2:
        # Test grabbing Libs.private from Requires in order
-       @echo "-L/usr/local/lib -lc -lm -ll -lutil -lz" > ${WANT}
+       @echo "-L/usr/local/lib -lutil -lz -lc -lm -ll" > ${WANT}
        @${VPCONFIG} --libs --static static2
        @diff -u ${WANT} ${GOT}
 
 static-libs3:
        # Test grabbing Libs.private from Requires.private in order
-       @echo "-L/tmp/lib -L/tmp/lib/foo -L/usr/local/lib -lbaz\ quux -lc -lm 
-ll -lutil -lz" > ${WANT}
+       @echo "-L/usr/local/lib -L/tmp/lib -L/tmp/lib/foo -lutil -lz -lc -lm 
-ll -lbaz\ quux" > ${WANT}
        @${VPCONFIG} --libs --static static3
        @diff -u ${WANT} ${GOT}
 
 static-libs4:
        # Test Requires.private
-       @echo "-L/public-dep/lib -L/private-dep/lib -L/requires-test/lib 
-lpublic-dep -lprivate-dep -lrequires-test" > ${WANT}
+       @echo "-L/requires-test/lib -L/private-dep/lib -L/public-dep/lib 
-lrequires-test -lprivate-dep -lpublic-dep" > ${WANT}
        @${VPCONFIG} --libs --static requires-test
        @diff -u ${WANT} ${GOT}
 
@@ -419,7 +448,8 @@ missing-req-1:
 
 missing-req-2:
        # Test for missing packages in Requires (cflags)
-       @echo "Package nonexisting was not found in the pkg-config search path" 
> ${WANT}
+       @echo "Package nonexisting2 was not found in the pkg-config search 
path" > ${WANT}
+       @echo "Package nonexisting was not found in the pkg-config search path" 
>> ${WANT}
        @if ${VPCONFIG} --cflags missing-req; then false; fi
        @diff -u ${WANT} ${GOT}
 
@@ -553,6 +583,12 @@ variables-5:
        # Test --variable
        @echo ' -lfoo-1' > ${WANT}
        @${VPCONFIG} --libs variables
+       @diff -u ${WANT} ${GOT}
+
+dash-stable:
+       # Test --atleast-version=2.0.1 against 2.0.22-stable
+       @touch ${WANT}
+       @${VPCONFIG} --atleast-version=2.0.1 dash-stable
        @diff -u ${WANT} ${GOT}
 
 clean:
Index: pcdir/dash-stable.pc
===================================================================
RCS file: pcdir/dash-stable.pc
diff -N pcdir/dash-stable.pc
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ pcdir/dash-stable.pc        14 Aug 2015 19:14:19 -0000
@@ -0,0 +1,3 @@
+Name: dash-stable
+Description: pkg-config(1) regress file
+Version: 2.0.22-stable
Index: pcdir/rc1.pc
===================================================================
RCS file: pcdir/rc1.pc
diff -N pcdir/rc1.pc
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ pcdir/rc1.pc        14 Aug 2015 19:14:19 -0000
@@ -0,0 +1,3 @@
+Name: rc1
+Description: pkg-config(1) regress file
+Version: 2.0.22rc1

Reply via email to