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-Dec-2002 15:27:40
Branch: HEAD Handle: 2002120314273900
Modified files:
openpkg-src/openpkg-tool openpkg-build.pl openpkg.pod
Log:
added status output (-S and -s options)
several dependency issues no longer cause fatal errors
or cause a fatal error only after all depencies have
been evaluated
XML parser ignored Conflicts element - fixed
Summary:
Revision Changes Path
1.10 +153 -39 openpkg-src/openpkg-tool/openpkg-build.pl
1.5 +59 -0 openpkg-src/openpkg-tool/openpkg.pod
____________________________________________________________________________
Index: openpkg-src/openpkg-tool/openpkg-build.pl
============================================================
$ cvs diff -u -r1.9 -r1.10 openpkg-build.pl
--- openpkg-src/openpkg-tool/openpkg-build.pl 29 Nov 2002 10:10:21 -0000 1.9
+++ openpkg-src/openpkg-tool/openpkg-build.pl 3 Dec 2002 14:27:39 -0000 1.10
@@ -29,8 +29,8 @@
$|=1; # autoflush
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/;
-getopts('R:r:f:uUaAzZP:N:E:iD:p:q');
+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/;
+getopts('R:r:f:uUaAzZP:N:E:iD:p:qsS');
##########################################################################
@@ -101,7 +101,7 @@
close(FH);
}
-die "openpkg:build:USAGE: $0 [-R rpm] [-r repository] [-f index.rdf] [-uUzZiq] [-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] [-uUzZiqS] [-P
priv-cmd] [-N non-priv-cmd] [-p platform] [-Dwith ...] [-Ename ...] ( [-aA] |
patternlist )\n"
unless $#ARGV >= 0 || ($#ARGV == -1 && ($opt_a || $opt_A));
##########################################################################
@@ -623,6 +623,9 @@
keeps =>
( $_->{'PreReq'}->[0]->{'rdf:bag'}->[0]->{'rdf:li'}
|| [] ),
+ conflicts =>
+ ( $_->{'Conflicts'}->[0]->{'rdf:bag'}->[0]->{'rdf:li'}
+ || [] ),
desc => xel($_->{'Description'})
};
$rec->{OPTIONS} = parse_options($rec->{desc});
@@ -713,7 +716,7 @@
print "# $i: ".vsn($_)." = $_->{href}\n";
$i++;
}
- die "ERROR: ambigous dependency\n";
+ return;
} else {
if ($env->{upgrade}) {
@@ -837,6 +840,18 @@
}
#
+# record target status
+#
+sub target_setstatus ($$$) {
+ my($target, $status, $pri) = @_;
+
+ if ($pri > $target->{STATUSPRI}) {
+ $target->{STATUSPRI} = $pri;
+ $target->{STATUS} = $status;
+ }
+}
+
+#
# report options that are not used for
#
sub warn_about_options ($$$) {
@@ -879,7 +894,8 @@
} elsif ($dep =~ /^\s*$/) {
$cond = sub { 1; };
} else {
- die "FATAL: don't know how to handle PreReq: $name $dep\n";
+ print "# don't know how to handle PreReq: $name $dep\n";
+ return;
}
if ($i && (@vers = get_versions($i, $cond))) {
@@ -900,9 +916,10 @@
}
-sub make_dep ($$$$$) {
- my($target,$depth,$env,$list,$blist) = @_;
+sub make_dep ($$$$$$) {
+ my($target,$depth,$env,$list,$blist,$clist) = @_;
my($d,$k,%d,%k,$t,$old);
+ my(@deps,$conflict);
if (target_exists($target, $env->{built})) {
print "# $target->{name} is already in list\n";
@@ -910,11 +927,15 @@
}
if ($t = target_conflicts($target, $env->{installed})) {
+ target_setstatus($target,'CONFLICT',4);
+ push(@$clist,$target);
print "# $target->{name} conflicts with ",vsn($t),"\n";
return;
}
if ($t = target_conflicts($target, $env->{built})) {
+ target_setstatus($target,'CONFLICT',4);
+ push(@$clist,$target);
print "# $target->{name} conflicts with ",vsn($t),"\n";
return;
}
@@ -929,12 +950,16 @@
}
get_with($t);
if ($target->{REBUILD}) {
+ target_setstatus($target,'DEPEND',1);
print "# rebuilding $target->{name} (dependency)\n";
} elsif ($env->{zero}) {
+ target_setstatus($target,'ZERO',1);
print "# rebuilding $target->{name} (zero)\n";
} elsif (target_newer($target, $env->{installed})) {
+ target_setstatus($target,'UPGRADE',3);
print "# rebuilding $target->{name} (upgrade)\n";
} elsif (!target_suitable($t, $env->{with})) {
+ target_setstatus($target,'MISMATCH',2);
print "# rebuilding $target->{name} (parameter mismatch)\n";
} else {
print "# $target->{name} is already installed\n";
@@ -946,6 +971,8 @@
# remember this is a rebuild for a proxy package
$target->{PROXY} = $t->{PROXY};
$target->{REBUILD} = 1;
+ } else {
+ target_setstatus($target,'ADD',3);
}
if (exists $env->{exclude}->{$target->{name}}) {
@@ -967,6 +994,8 @@
%d = map { $_ => 1 } @$d, @$k;
%k = map { $_ => 1 } @$k;
+ @deps = ();
+ $conflict = 0;
foreach (keys %d) {
# old index misses a OpenPKG provider in the index... skip it
@@ -981,14 +1010,24 @@
# record which targets to keep in blist
if ($k{$_}) {
- push(@$blist,$t);
+ push @$blist,$t;
print "# $target->{name} installs ".vsn($t)." for $_\n";
} else {
print "# $target->{name} requires ".vsn($t)." for $_\n";
}
- make_dep($t,$depth+1,$env,$list,$blist);
+ push @deps, $t;
} else {
- die "FATAL: $target->{name} searches for a frood called '$_'\n";
+ print "# $target->{name} searches for a frood called '$_'\n";
+ push(@{$env->{fatal}},vsn($target));
+ target_setstatus($target,'UNDEF',4);
+ push @$clist, $target;
+ $conflict = 1;
+ }
+ }
+
+ unless ($conflict) {
+ foreach $t (@deps) {
+ make_dep($t,$depth+1,$env,$list,$blist,$clist);
}
}
}
@@ -996,6 +1035,8 @@
print "# adding ".vsn($target)." to list\n";
push(@$list, $target);
+ return if $conflict;
+
if (!$env->{quick} &&
$target->{name} ne 'openpkg' &&
$target->{REBUILD}) {
@@ -1013,7 +1054,7 @@
push(@$blist, $t);
print "# rebuilding revdep ".vsn($t)."\n";
- make_dep($t,$depth+1,$env,$list,$blist);
+ make_dep($t,$depth+1,$env,$list,$blist,$clist);
}
}
}
@@ -1031,7 +1072,7 @@
sub build_list ($$) {
my($pattern, $env) = @_;
- my(@goals,@targets,@keeps,$bonly,$t);
+ my(@goals,@targets,@keeps,@conflicts,$bonly,$t);
my($name,$r,$i,@vers);
my(@todo);
@@ -1084,10 +1125,16 @@
}
}
- die "FATAL: no known source found for '$name'\n" unless $t;
-
- warn_about_options($t, $env->{with}, $env->{config});
- push(@goals, $t);
+ if ($t) {
+ warn_about_options($t, $env->{with}, $env->{config});
+ push(@goals, $t);
+ } else {
+ if ($env->{status}) {
+ print "# dropping goal '$name'\n";
+ } else {
+ die "FATAL: cannot find source for '$name'\n";
+ }
+ }
}
return unless @goals;
@@ -1095,12 +1142,12 @@
@keeps = @goals;
foreach $t (@goals) {
print "# recursing over dependencies for ".vsn($t)."\n";
- make_dep($t,0,$env,\@targets,\@keeps);
+ make_dep($t,0,$env,\@targets,\@keeps,\@conflicts);
}
$bonly = remove_list(\@targets, \@keeps, $env->{installed});
- return (\@targets, $bonly);
+ return (\@targets, $bonly, \@conflicts);
}
#######################################################################
@@ -1246,9 +1293,61 @@
}
}
+sub print_status ($$$$$) {
+ my($installed,$repository,$list,$bonly,$clist) = @_;
+ my(%bonly) = map { $_ => 1 } @$bonly;
+ my(%map,$n,@names,$t);
+ my($old,$tag,$new);
+
+ foreach (@$list, @$clist) {
+ $map{$_->{name}} = {
+ rel => "$_->{version}-$_->{release}",
+ status => $_->{STATUS}
+ };
+ }
+
+ foreach (@$bonly) {
+ $map{$_->{name}} = {
+ rel => "$_->{version}-$_->{release}",
+ status => 'TEMP'
+ };
+ }
+
+ @names = keys %map;
+ foreach $n (keys %$installed) {
+ next if exists $map{$n};
+ next unless grep { $_ ne '-' } keys %{$installed->{$n}};
+ $map{$n}->{'status'} = 'OK';
+ push @names,$n;
+ }
+
+ foreach $n (keys %$repository) {
+ next if exists $map{$n};
+ next unless grep { $_ ne '-' } keys %{$repository->{$n}};
+ $t = find_target($n, $repository);
+ $map{$n}->{'status'} = 'NEW';
+ $map{$n}->{'rel'} = vs($t);
+ push @names,$n;
+ }
+
+ foreach $n (sort @names) {
+ $old = join ',',
+ map { "$n-$_" }
+ sort
+ grep { $_ ne '-' }
+ keys %{$installed->{$n}};
+ $old = $n if $old eq '';
+
+ $tag = $map{$n}->{status};
+ $new = defined $map{$n}->{rel} ? " $n-$map{$n}->{rel}" : '';
+
+ printf "%-35s %-8s%s\n", $old, $tag, $new;
+ }
+}
+
#######################################################################
-my($config,$url,$repository,$installed,$list,$bonly);
+my($config,$url,$repository,$installed,$env,$list,$bonly,$clist);
my($pattern,%with,%exclude);
if ($opt_a) {
@@ -1294,27 +1393,42 @@
$installed = $opt_Z ? {} : get_installed();
$repository = get_index($url.'00INDEX.rdf',$opt_f,\%with);
-($list,$bonly) = build_list($pattern, {
- config => $config,
- installed => $installed,
- repository => $repository,
- built => {},
- revdep => undef,
- with => \%with,
- exclude => \%exclude,
- upgrade => ($opt_a || $opt_U),
- zero => ($opt_z || $opt_Z),
- quick => $opt_q,
- sourceonly => (
- $opt_u ||
- $opt_U ||
- $opt_z ||
- $opt_Z ||
- scalar(%with) > 0 )
- });
+$env = {
+ config => $config,
+ installed => $installed,
+ repository => $repository,
+ built => {},
+ revdep => undef,
+ with => \%with,
+ exclude => \%exclude,
+ upgrade => ($opt_a || $opt_U),
+ zero => ($opt_z || $opt_Z),
+ quick => $opt_q,
+ status => ($opt_s || $opt_S),
+ fatal => [],
+ sourceonly => ($opt_u ||
+ $opt_U ||
+ $opt_z ||
+ $opt_Z ||
+ scalar(%with) > 0 )
+};
+($list,$bonly,$clist) = build_list($pattern, $env);
die "FATAL: cannot find package\n" unless defined $list;
-print_list1($list,$config,$opt_a || $opt_u || $opt_U,\%with,$opt_i);
-print_list2($bonly,$config);
+if ($opt_S) {
+ print_status($installed,$repository,$list,$bonly,$clist);
+} elsif ($opt_s) {
+ print_status($installed,{},$list,$bonly,$clist);
+} else {
+ if (@{$env->{fatal}}) {
+ die "FATAL errors occured while building:\n",
+ join ',',
+ @{$env->{fatal}},
+ "\n";
+ }
+
+ print_list1($list,$config,$opt_a || $opt_u || $opt_U,\%with,$opt_i);
+ print_list2($bonly,$config);
+}
Index: openpkg-src/openpkg-tool/openpkg.pod
============================================================
$ cvs diff -u -r1.4 -r1.5 openpkg.pod
--- openpkg-src/openpkg-tool/openpkg.pod 27 Nov 2002 14:51:43 -0000 1.4
+++ openpkg-src/openpkg-tool/openpkg.pod 3 Dec 2002 14:27:39 -0000 1.5
@@ -57,6 +57,8 @@
[B<-Z>]
[B<-i>]
[B<-q>]
+[B<-s>]
+[B<-S>]
[B<-P> I<priv-cmd>]
[B<-N> I<non-priv-cmd>]
[B<-p> I<platform>]
@@ -189,6 +191,63 @@
Ignore all reverse dependencies.
I<ATTENTION: this might break already installed packages!>
+
+=item B<-s>
+
+Print a status map instead of the install script. The map consists
+of 3 columns: "old", "tag" and "new". "old" shows the installed
+version of a package or just the package name if no package of
+that name is installed and "new" shows the repository version
+of a package if it is considered for installation. "tag" has the
+following possible values:
+
+=over 4
+
+=item OK
+
+The installed package is suitable and will not be touched.
+
+=item ADD
+
+There is no installed package yet.
+
+=item UPGRADE
+
+The installed package is outdated and requires an update.
+
+=item DEPEND
+
+The installed package needs rebuilding because one of its
+dependencies is rebuilt.
+
+=item MISMATCH
+
+The installed package needs rebuilding because it was build
+with different parameters.
+
+=item CONFLICT
+
+The required new package cannot be installed because it
+conflicts with some already installed package.
+
+=item UNDEF
+
+The package has an invalid or ambigous dependency.
+
+=back
+
+=item B<-S>
+
+Similar to B<-s> but also lists the newest versions in the
+repository. The following tag might appear in the map.
+
+=over 4
+
+=item NEW
+
+The package exists in the repository but isn't required yet.
+
+=back
=item B<-P> I<priv-cmd>
______________________________________________________________________
The OpenPKG Project www.openpkg.org
CVS Repository Commit List [EMAIL PROTECTED]