OpenPKG CVS Repository
  http://cvs.openpkg.org/
  ____________________________________________________________________________

  Server: cvs.openpkg.org                  Name:   Michael van Elst
  Root:   /e/openpkg/cvs                   Email:  [EMAIL PROTECTED]
  Module: openpkg-src                      Date:   03-Jan-2003 14:47:40
  Branch: HEAD                             Handle: 2003010313474000

  Modified files:
    openpkg-src/openpkg-tool
                            openpkg-build.pl openpkg-index.pl

  Log:
    support for parameter-based dependencies, partially drop %options
    support

  Summary:
    Revision    Changes     Path
    1.25        +89 -39     openpkg-src/openpkg-tool/openpkg-build.pl
    1.7         +22 -82     openpkg-src/openpkg-tool/openpkg-index.pl
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: openpkg-src/openpkg-tool/openpkg-build.pl
  ============================================================================
  $ cvs diff -u -r1.24 -r1.25 openpkg-build.pl
  --- openpkg-src/openpkg-tool/openpkg-build.pl 3 Jan 2003 10:08:50 -0000       1.24
  +++ openpkg-src/openpkg-tool/openpkg-build.pl 3 Jan 2003 13:47:40 -0000       1.25
  @@ -231,6 +231,9 @@
   
   sub vcmp ($$) {
       my($a,$b) = @_;
  +
  +    return 0 if $a eq $b;
  +
       my($av,$ar) = $a =~ /^(.*?)(?:\-([\d\.]+))?$/;
       my($bv,$br) = $b =~ /^(.*?)(?:\-([\d\.]+))?$/;
       my($c);
  @@ -302,18 +305,67 @@
       return $url;
   }
   
  +sub parse_provides ($) {
  +    my($s) = @_;
  +    my($nam,$val,$pre,$with,$pxy,$ver,$rel);
  +
  +    ($nam,$val) = $s =~ /^(\S+)\s*(?:=\s*(\S*?))?$/;
  +
  +    #
  +    # build options are encoded as a Requirement
  +    # <packagename>::<buildoption> = <value>
  +    #
  +    # since the value is interpreted as a version number
  +    # you can only do equality tests
  +    #
  +    if (($pre,$with) = $nam =~ /^(\S+?)::(\S*)$/) {
  +        $val =~ s/(?:\%([0-9a-fA-F][0-9a-fA-F]))/chr(hex($1))/eg;
  +        ($ver,$rel,$pxy) = ($val, '', undef);
  +    } else {
  +        ($ver,$rel,$pxy) = $val =~ /^([^\s\-]+)-([^\s\+]+)(\+PROXY)?$/;
  +    }
  +
  +    return {
  +        name    => $nam,
  +        version => $ver,
  +        release => $rel,
  +        proxy   => $pxy,
  +        prefix  => $pre,
  +        with    => $with
  +    };
  +}
  +
   sub get_installed () {
       my(%map);
       my(@l) = `$RPM_NPRIV --provides -qa`;
  +    my($p);
  +    my($nam,$val,%options);
   
       foreach (@l) {
  -        /^(\S+)\s*(?:=\s*([^\s\-]+)-([^\s\+]+)(\+PROXY)?)?$/;
  -        push(@{$map{$1}->{"$2-$3"}}, {
  -            name       => $1,
  -            version    => (defined $2 ? $2 : '*'),
  -            release    => (defined $3 ? $3 : '*'),
  -            PROXY      => $4
  -        });
  +        $p = parse_provides($_);
  +
  +        if (defined $p->{with}) {
  +            $options{$p->{prefix}}->{$p->{with}} = $p->{version}
  +        }
  +
  +        push @{$map{$p->{name}}->{"$p->{version}-$p->{release}"}}, {
  +            name       => $p->{name},
  +            version    => (defined $p->{version} ? $p->{version} : '*'),
  +            release    => (defined $p->{release} ? $p->{release} : '*'),
  +            PROXY      => $p->{proxy}
  +        };
  +    }
  +
  +    #
  +    # options are provided for a package
  +    # apply them to all instances of the package
  +    #
  +    foreach $nam (keys %options) {
  +        foreach $val (keys %{$map{$nam}}) {
  +            foreach (@{$map{$nam}->{$val}}) {
  +                $_->{OPTIONS} = $options{$nam};
  +            }
  +        }
       }
   
       return \%map;
  @@ -378,10 +430,10 @@
   sub parse_options ($) {
       my($l) = @_;
       $l = join("\n", @$l) if ref $l;
  -    return if ($l !~ m/(--define|%option\s+)/s);
  +    return if ($l !~ m/(--define|\%option\s+)/s);
       my $with = {};
       $l =~ s/--define\s*'(\S+)\s+(\S+?)'/$with->{$1} = $2, ''/sge; # before 
openpkg-20021230
  -    $l =~ s/%option\s+(\S+)\s+(\S+)/$with->{$1} = $2, ''/sge;     # after  
openpkg-20021230
  +    $l =~ s/\%option\s+(\S+)\s+(\S+)/$with->{$1} = $2, ''/sge;     # after  
openpkg-20021230
       return $with;
   }
   
  @@ -514,7 +566,6 @@
                   @bprereq   = ();
                   @provides  = ();
                   @conflicts = ();
  -                %options   = ();
               }
   
               if (!(defined $href) && /<Repository.*?href="([^"]*)"/) {
  @@ -543,10 +594,6 @@
                   $section = undef;
               } elsif ($section eq 'description') {
                   $desc .= $_;
  -            } elsif ($tag eq 'Options') {
  -                $section = 'options' if $useit;
  -            } elsif ($tag eq '/Options') {
  -                $section = undef;
               } elsif ($tag eq 'PreReq') {
                   $section = 'prereq' if $useit;
               } elsif ($tag eq '/PreReq') {
  @@ -574,11 +621,7 @@
               } elsif ($tag eq 'Prefixes') {
                   $prefix = $body;
               } elsif ($tag eq 'rdf:li') {
  -                if ($section eq 'options') {
  -                    if ($body =~ /<.*?ID="([^"]+)".*?>\s*([^<]+?)\s*</) {
  -                        $options{$1} = $2;
  -                    }
  -                } elsif ($section eq 'prereq') {
  +                if ($section eq 'prereq') {
                       push(@prereq, $body);
                   } elsif ($section eq 'bprereq') {
                       push(@bprereq, $body);
  @@ -594,13 +637,12 @@
                       defined $version &&
                       defined $release) {
   
  -                    @provides = map {
  -                        /(\S+)\s*(?:=\s*(\S+?)\-(\S+))?$/;
  -                        {
  -                            name    => $1,
  -                            version => $2,
  -                            release => $3
  -                        }
  +                    @provides = map { parse_provides($_) } @provides;
  +
  +                    %options = map {
  +                        ( $_->{with} => $_->{version} )
  +                    } grep {
  +                        defined $_->{with}
                       } @provides;
   
                       unless (grep($_->{name} eq $name, @provides)) {
  @@ -644,7 +686,7 @@
           my($xml) = XML::Simple::XMLin(\*RFH, forcearray => 1);
           my($desc) = $xml->{'Repository'}->[0]->{'rdf:Description'};
           my($sub)  = $xml->{'Repository'}->[0]->{'Repository'};
  -        my($provides,@provides,$rec);
  +        my($provides,@provides,%options,$rec);
           my($href,$name,$version,$release);
   
           foreach (@$desc) {
  @@ -661,14 +703,13 @@
   
               $provides = $_->{'Provides'}->[0]->{'rdf:bag'}->[0]->{'rdf:li'};
   
  -            @provides = map {
  -                /(\S+)\s*(?:=\s*(\S+?)\-(\S+))?$/;
  -                {
  -                    name    => $1,
  -                    version => $2,
  -                    release => $3
  -                }
  -            } @$provides;
  +            @provides = map { parse_provides($_) } @$provides;
  +
  +            %options = map {
  +                ( $_->{with} => $_->{version} )
  +            } grep {
  +                defined $_->{with}
  +            } @provides;
   
               unless (grep($_->{name} eq $name, @provides)) {
                   push(@provides, {
  @@ -692,8 +733,8 @@
               };
   
               $rec->{OPTIONS} =
  -                exists $_->{'Options'}
  -                ? make_hash($_->{'Options'}, 'Option', $with)
  +                %options
  +                ? { %options }
                   : parse_options($rec->{desc});
   
               foreach (@provides) {
  @@ -951,10 +992,19 @@
   
       return unless $i || $r || $b;
   
  -    if ($dep =~ /^>=\s*(\S+)$/) {
  +    if ($dep =~ /^(?:>=|=>)\s*(\S+)$/) {
           $version = $1;
           $cond = sub { vcmp($_[0],$version) >= 0; };
  -    } elsif ($dep =~ /^=\s*(\S+)$/) {
  +    } elsif ($dep =~ /^(?:<=|=<)\s*(\S+)$/) {
  +        $version = $1;
  +        $cond = sub { vcmp($_[0],$version) <= 0; };
  +    } elsif ($dep =~ /^>\s*(\S+)$/) {
  +        $version = $1;
  +        $cond = sub { vcmp($_[0],$version) > 0; };
  +    } elsif ($dep =~ /^<\s*(\S+)$/) {
  +        $version = $1;
  +        $cond = sub { vcmp($_[0],$version) < 0; };
  +    } elsif ($dep =~ /^==?\s*(\S+)$/) {
           $version = $1;
           $cond = sub { vcmp($_[0],$version) == 0; };
       } elsif ($dep =~ /^\s*$/) {
  @@ .
  patch -p0 <<'@@ .'
  Index: openpkg-src/openpkg-tool/openpkg-index.pl
  ============================================================================
  $ cvs diff -u -r1.6 -r1.7 openpkg-index.pl
  --- openpkg-src/openpkg-tool/openpkg-index.pl 31 Dec 2002 15:12:39 -0000      1.6
  +++ openpkg-src/openpkg-tool/openpkg-index.pl 3 Jan 2003 13:47:40 -0000       1.7
  @@ -35,7 +35,7 @@
   use FileHandle;
   use DirHandle;
   
  -my $l_prefix = "@l_prefix@";
  +my $l_prefix = '@l_prefix@';
   my $RPM = "$l_prefix/bin/rpm";
   my $R2C = "$l_prefix/bin/rpm2cpio";
   my $BZ  = "$l_prefix/lib/openpkg/bzip2 -9";
  @@ -78,6 +78,14 @@
       return $v;
   }
   
  +sub optesc ($) {
  +    my($s) = @_;
  +
  +    $s =~ s/([\x00-\x1f\x80-\xbf\s\%])/sprintf("%%%02x",ord($1))/eg;
  +
  +    return $s;
  +}
  +
   sub vsub ($$) {
       my($var,$v) = @_;
   
  @@ -136,36 +144,6 @@
   }
   
   #
  -# clean up %options macro from description
  -#
  -sub clean_options ($$) {
  -    my($descr,$evar) = @_;
  -    my($p);
  -
  -    $descr =~ s/\s*\%options.*\n//;
  -    $descr =~ s/\n*$/\n/s;
  -
  -    if (%$evar) {
  -
  -        $p = 0;
  -        foreach (keys %$evar) {
  -            $p = length($_) if length($_) > $p;
  -        }
  -
  -        $descr .= "\n" . join '', map {
  -            sprintf(
  -                "    %%option  %s  %s\n",
  -                $_.' 'x($p-length($_)),
  -                $evar->{$_}
  -            )
  -        } sort keys %$evar;
  -
  -    }
  -
  -    return $descr;
  -}
  -
  -#
   # translate default section from spec-file
   # into a hash
   # %if/%ifdef/%define... are translated to #if/#ifdef/#define
  @@ -198,7 +176,7 @@
       #
       # map option macro
       #
  -    $s =~ s/^#option\s+(\S+)\s*(.*?)\s*$/#ifndef $1\n#define $1 $2\n#endif/mg;
  +    $s =~ s/^#option\s+(\S+)\s*(.*?)\s*$/#ifndef $1\n#define $1 
$2\n#endif\n#provides $1 $2/mg;
   
       #
       # use option variables for interpolation
  @@ -306,6 +284,17 @@
               } else {
                   $var{$1} = $2;
               }
  +        } elsif ($v =~ /^\#(?:provides)\s*(\S+)\s*(.*?)\s*$/) {
  +            #
  +            # store option for current condition
  +            #
  +            if (exists $attr{'Name'}->{''}) {
  +                push @{$attr{'Provides'}->{$cond}},
  +                    $attr{'Name'}->{''}->[0].'::'.$1.' = '.optesc($2);
  +            } else {
  +                warn "ERROR: no package name set for option $1 = $2\n";
  +            }
  +
           } elsif ($v =~ /^\s*([^\#]\S*)\s*:\s*(.*?)\s*$/) {
   
               #
  @@ -351,14 +340,8 @@
   
       if (exists $map{'description'}) {
           $o = find_options($map{'description'});
  -
           $a = package2data($map{'*'}, $o );
  -
  -        $a->{'Options'} = { '' => $o };
  -
  -        $a->{'Description'} = { '' => [
  -            clean_options($map{'description'}, $o)
  -        ] };
  +        $a->{'Description'} = { '' => [ $map{'description'} ] };
       } else {
           $a = package2data($map{'*'}, {});
       }
  @@ -477,48 +460,6 @@
   }
   
   #
  -# send out @{$a->{$k}} as a rdf:bag
  -# $k is the name of the outer tag unless overriden by $tag
  -# $i denotes the depth of indentation, inner tags are indented
  -# 2 or 4 more character positions.
  -#
  -# each element of the bag is a name value pair
  -#
  -sub xml_vals ($$$$$) {
  -    my($i,$a,$k,$tags,$tag) = @_;
  -    my($out,$cond,$upn,$map);
  -    return "" unless exists $a->{$k};
  -    $out = '';
  -    $i = ' ' x $i;
  -
  -    foreach $cond (sort keys %{$a->{$k}}) {
  -        $map = $a->{$k}->{$cond};
  -        next unless %$map;
  -        $upn = e(upn($cond));
  -        $out .= $i.
  -                ($cond ne '' ? "<$tags cond=\"$upn\">\n" : "<$tags>\n").
  -                "$i  <rdf:bag>\n".
  -                join('',
  -                     map {
  -                         "$i    <rdf:li>".
  -                         ( ( $map->{$_} =~ /^\%\{/ )
  -                            ? "<$tag ID=\"".e($_)."\"/>"
  -                            : "<$tag ID=\"".e($_)."\">".
  -                              e($map->{$_}).
  -                              "</$tag>"
  -                         ).
  -                         "</rdf:li>\n"
  -                     }
  -                     keys %$map
  -                ).
  -                "$i  </rdf:bag>\n".
  -                "$i</$tags>\n";
  -    }
  -
  -    return $out;
  -}
  -
  -#
   # send out reference to another RDF
   #
   sub xml_reference ($$$) {
  @@ -622,7 +563,6 @@
           xml_tag(6, $a, 'SigMD5'),
           xml_tag(6, $a, 'SigPGP'),
           xml_tag(6, $a, 'SigGPG'),
  -        xml_vals(6, $a, 'Options', 'Options', 'Option'),
           xml_bag(6, $a, 'BuildPreReq'),
           xml_bag(6, $a, 'PreReq'),
           xml_bag(6, $a, 'Provides'),
  @@ .
______________________________________________________________________
The OpenPKG Project                                    www.openpkg.org
CVS Repository Commit List                     [EMAIL PROTECTED]

Reply via email to