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]
