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]