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]

Reply via email to