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 openpkg-web          Date:   31-Dec-2002 16:12:40
  Branch: HEAD                             Handle: 2002123115123801

  Modified files:
    openpkg-src/openpkg-tool
                            openpkg-build.pl openpkg-index.pl
                            openpkg-tool.spec
    openpkg-web             news.txt

  Log:
    added Options to Index, various compatibility hacks

  Summary:
    Revision    Changes     Path
    1.21        +57 -4      openpkg-src/openpkg-tool/openpkg-build.pl
    1.6         +116 -19    openpkg-src/openpkg-tool/openpkg-index.pl
    1.15        +2  -2      openpkg-src/openpkg-tool/openpkg-tool.spec
    1.2479      +1  -0      openpkg-web/news.txt
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: openpkg-src/openpkg-tool/openpkg-build.pl
  ============================================================================
  $ cvs diff -u -r1.20 -r1.21 openpkg-build.pl
  --- openpkg-src/openpkg-tool/openpkg-build.pl 30 Dec 2002 22:21:39 -0000      1.20
  +++ openpkg-src/openpkg-tool/openpkg-build.pl 31 Dec 2002 15:12:39 -0000      1.21
  @@ -153,6 +153,25 @@
       return \@out;
   }
   
  +sub make_hash ($$$) {
  +    my($bags,$tag,$with) = @_;
  +    my($bag,$li);
  +    my(%out,$el);
  +
  +    foreach $bag (@$bags) {
  +        next unless conditional($bag->{'cond'}, $with);
  +        foreach $li (@{$bag->{'rdf:bag'}}) {
  +            foreach (@{$li->{'rdf:li'}}) {
  +                next unless exists $_->{$tag};
  +                $el = $_->{$tag}->[0];
  +                $out{$el->{'ID'}} = $el->{'content'};
  +            }
  +        }
  +    }
  +
  +    return \%out;
  +}
  +
   ##########################################################################
   
   my($RPM,$RPM_PRIV,$RPM_NPRIV,$CURL,$PROG);
  @@ -353,6 +372,9 @@
       return \%rev;
   }
   
  +#
  +# parse option from rpm output
  +#
   sub parse_options ($) {
       my($l) = @_;
       $l = join("\n", @$l) if ref $l;
  @@ -363,6 +385,11 @@
       return $with;
   }
   
  +#
  +# copy options from new to old
  +# where option already exists in old or option key
  +# matches regular expression
  +#
   sub override_options ($$$) {
       my($old, $new, $reg) = @_;
   
  @@ -464,6 +491,7 @@
           my($href,$release,$desc);
           my(@prereq,@bprereq);
           my(@provides,@conflicts);
  +        my(%options);
           my($platform,$prefix);
           my($rec);
           my($tag,$cond,$body);
  @@ -495,7 +523,16 @@
   
               next unless defined $href;
   
  -            ($tag,$cond,$body) = /<(\/?[\w:]+)\s*(?:cond="([^"]+)")?>([^<]*)/;
  +            ($tag,$cond,$body) = /
  +                <
  +                ([\w:]+)
  +                \s*
  +                (?:cond="([^"]+)")?
  +                >
  +                (.*?)
  +                <\/\1>
  +                $
  +                /mx;
   
               $useit = conditional($cond,$with);
   
  @@ -505,6 +542,10 @@
                   $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') {
  @@ -532,7 +573,11 @@
               } elsif ($tag eq 'Prefixes') {
                   $prefix = $body;
               } elsif ($tag eq 'rdf:li') {
  -                if ($section eq 'prereq') {
  +                if ($section eq 'options') {
  +                    if ($body =~ /<.*?ID="([^"]+)".*?>\s*([^<]+?)\s*</) {
  +                        $options{$1} = $2;
  +                    }
  +                } elsif ($section eq 'prereq') {
                       push(@prereq, $body);
                   } elsif ($section eq 'bprereq') {
                       push(@bprereq, $body);
  @@ -577,7 +622,11 @@
                           platform  => $platform,
                           prefix    => $prefix
                       };
  -                    $rec->{OPTIONS} = parse_options($rec->{desc});
  +
  +                    $rec->{OPTIONS} =
  +                        %options
  +                        ? \%options
  +                        : parse_options($rec->{desc});
   
                       foreach (@provides) {
                           push(@{$map{$_->{name}}->{vs($_)}}, $rec);
  @@ -640,7 +689,11 @@
                   conflicts => with_list($_->{'Conflicts'}, $with),
                   desc     => xel($_->{'Description'})
               };
  -            $rec->{OPTIONS} = parse_options($rec->{desc});
  +
  +            $rec->{OPTIONS} =
  +                exists $_->{'Options'}
  +                ? make_hash($_->{'Options'}, 'Option', $with)
  +                : parse_options($rec->{desc});
   
               foreach (@provides) {
                   push(@{$map{$_->{name}}->{vs($_)}}, $rec);
  @@ .
  patch -p0 <<'@@ .'
  Index: openpkg-src/openpkg-tool/openpkg-index.pl
  ============================================================================
  $ cvs diff -u -r1.5 -r1.6 openpkg-index.pl
  --- openpkg-src/openpkg-tool/openpkg-index.pl 30 Dec 2002 22:21:39 -0000      1.5
  +++ openpkg-src/openpkg-tool/openpkg-index.pl 31 Dec 2002 15:12:39 -0000      1.6
  @@ -53,10 +53,10 @@
       my($i);
   
       $s =~ s/\n+$//sg;
  -    $s =~ s/\s+$//mg;
  +    $s =~ s/[^\S\n]+$//mg;
   
       $i = undef;
  -    while ($s =~ /^(\s+)/mg) {
  +    while ($s =~ /^([^\S\n]+)/mg) {
           $i = $1 if !defined $i || length($1) < length($i);
       }
   
  @@ -126,15 +126,46 @@
   #
   # deduce external variables from description
   #
  -sub find_options ($$) {
  -    my($spec, $descr) = @_;
  +# before openpkg-20021230
  +#
  +sub find_options ($) {
  +    my($descr) = @_;
       my $evar = {};
  -    $descr =~ s/--define\s*'(\S+)\s*\%\{\1\}'/$evar->{$1} = '%{'.$1.'}', ''/sge; # 
before openpkg-20021230
  -    $spec =~ s/^%option\s+(\S+)\s+\S+/$evar->{$1} = '%{'.$1.'}', ''/mge;         # 
after  openpkg-20021230
  +    $descr =~ s/--define\s*'(\S+)\s*\%\{\1\}'/$evar->{$1} = '%{'.$1.'}', ''/sge;
       return $evar;
   }
   
   #
  +# 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
  @@ -148,8 +179,8 @@
   # repeated attributes are coalesced into a list
   #
   sub package2data ($$) {
  -    my($s,$evar) = @_;
  -    my(%var);
  +    my($s,$ovar) = @_;
  +    my(%evar,%var);
       my(@term, $term);
       my(%attr);
       my($l, $v, $cond, $d, $p);
  @@ -165,13 +196,24 @@
       $s =~ s/^#\{\!\?([^:]*):\s*(.*?)\s*\}\s*$/#ifndef $1\n$2\n#endif/mg;
   
       #
  +    # map option macro
  +    #
  +    $s =~ s/^#option\s+(\S+)\s*(.*?)\s*$/#ifndef $1\n#define $1 $2\n#endif/mg;
  +
  +    #
  +    # use option variables for interpolation
  +    #
  +    %evar = %$ovar;
  +
  +    #
       # guess more external parameters by scanning for "default" sections.
       #
       $re = '^\#ifndef\s+[\w\_]+\s*\n((?:\#define\s+[\w\_]+\s.*\n)+)\#endif\n';
       @defs = $s =~ /$re/gm;
       foreach (@defs) {
           while (/^\#define\s+([\w\_]+)\s(.*?)\s*$/mg) {
  -            $evar->{$1} = '%{'.$1.'}';
  +            $ovar->{$1} = $2;
  +            $evar{$1} = '%{'.$1.'}';
           }
       }
       $s =~ s/$re//gm;
  @@ -182,10 +224,11 @@
       $re = '%{(with\_[\w\_]+)}';
       @defs = $s =~ /$re/gm;
       foreach (@defs) {
  -        $evar->{$1} = '%{'.$1.'}';
  +        next if exists $ovar->{$1};
  +        $ovar->{$1} = '%{'.$1.'}';
  +        $evar{$1} = '%{'.$1.'}';
       }
   
  -
       #
       # extract all conditional sections
       #
  @@ -210,8 +253,8 @@
                       warn "WARNING: unknown token '$5':\n< $l\n> $v\n";
                   } elsif (defined $2) {
                       $term .= " $2 ";
  -                } elsif (exists $evar->{$3}) {
  -                    $term .= ($4 eq 'no' ? '! ' : '').vsub($evar,'%{'.$3.'}');
  +                } elsif (exists $evar{$3}) {
  +                    $term .= ($4 eq 'no' ? '! ' : '').vsub(\%evar,'%{'.$3.'}');
                   } else {
                       warn "WARNING: unknown conditional '$2':\n< $l\n> $v\n";
                   }
  @@ -252,11 +295,11 @@
               # define internal variables
               # -> store for subsequent substitution
               #
  -            if (exists $evar->{$1}) {
  +            if (exists $evar{$1}) {
                   if ($2 eq 'yes') {
  -                    $evar->{$1} = "( \%\{$1\} || ( $cond ) )";
  +                    $evar{$1} = "( \%\{$1\} || ( $cond ) )";
                   } elsif ($2 eq 'no') {
  -                    $evar->{$1} = "( %\{$1\} && ! ( $cond ) )";
  +                    $evar{$1} = "( %\{$1\} && ! ( $cond ) )";
                   } else {
                       warn "WARNING: logic too complex for '$1':\n< $l\n> $v\n";
                   }
  @@ -306,10 +349,18 @@
           }
       }
   
  -    $o = find_options($spec, $map{'description'});
  -    $a = package2data($map{'*'}, $o);
       if (exists $map{'description'}) {
  -        $a->{'Description'} = { '' => [ $map{'description'} ] };
  +        $o = find_options($map{'description'});
  +
  +        $a = package2data($map{'*'}, $o );
  +
  +        $a->{'Options'} = { '' => $o };
  +
  +        $a->{'Description'} = { '' => [
  +            clean_options($map{'description'}, $o)
  +        ] };
  +    } else {
  +        $a = package2data($map{'*'}, {});
       }
   
       return $a;
  @@ -399,6 +450,8 @@
   # $i denotes the depth of indentation, inner tags are indented
   # 2 or 4 more character positions.
   #
  +# each element of the bag is listed
  +#
   sub xml_bag ($$$;$) {
       my($i,$a,$k,$tag) = @_;
       my($out,$cond,$upn);
  @@ -408,6 +461,7 @@
       $i = ' ' x $i;
   
       foreach $cond (sort keys %{$a->{$k}}) {
  +        next unless @{$a->{$k}->{$cond}};
           $upn = e(upn($cond));
           $out .= $i.
                   ($cond ne '' ? "<$tag cond=\"$upn\">\n" : "<$tag>\n").
  @@ -423,6 +477,48 @@
   }
   
   #
  +# 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 ($$$) {
  @@ -526,6 +622,7 @@
           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'),
  @@ .
  patch -p0 <<'@@ .'
  Index: openpkg-src/openpkg-tool/openpkg-tool.spec
  ============================================================================
  $ cvs diff -u -r1.14 -r1.15 openpkg-tool.spec
  --- openpkg-src/openpkg-tool/openpkg-tool.spec        30 Dec 2002 22:05:36 -0000     
 1.14
  +++ openpkg-src/openpkg-tool/openpkg-tool.spec        31 Dec 2002 15:12:39 -0000     
 1.15
  @@ -32,8 +32,8 @@
   Distribution: OpenPKG [EVAL]
   Group:        Bootstrapping
   License:      GPL
  -Version:      20021230
  -Release:      20021230
  +Version:      20021231
  +Release:      20021231
   
   #   list of sources
   Source0:      openpkg.sh
  @@ .
  patch -p0 <<'@@ .'
  Index: openpkg-web/news.txt
  ============================================================================
  $ cvs diff -u -r1.2478 -r1.2479 news.txt
  --- openpkg-web/news.txt      31 Dec 2002 11:24:23 -0000      1.2478
  +++ openpkg-web/news.txt      31 Dec 2002 15:12:38 -0000      1.2479
  @@ -1,3 +1,4 @@
  +31-Dez-2002: Upgraded package: P<openpkg-tool-20021231-20021231>
   31-Dec-2002: Upgraded package: P<sasl-2.1.10-20021231>
   31-Dec-2002: Upgraded package: P<rdesktop-1.1.0.19.9.0-20021231>
   31-Dec-2002: Upgraded package: P<curl-7.10.2-20021231>
  @@ .
______________________________________________________________________
The OpenPKG Project                                    www.openpkg.org
CVS Repository Commit List                     [EMAIL PROTECTED]

Reply via email to