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:   25-Jun-2003 14:01:12
  Branch: HEAD                             Handle: 2003062513010803

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

  Log:
    fix dependency parsing, better handling of mutating virtual targets,
    added hint option to specify preferences

  Summary:
    Revision    Changes     Path
    1.85        +110 -35    openpkg-src/openpkg-tool/openpkg-build.pl
    1.60        +2  -2      openpkg-src/openpkg-tool/openpkg-tool.spec
    1.9         +6  -1      openpkg-src/openpkg-tool/openpkg.1
    1.18        +6  -0      openpkg-src/openpkg-tool/openpkg.pod
    1.5011      +1  -0      openpkg-web/news.txt
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: openpkg-src/openpkg-tool/openpkg-build.pl
  ============================================================================
  $ cvs diff -u -r1.84 -r1.85 openpkg-build.pl
  --- openpkg-src/openpkg-tool/openpkg-build.pl 24 Jun 2003 18:14:20 -0000      1.84
  +++ openpkg-src/openpkg-tool/openpkg-build.pl 25 Jun 2003 12:01:11 -0000      1.85
  @@ -31,10 +31,10 @@
   use strict;
   use vars qw/
       $opt_R $opt_r $opt_f $opt_u $opt_U $opt_a $opt_A
  -    $opt_z $opt_Z $opt_P $opt_N $opt_E $opt_i $opt_D
  -    $opt_p $opt_q $opt_s $opt_S $opt_X $opt_M $opt_L
  -    $opt_W $opt_K $opt_e $opt_b $opt_B $opt_g/;
  -my $getopts = 'R:r:f:uUaAzZP:N:E:iD:p:qsSXMLWKebBg';
  +    $opt_z $opt_Z $opt_P $opt_N $opt_E $opt_H $opt_i
  +    $opt_D $opt_p $opt_q $opt_s $opt_S $opt_X $opt_M
  +    $opt_L $opt_W $opt_K $opt_e $opt_b $opt_B $opt_g/;
  +my $getopts = 'R:r:f:uUaAzZP:N:EH:iD:p:qsSXMLWKebBg';
   getopts($getopts);
   
   ##########################################################################
  @@ -112,7 +112,7 @@
       close(FH);
   }
   
  -die "openpkg:build:USAGE: $0 [-R rpm] [-r repository] [-f index.rdf] 
[-uUzZiqsSXMLWKebBg] [-P priv-cmd] [-N non-priv-cmd] [-p platform] [-Dwith ...] 
[-Ename ...] ( [-aA] | patternlist )\n"
  +die "openpkg:build:USAGE: $0 [-R rpm] [-r repository] [-f index.rdf] 
[-uUzZiqsSXMLWKebBg] [-P priv-cmd] [-N non-priv-cmd] [-p platform] [-Dwith ...] 
[-Ename ...] [-Hname ...] ( [-aA] | patternlist )\n"
       unless $#ARGV >= 0 || ($#ARGV == -1 && ($opt_a || $opt_A));
   
   ##########################################################################
  @@ -411,15 +411,6 @@
   }
   
   #
  -# compute list of package names from dependency list
  -#
  -sub depends2pkglist ($) {
  -    my($t) = @_;
  -    my(%d) = unique_map($t->{depends}, $t->{keeps});
  -    return (keys %d);
  -}
  -
  -#
   # retrieve the local installed base
   #
   # for packages that provide option resources (packagename::buildoption)
  @@ -432,20 +423,54 @@
       my(@l) = run("$RPM --provides -qa");
       my($p);
       my($nam,$val,%options);
  +    my($vs,$rec,@provides);
  +    my($name,$version,$release);
   
  +    @provides = ();
       foreach (@l) {
           $p = parse_provides($_);
   
  +        # is this an option ?
           if (defined $p->{with}) {
  -            $options{$p->{prefix}}->{$p->{with}} = $p->{version}
  +            $options{$p->{prefix}}->{$p->{with}} = $p->{version};
  +            push @provides, $p;
  +            next;
  +        }
  +
  +        # is this a virtual target ?
  +        $vs = vs($p);
  +        if ($vs eq '') {
  +            push @provides,$p;
  +            next;
           }
   
  -        push @{$map{$p->{name}}->{vs($p)}}, {
  -            name       => $p->{name},
  -            version    => (defined $p->{version} ? $p->{version} : '*'),
  -            release    => (defined $p->{release} ? $p->{release} : '*'),
  +        $name    = $p->{name};
  +        $version = defined $p->{version} ? $p->{version} : '*';
  +        $release = defined $p->{release} ? $p->{release} : '*';
  +
  +        push(@provides, {
  +            name    => $name,
  +            version => $version,
  +            release => $release
  +        });
  +
  +        # create target record
  +        $rec = {
  +            name       => $name,
  +            version    => $version,
  +            release    => $release,
               PROXY      => $p->{proxy}
           };
  +
  +        foreach (@provides) {
  +            push @{$map{$_->{name}}->{vs($_)}}, $rec;
  +        }
  +
  +        @provides = ();
  +    }
  +
  +    if (@provides) {
  +        print "# ATTENTION: ",scalar(@provides)," froods found\n"
       }
   
       #
  @@ -472,6 +497,7 @@
       my($r) = $env->{'repository'};
       my($pkg, %dep, %dlist, %rev);
       my(@vers,$t);
  +    my($d,$k,%d);
   
       print "# computing reverse dependencies\n";
   
  @@ -496,8 +522,11 @@
           foreach (@vers) {
               foreach $t (@{$r->{$pkg}->{$_}}) {
                   next unless $i->{$t->{name}};
  -                next unless $t->{depends} || $t->{keeps};
  -                foreach (depends2pkglist($t)) {
  +                $d = target_depends($t, $env);
  +                $k = target_keeps($t, $env);
  +                next unless @$d || @$k;
  +                %d = unique_map($d,$k);
  +                foreach (keys %d) {
                       unless ($dep{$_}{$t->{name}}) {
                           $dep{$_}{$t->{name}} = 1;
                           push @{$dlist{$_}}, $t;
  @@ -1097,9 +1126,17 @@
       my($env, $name, $select, $vmap, $cond) = @_;
       my(@vers,@recs,@nrecs,$rec,%nam);
   
  +    #
  +    # resolve name into a list of versions
  +    # for virtual targets this resolves to a list
  +    # of real targets that provide the virtual target
  +    #
       @vers = get_versions($vmap, sub { 1; });
       return unless @vers;
   
  +    #
  +    # filter out binary targets that are not usuable
  +    #
       @recs = map { $_->[1] } grep {
                   my($v,$t) = @$_;
                   is_source($t) ||
  @@ -1115,20 +1152,41 @@
               } @vers;
       return unless @recs;
   
  +    #
  +    # limit list to exact matches if provided by -e
  +    #
       if (defined $select) {
           @recs = grep {
               vsn($_) =~ /^\Q$select\E/
           } @recs;
       }
   
  +    #
  +    # try to resolve ambiguity against installed targets
  +    # and targets previously selected
  +    #
       if (scalar(@recs) > 1) {
           @nrecs = grep {
               $env->{built}->{$_->{name}} ||
               $env->{installed}->{$_->{name}}
  -            } @recs;
  +        } @recs;
           @recs = @nrecs if @nrecs;
       }
   
  +    #
  +    # try to resolve ambiguity against hints
  +    #
  +    if ($env->{hint}) {
  +        @nrecs = grep {
  +            exists $env->{hint}->{$_->{name}}
  +        } @recs;
  +        @recs = @nrecs if @nrecs;
  +    }
  +
  +    #
  +    # try to resolve ambiguity against targets that match
  +    # the exact name
  +    #
       if (scalar(@recs) > 1) {
           @nrecs = grep {
               $name eq $_->{name}
  @@ -1136,6 +1194,9 @@
           @recs = @nrecs if @nrecs;
       }
   
  +    #
  +    # try to resolve ambiguity by preferring binaries
  +    #
       if (scalar(@recs) > 1 && !$env->{sourceonly}) {
           @nrecs = grep {
               defined $_->{'platform'}
  @@ -1143,6 +1204,9 @@
           @recs = @nrecs if @nrecs;
       }
   
  +    #
  +    # if we still have non-unique targets, complain
  +    #
       if (scalar(@recs) > 1) {
           %nam = map { $_->{name} => 1 } @recs;
           if (scalar(keys %nam) > 1) {
  @@ -1156,10 +1220,16 @@
           }
       }
       
  +    #
  +    # nothing left -> exit
  +    #
       if (scalar(@recs) == 0) {
           return;
       }
   
  +    #
  +    # chose last (= max version) in list of targets
  +    #
       $rec = $recs[-1];
   
       print "# source for $name is ".vsn($rec)."\n";
  @@ -1215,10 +1285,10 @@
       my($target, $env, $attr) = @_;
       my($with)   = $env->{with};
       my($optreg) = $env->{config}->{optreg};
  -    my($name)   = $target->{name};
  -    my(@out);
  +    my($name,@out);
   
       return unless $target;
  +    $name = $target->{name};
   
       my(%mywith) = %{$target->{OPTIONS}};
       override_options(\%mywith, name_with($name, $with), $optreg);
  @@ -1293,10 +1363,10 @@
       my(%out);
       foreach (@_) {
           foreach (@$_) {
  -            $out{$_->{value}->{name}} = $_;
  +            $out{$_->{name}} = $_;
           }
       }
  -    return (%out);
  +    return %out;
   }
   
   #
  @@ -1523,6 +1593,7 @@
       if ($i && (@vers = get_versions($i, $cond))) {
           foreach (@vers) {
               $t = $i->{$_}->[0];
  +            next unless $t && 
               get_with($t);
               if (target_suitable($t, $env->{with})) {
                   $tdef = $t;
  @@ -1538,7 +1609,8 @@
       # use it if it exists
       #
       if ($b && (@vers = get_versions($b, $cond))) {
  -        return ($b->{$vers[0]}->[0], 1);
  +        $t = $b->{$vers[0]}->[0];
  +        return ($t, 1);
       }
   
       #
  @@ -1550,7 +1622,7 @@
       $t = chose_source($env, $name, undef, $r, $cond);
       if ($t) {
           if (!$tdef || (
  -            $why = target_better($env, $t, $env->{installed}) &&
  +            ($why = target_better($env, $t, $env->{installed})) &&
               $why ne 'new'
               )) {
               return ($t, 0);
  @@ -1600,6 +1672,10 @@
       # see if a target is already installed and requires a rebuild
       #
       if ($t = find_target($target->{name}, $env->{installed})) {
  +        if (!exists $env->{repository}->{$target->{name}}) {
  +            print "# excluding $target->{name} (no upgrade path)\n";
  +            return;
  +        }
           if (exists $env->{exclude}->{$target->{name}}) {
               print "# excluding $target->{name} (no upgrade allowed)\n";
               return;
  @@ -1643,8 +1719,8 @@
       push(@{$env->{built}->{$target->{name}}->{vs($target)}}, $target);
       $target->{LIMBO} = 1;
   
  -    $d = target_depends(target_lookup($target, $env->{repository}), $env);
  -    $k = target_keeps(target_lookup($target, $env->{repository}), $env);
  +    $d = target_depends($target, $env);
  +    $k = target_keeps($target, $env);
   
       #
       # recurse over dependencies
  @@ -1668,10 +1744,7 @@
                       if ($t->{LIMBO}) {
                           print "# ATTENTION: ".vsn($t)." is in LIMBO\n";
                       }
  -                }
  -
  -                # record which targets to keep in blist
  -                if ($k{$_}) {
  +                } elsif ($k{$_}) {
                       push @$blist,$t;
                       print "# $target->{name} installs ".vsn($t)." for $_\n";
                   } else {
  @@ -2210,7 +2283,7 @@
   #######################################################################
   
   my($config,$url,$repository,$installed,$env,$list,$bonly,$clist);
  -my($pattern,%with,%exclude);
  +my($pattern,%with,%exclude,%hint);
   
   if ($opt_a) {
       $pattern = undef;
  @@ -2228,6 +2301,7 @@
       : ()
       } split(/\s+/, $opt_D);
   %exclude = map { $_ => 1 } split(/\s+/, $opt_E);
  +%hint    = map { $_ => 1 } split(/\s+/, $opt_H);
   
   $config         = get_config();
   
  @@ -2266,6 +2340,7 @@
       revdep     => undef,
       with       => \%with,
       exclude    => \%exclude,
  +    hint       => \%hint,
       upgrade    => ($opt_a || $opt_U),
       zero       => ($opt_z || $opt_Z),
       exact      => $opt_e,
  @@ .
  patch -p0 <<'@@ .'
  Index: openpkg-src/openpkg-tool/openpkg-tool.spec
  ============================================================================
  $ cvs diff -u -r1.59 -r1.60 openpkg-tool.spec
  --- openpkg-src/openpkg-tool/openpkg-tool.spec        24 Jun 2003 14:52:38 -0000     
 1.59
  +++ openpkg-src/openpkg-tool/openpkg-tool.spec        25 Jun 2003 12:01:11 -0000     
 1.60
  @@ -32,8 +32,8 @@
   Distribution: OpenPKG [PLUS]
   Group:        Bootstrapping
   License:      GPL
  -Version:      20030624
  -Release:      20030624
  +Version:      20030625
  +Release:      20030625
   
   #   list of sources
   Source0:      openpkg.sh
  @@ .
  patch -p0 <<'@@ .'
  Index: openpkg-src/openpkg-tool/openpkg.1
  ============================================================================
  $ cvs diff -u -r1.8 -r1.9 openpkg.1
  --- openpkg-src/openpkg-tool/openpkg.1        20 Jun 2003 11:06:13 -0000      1.8
  +++ openpkg-src/openpkg-tool/openpkg.1        25 Jun 2003 12:01:11 -0000      1.9
  @@ -129,7 +129,7 @@
   .\" ========================================================================
   .\"
   .IX Title "OPENPKG 1"
  -.TH OPENPKG 1 "2003-06-20" "openpkg-tool" "OpenPKG Maintainance"
  +.TH OPENPKG 1 "2003-06-25" "openpkg-tool" "OpenPKG Maintainance"
   .SH "NAME"
   \&\fBopenpkg\fR \- \fBOpenPKG\fR maintainance utility
   .SH "VERSION"
  @@ -174,6 +174,7 @@
   [\fB\-p\fR \fIplatform\fR]
   [\fB\-D\fR\fIvar\fR=\fIval\fR ...]
   [\fB\-E\fR \fIname\fR ...]
  +[\fB\-H\fR \fIname\fR ...]
   ([\fB\-a\fR] [\fB\-A\fR] | \fIpatternlist\fR)
   .SH "DESCRIPTION"
   .IX Header "DESCRIPTION"
  @@ -399,6 +400,10 @@
   Ignore a package with the specified \fIname\fR. This can be used to avoid
   upgrading to a broken package in the repository. There can be multiple
   \&\fB\-E\fR options.
  +.IP "\fB\-H\fR \fIname\fR" 4
  +.IX Item "-H name"
  +Hint about packages that should be preferred when more than one fits
  +a requirement. There can be multiple \fB\-E\fR options.
   .IP "\fB\-a\fR" 4
   .IX Item "-a"
   Select all installed packages. Do not specify a pattern list together
  @@ .
  patch -p0 <<'@@ .'
  Index: openpkg-src/openpkg-tool/openpkg.pod
  ============================================================================
  $ cvs diff -u -r1.17 -r1.18 openpkg.pod
  --- openpkg-src/openpkg-tool/openpkg.pod      20 Jun 2003 11:06:13 -0000      1.17
  +++ openpkg-src/openpkg-tool/openpkg.pod      25 Jun 2003 12:01:11 -0000      1.18
  @@ -73,6 +73,7 @@
   [B<-p> I<platform>]
   [B<-D>I<var>=I<val> ...]
   [B<-E> I<name> ...]
  +[B<-H> I<name> ...]
   ([B<-a>] [B<-A>] | I<patternlist>)
   
   =head1 DESCRIPTION
  @@ -345,6 +346,11 @@
   Ignore a package with the specified I<name>. This can be used to avoid
   upgrading to a broken package in the repository. There can be multiple
   B<-E> options.
  +
  +=item B<-H> I<name>
  +
  +Hint about packages that should be preferred when more than one fits
  +a requirement. There can be multiple B<-E> options.
   
   =item B<-a>
   
  @@ .
  patch -p0 <<'@@ .'
  Index: openpkg-web/news.txt
  ============================================================================
  $ cvs diff -u -r1.5010 -r1.5011 news.txt
  --- openpkg-web/news.txt      25 Jun 2003 08:21:34 -0000      1.5010
  +++ openpkg-web/news.txt      25 Jun 2003 12:01:08 -0000      1.5011
  @@ -1,3 +1,4 @@
  +25-Jun-2003: Upgraded package: P<openpkg-tool-20030625-20030625>
   25-Jun-2003: Upgraded package: P<rt-3.0.3-20030625>
   25-Jun-2003: Upgraded package: P<perl-util-20030625-20030625>
   25-Jun-2003: Upgraded package: P<perl-poe-20030625-20030625>
  @@ .
______________________________________________________________________
The OpenPKG Project                                    www.openpkg.org
CVS Repository Commit List                     [EMAIL PROTECTED]

Reply via email to