Hello community,

here is the log from the commit of package mkinitrd for openSUSE:Factory
checked in at Sun Oct 16 12:54:27 CEST 2011.



--------
--- openSUSE:Factory/mkinitrd/mkinitrd.changes  2011-10-12 16:13:06.000000000 
+0200
+++ /mounts/work_src_done/STABLE/mkinitrd/mkinitrd.changes      2011-10-14 
15:21:52.000000000 +0200
@@ -1,0 +2,6 @@
+Fri Oct 14 13:01:41 UTC 2011 - [email protected]
+
+- purge-kernels: Only remove kernel-source and kernel-devel, if
+  there is no runtime package left (bnc#721481, bnc#723647).
+
+-------------------------------------------------------------------

calling whatdependson for head-i586


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ mkinitrd.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mkinitrd-2.7.0/mkinitrd.changes 
new/mkinitrd-2.7.0/mkinitrd.changes
--- old/mkinitrd-2.7.0/mkinitrd.changes 2011-10-11 15:54:14.000000000 +0200
+++ new/mkinitrd-2.7.0/mkinitrd.changes 2011-10-14 15:22:52.000000000 +0200
@@ -1,4 +1,10 @@
 -------------------------------------------------------------------
+Fri Oct 14 13:01:41 UTC 2011 - [email protected]
+
+- purge-kernels: Only remove kernel-source and kernel-devel, if
+  there is no runtime package left (bnc#721481, bnc#723647).
+
+-------------------------------------------------------------------
 Tue Oct 11 13:50:35 UTC 2011 - [email protected]
 
 - Include thermal, processor and fan acpi modules on x86 and ia64
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mkinitrd-2.7.0/sbin/purge-kernels 
new/mkinitrd-2.7.0/sbin/purge-kernels
--- old/mkinitrd-2.7.0/sbin/purge-kernels       2011-10-11 15:54:14.000000000 
+0200
+++ new/mkinitrd-2.7.0/sbin/purge-kernels       2011-10-14 15:22:52.000000000 
+0200
@@ -3,6 +3,8 @@
 use strict;
 use warnings;
 
+use Getopt::Long;
+
 sub usage {
        print "Usage: $0 [--test]\n";
        print "Reads list of kernels to keep from 
/etc/zypp/zypp.conf:multiversion.kernels\n";
@@ -19,10 +21,15 @@
 # do not actually delete anything
 my $test_only;
 
-sub load_config {
+# undocumented debugging options
+my ($fake_config, $fake_rpm_qa, $fake_uname_r, $fake_uname_m);
+
+sub get_config_line {
        my $file = "/etc/zypp/zypp.conf";
-       my @kernels;
 
+       if ($fake_config) {
+               return $fake_config;
+       }
        if (!-e $file) {
                print STDERR "$0: /etc/zypp/zypp.conf does not exist, 
exiting.\n";
                exit 0;
@@ -32,10 +39,17 @@
                chomp;
                next unless /^\s*multiversion\.kernels\b/;
                s/^[^=]*=\s*//;
-               @kernels = split(/,\s*/);
-               last;
+               close($fh);
+               return $_;
        }
        close($fh);
+       return "";
+}
+
+sub load_config {
+       my @kernels;
+
+       @kernels = split(/,\s*/, get_config_line());
        for my $kernel (@kernels) {
                if ($kernel =~ 
/^\s*(latest|oldest|running)(\s*[-+]\s*\d+)?\s*$/) {
                        my $new = { whence => $1, offset => $2 || 0 };
@@ -84,13 +98,21 @@
 }
 
 sub load_packages {
-       open(my $pipe, '-|', 'rpm', '-qa', '--qf', '%{n} %{v}-%{r} %{arch}\n',
-               'kernel-*', '*-kmp-*') or die "rpm: $!\n";
+       my $pipe;
+
+       if ($fake_rpm_qa) {
+               open($pipe, '<', $fake_rpm_qa) or die "$fake_rpm_qa: $!\n";
+       } else {
+               open($pipe, '-|', 'rpm', '-qa', '--qf',
+                       '%{n} %{v}-%{r} %{arch}\n', 'kernel-*', '*-kmp-*')
+                       or die "rpm: $!\n";
+       }
        while (<$pipe>) {
                chomp;
                my ($name, $vr, $arch) = split;
                add_package($name, $vr, $arch);
        }
+       close($pipe)
 }
 
 sub sort_versions {
@@ -129,10 +151,10 @@
        return ($ver1 eq substr($ver2, 0, length($ver1)));
 }
 
-sub list_old_packages {
+sub list_old_versions {
        my ($flavor) = @_;
 
-       my $is_source = $flavor =~ /\/source/;
+       my $is_source = $flavor =~ /\/(source|syms)/;
        my $kernels = $kernels{$flavor};
        my @versions = sort_versions(keys(%$kernels));
        my %idx = (
@@ -170,9 +192,83 @@
                        die "??";
                }
        }
-       my @packages;
-       for my $ver (grep { $delete{$_} } @versions) {
-               push(@packages, @{$kernels->{$ver}});
+       return grep { $delete{$_} } @versions;
+}
+
+sub package_exists {
+       my ($version, $archs, $flavors) = @_;
+
+       for my $arch (@$archs) {
+               for my $flavor (@$flavors) {
+                       my $config = "$arch/$flavor";
+                       if (exists($kernels{$config})
+                               && exists($kernels{$config}->{$version})) {
+                                       return 1;
+                       }
+               }
+       }
+       return 0;
+}
+
+sub list_old_packages {
+       my (@packages, @archs, @flavors);
+       my (@syms_flavors, @binary_flavors, @source_configs);
+
+       # there are some inter-dependencies among the kernel packages,
+       # so we have to be careful
+       my %t = map { s:/.*::; $_ => 1 } keys(%kernels);
+       @archs = sort(keys(%t));
+       %t = map { s:.*/::; $_ => 1 } keys(%kernels);
+       @flavors = sort(keys(%t));
+       @syms_flavors = grep { /^syms/ } @flavors;
+       @binary_flavors = grep { !/^(source|syms)/ } @flavors;
+       @source_configs = grep { /\/source/ } sort(keys(%kernels));
+
+       for my $arch (@archs) {
+               for my $flavor (@syms_flavors) {
+                       my $config = "$arch/$flavor";
+                       next unless exists($kernels{$config});
+                       my @versions = list_old_versions($config);
+                       for my $ver (@versions) {
+                               push(@packages, @{$kernels{$config}->{$ver}});
+                               delete($kernels{$config}->{$ver});
+                       }
+               }
+               for my $flavor (@binary_flavors) {
+                       my $config = "$arch/$flavor";
+                       next unless exists($kernels{$config});
+                       my @versions = list_old_versions($config);
+                       for my $ver (@versions) {
+                               my @pacs = @{$kernels{$config}->{$ver}};
+                               my $remove_all = 1;
+                               # do not remove kernel-$flavor-devel-$ver
+                               # if kernel-syms-$ver still exists
+                               if (grep { /-devel$/ } @pacs) {
+                                       my $syms = "syms";
+                                       if ($flavor =~ /^rt/) {
+                                               $syms = "syms-rt";
+                                       }
+                                       if (exists($kernels{$syms}->{$ver})) {
+                                               $remove_all = 0;
+                                               @pacs = grep { !/-devel$/ }
+                                                       @pacs;
+                                       }
+                               }
+                               push(@packages, @pacs);
+                               if ($remove_all) {
+                                       delete($kernels{$config}->{$ver});
+                               }
+                       }
+               }
+       }
+       for my $config (@source_configs) {
+               my @versions = list_old_versions($config);
+               for my $ver (@versions) {
+                       # Remove kernel-{devel,source} only if no other package
+                       # of the same version exists
+                       next if package_exists($ver, \@archs, \@binary_flavors);
+                       push(@packages, @{$kernels{$config}->{$ver}});
+               }
        }
        return @packages;
 }
@@ -226,17 +322,15 @@
        }
 }
 
-for my $arg (@ARGV) {
-       if ($arg eq "-h" || $arg eq "--help") {
-               usage();
-               exit;
-       } elsif ($arg eq "--test") {
-               $test_only = 1;
-       } elsif ($arg =~ /^-/) {
-               print STDERR "Unknown option: $arg\n";
-               usage();
-               exit 1;
-       }
+if (!GetOptions(
+               "h|help" => sub { usage(); exit; },
+               "--test" => \$test_only,
+               "--fake-config=s" => \$fake_config,
+               "--fake-rpm-qa=s" => \$fake_rpm_qa,
+               "--fake-uname-r=s" => \$fake_uname_r,
+               "--fake-uname-m=s" => \$fake_uname_m)) {
+       usage();
+       exit 1;
 }
 load_config();
 if (!@keep_spec) {
@@ -246,7 +340,7 @@
 
 load_packages();
 if ($want_running) {
-       $running_version = `uname -r`;
+       $running_version = $fake_uname_r ? $fake_uname_r : `uname -r`;
        chomp($running_version);
        ($running_flavor = $running_version) =~ s/.*-//;
        $running_version =~ s/-[^-]*$//;
@@ -260,15 +354,12 @@
 
        $running_version .= "-$release";
 
-       my $arch = `uname -m`;
+       my $arch = $fake_uname_m ? $fake_uname_m : `uname -m`;
        chomp($arch);
        $arch =~ s/^i.86$/i586/;
        $running_flavor = "$arch/$running_flavor";
 }
-my @remove;
-for my $flavor (sort(keys(%kernels))) {
-       push(@remove, list_old_packages($flavor));
-}
+my @remove = list_old_packages();
 if (!@remove) {
        print STDERR "$0: Nothing to do.\n";
        exit 0;

continue with "q"...



Remember to have fun...

-- 
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to