OpenPKG CVS Repository
http://cvs.openpkg.org/
____________________________________________________________________________
Server: cvs.openpkg.org Name: Michael van Elst
Root: /e/openpkg/cvs Email: [EMAIL PROTECTED]
Module: openpkg-re Date: 13-Nov-2002 13:24:52
Branch: HEAD Handle: 2002111312245200
Modified files:
openpkg-re openpkg-build
Log:
tracking reverse dependencies for automated upgrade
Summary:
Revision Changes Path
1.12 +49 -1 openpkg-re/openpkg-build
____________________________________________________________________________
Index: openpkg-re/openpkg-build
============================================================
$ cvs diff -u -r1.11 -r1.12 openpkg-build
--- openpkg-re/openpkg-build 13 Nov 2002 11:05:00 -0000 1.11
+++ openpkg-re/openpkg-build 13 Nov 2002 12:24:52 -0000 1.12
@@ -157,6 +157,8 @@
return "$t->{name}-$t->{version}-$t->{release}";
}
+##########################################################################
+
sub get_config ()
{
my($c,@q);
@@ -209,6 +211,29 @@
return \%map;
}
+sub get_revdep ($) {
+ my($i) = @_;
+ my($pkg, %rev);
+ my(@vers,$t);
+ my($env) = { 'installed' => $i };
+
+ foreach $pkg (keys %$i) {
+ my(@l) = `$RPM -qR $pkg`;
+ my(@names);
+
+ @names = grep { $_ ne '' && $_ !~ /^(rpmlib\(|OpenPKG|openpkg$)/ }
+ map { /^(\S+)/ } @l;
+
+ @vers = get_versions($i->{$pkg}, sub { 1; });
+ foreach (@vers) {
+ $t = $i->{$pkg}->{$_}->[0];
+ push @{$rev{$_}}, $t foreach @names;
+ }
+ }
+
+ return \%rev;
+}
+
sub get_with ($;$) {
my($pkg,$fn) = @_;
my(@l) = defined $fn ? `$RPM -qi -p $fn` : `$RPM -qi $pkg`;
@@ -628,7 +653,7 @@
return;
}
- if (target_exists($target, $env->{installed})) {
+ if (!$target->{REBUILD} && target_exists($target, $env->{installed})) {
if (target_suitable($target, $env->{with})) {
unless ($env->{upgrade} && target_newer($target, $env->{installed})) {
print "# $target->{name} is already installed\n";
@@ -678,6 +703,20 @@
print "# adding ".vsn($target)." to list\n";
push(@$list, $target);
push(@{$env->{built}->{$target->{name}}->{vs($target)}}, $target);
+
+ if ($target->{REBUILD}) {
+
+ unless ($env->{revdep}) {
+ print "# computing reverse dependencies\n";
+ $env->{revdep} = get_revdep($env->{installed});
+ }
+
+ foreach $t (@{$env->{revdep}->{$target->{name}}}) {
+ $t->{REBUILD} = 1;
+ print "# rebuilding revdep ".vsn($t)."\n";
+ make_dep($t,$depth+1,$env,$list,$blist);
+ }
+ }
}
sub remove_list ($$$) {
@@ -743,6 +782,14 @@
die "FATAL: no known source found for '$name'\n" unless $t;
+ #
+ # if target is already installed (in some version)
+ # mark it as rebuilding to trigger reverse dependencies
+ #
+ if ($env->{installed}->{$name}) {
+ $t->{REBUILD} = 1;
+ }
+
warn_about_options($t, $env->{with});
push(@goals, $t);
}
@@ -879,6 +926,7 @@
installed => $installed,
repository => $repository,
built => {},
+ revdep => undef,
with => \%with,
upgrade => ($opt_U+0)
});
______________________________________________________________________
The OpenPKG Project www.openpkg.org
CVS Repository Commit List [EMAIL PROTECTED]