diff options
Diffstat (limited to 'perl-install/pkgs.pm')
| -rw-r--r-- | perl-install/pkgs.pm | 79 |
1 files changed, 58 insertions, 21 deletions
diff --git a/perl-install/pkgs.pm b/perl-install/pkgs.pm index f89881145..6bcdbab7f 100644 --- a/perl-install/pkgs.pm +++ b/perl-install/pkgs.pm @@ -1,7 +1,7 @@ -package pkgs; # $Id$ +package pkgs; use strict; - +use lib qw(/usr/lib/libDrakX); # for perl_checker use common; use run_program; use detect_devices; @@ -36,7 +36,7 @@ sub read_rpmsrate_raw { my ($t, $flag, @l2); while ($data =~ /^(( - [1-5] + [1-6] | (?: (?: !\s*)? [0-9A-Z_]+(?:".*?")?) (?: \s*\|\|\s* (?: !\s*)? [0-9A-Z_]+(?:".*?")?)* @@ -74,7 +74,7 @@ sub read_rpmsrate_raw { } elsif (@diff1 == 1 && @diff2 == 1) { @new_flags = (@common, join('||', $diff1[0], $diff2[0])); } else { - log::l("$line_nb: can not handle complicate flags for packages appearing twice ($name)"); + log::l("$line_nb: cannot handle complicate flags for packages appearing twice ($name)"); $fatal_error++; } log::l("$line_nb: package $name appearing twice with different rates ($rate != " . $rates{$name} . ")") if $rate != $rates{$name}; @@ -92,7 +92,7 @@ sub read_rpmsrate_raw { } sub read_rpmsrate { - my ($packages, $rpmsrate_flags_chosen, $file, $match_all_hardware) = @_; + my ($packages, $rpmsrate_flags_chosen, $file, $match_all_hardware, $o_match_only_hardware) = @_; my ($rates, $flags, $need_to_copy) = read_rpmsrate_raw($file); @@ -109,7 +109,7 @@ sub read_rpmsrate { $p = install::pkgs::packageByName($packages, $_) or next; if (my @l = map { /locales-(.*)/ ? qq(LOCALES"$1") : () } $p->requires_nosense) { if (@l > 1) { - log::l("ERROR: package $_ is requiring many locales") if $_ ne 'lsb'; + log::l("ERROR: package $_ is requiring many locales") if !member($_, qw(lsb libreoffice-langpack-br)); } else { push @flags, @l; } @@ -118,6 +118,7 @@ sub read_rpmsrate { @flags = map { my ($user_flags, $known_flags) = partition { /^!?CAT_/ } split('\|\|', $_); + my $bits_ok; my $ok = find { my $inv = s/^!//; return 0 if $::isStandalone && $inv; @@ -125,20 +126,27 @@ sub read_rpmsrate { $match_all_hardware ? 1 : ($inv xor find { $_->{description} =~ /$p/i } @probeall); } elsif (($p) = /^DRIVER"(.*)"/) { $match_all_hardware ? 1 : ($inv xor find { $_->{driver} =~ /$p/i } @probeall); + } elsif (/^TYPE"64bit"/) { + #- When searching for hardware support packages, we need to filter out packages + #- that don't match our architecture without signalling a positive match for + #- packages that do. So we record the result of the test here for use later. + $bits_ok ||= ($inv xor $TYPEs->{'64bit'}); + $o_match_only_hardware ? 0 : $bits_ok; } elsif (($p) = /^TYPE"(.*)"/) { $match_all_hardware ? 1 : ($inv xor $TYPEs->{$p}); } elsif (($p) = /^HW_CAT"(.*)"/) { $match_all_hardware ? 1 : ($inv xor detect_devices::probe_category($p)); - } else { + } else { # LOCALES"", SOUND, ... $inv xor $rpmsrate_flags_chosen->{$_}; } } @$known_flags; - $ok ? 'TRUE' : @$user_flags ? join('||', @$user_flags) : 'FALSE'; + $ok ? 'TRUE' : @$user_flags ? join('||', @$user_flags) : $bits_ok ? () : 'FALSE'; } @flags; + @flags = member('FALSE', @flags) ? 'FALSE' : @flags; if ($::isInstall) { $p->set_rate($rates->{$_}); - $p->set_rflags(member('FALSE', @flags) ? 'FALSE' : @flags); + $p->set_rflags(@flags); } else { $flags->{$_} = \@flags; } @@ -149,18 +157,29 @@ sub read_rpmsrate { sub simple_read_rpmsrate { - my ($o_match_all_hardware) = @_; - my ($rates, $flags) = read_rpmsrate({}, {}, $::prefix . '/usr/share/meta-task/rpmsrate-raw', $o_match_all_hardware); + my ($o_match_all_hardware, $o_ignore_flags, $o_match_only_hardware) = @_; + my ($rates, $flags) = read_rpmsrate({}, {}, $::prefix . '/usr/share/meta-task/rpmsrate-raw', $o_match_all_hardware, $o_match_only_hardware); + + # FIXME: we do not handle !CAT_desktop but we do not care for now: + if (!$o_match_all_hardware && $o_ignore_flags) { + while (my ($pkg, $pkg_flags) = each %$flags) { + my $flags_str = "@$pkg_flags"; + if ($flags_str =~ /TRUE/ && any { $flags_str =~ /[^!]$_/ } @$o_ignore_flags) { + delete $flags->{$pkg}; + } + } + } + grep { member('TRUE', @{$flags->{$_}}) && $rates->{$_} >= 5 } keys %$flags; } sub detect_rpmsrate_hardware_packages { - my ($o_match_all_hardware) = @_; - grep { !/openoffice/ } simple_read_rpmsrate($o_match_all_hardware); + my ($o_match_all_hardware, $ignore_flags) = @_; + grep { !/openoffice|java/ } simple_read_rpmsrate($o_match_all_hardware, $ignore_flags, 'match-only-hardware'); } sub detect_graphical_drivers { - my ($do_pkgs, $o_match_all_hardware) = @_; + my ($do_pkgs, $o_match_all_hardware, $o_firmware_only) = @_; require Xconfig::card; require Xconfig::proprietary; @@ -172,8 +191,11 @@ sub detect_graphical_drivers { @cards = Xconfig::card::probe(); } + my @firmware_pkgs = grep { $_ } uniq(map { $_->{FIRMWARE} } @cards); + return @firmware_pkgs if $o_firmware_only; my @drivers = grep { $_ } uniq(map { $_->{Driver2} } @cards); - map { Xconfig::proprietary::pkgs_for_Driver2($_, $do_pkgs) } @drivers; + my @proprietary_pkgs = map { Xconfig::proprietary::pkgs_for_Driver2($_, $do_pkgs) } @drivers; + return @firmware_pkgs, @proprietary_pkgs; } sub detect_network_drivers { @@ -195,7 +217,7 @@ sub detect_network_drivers { foreach my $settings (@network_settings) { foreach (@network::thirdparty::thirdparty_types) { my @packages = network::thirdparty::get_required_packages($_, $settings); - push @l, network::thirdparty::get_available_packages($_, $do_pkgs, @packages); + push @l, network::thirdparty::get_available_packages($_, $do_pkgs, @packages) if @packages; } } } @@ -204,8 +226,17 @@ sub detect_network_drivers { sub detect_hardware_packages { my ($do_pkgs, $o_match_all_hardware) = @_; + my @ignore_flags = $::isInstall ? () : ( + if_(!$do_pkgs->is_installed('task-plasma-minimal'), "CAT_PLASMA"), + if_(!$do_pkgs->is_installed('task-gnome-minimal'), "CAT_GNOME"), + if_(!$do_pkgs->is_installed('task-cinnamon-minimal'), "CAT_CINNAMON"), + if_(!$do_pkgs->is_installed('task-mate-minimal'), "CAT_MATE"), + if_(!$do_pkgs->is_installed('task-xfce-minimal'), "CAT_XFCE"), + if_(!$do_pkgs->is_installed('task-enlightenment-minimal'), "CAT_ENLIGHTENMENT"), + if_(!$do_pkgs->is_installed('task-lxqt-minimal'), "CAT_LXQT"), + ); ( - ($::isInstall ? () : detect_rpmsrate_hardware_packages($o_match_all_hardware)), + ($::isInstall ? () : detect_rpmsrate_hardware_packages($o_match_all_hardware, \@ignore_flags)), detect_graphical_drivers($do_pkgs, $o_match_all_hardware), detect_network_drivers($do_pkgs, $o_match_all_hardware), ); @@ -224,13 +255,14 @@ sub detect_unselected_locale_packages { require lang; my $locales_prefix = 'locales-'; my $locale = lang::read(); - my $selected_locale = $locales_prefix . $locale->{lang}; + my @selected_locales = map { $locales_prefix . $_ } lang::locale_to_main_locale($locale->{lang}), lang::locale_to_main_locale(lang::c2locale($locale->{country})); my @available_locales = $do_pkgs->are_installed($locales_prefix . '*'); - member($selected_locale, @available_locales) ? difference2(\@available_locales, [ $selected_locale ]) : (); + my @unneeded_locales = difference2(\@available_locales, \@selected_locales); + $do_pkgs->are_installed(@unneeded_locales); } sub remove_unused_packages { - my ($in, $do_pkgs) = @_; + my ($in, $do_pkgs, $o_prefix) = @_; my $wait; $wait = $in->wait_message(N("Unused packages removal"), N("Finding unused hardware packages...")); @@ -240,6 +272,10 @@ sub remove_unused_packages { my @unselected_locales = detect_unselected_locale_packages($do_pkgs); undef $wait; + # Packages to not remove even if they seem unused + my @wanted_hardware_packages = qw(gnome-bluetooth pulseaudio-module-bluetooth gnome-phone-manager bluedevil kppp ppp wireless-tools wireless-regdb wpa_supplicant iw crda kernel-firmware-nonfree radeon-firmware ralink-firmware rtlwifi-firmware ipw2100-firmware ipw2200-firmware iwlwifi-3945-ucode iwlwifi-4965-ucode iwlwifi-firmware b43-fwcutter b43-openfwwf atmel-firmware speedtouch-firmware zd1211-firmware isdn4k-utils rfkill x11-driver-input-wacom x11-driver-video-vmware usb_modeswitch usb_modeswitch-data); + @unused_hardware_packages = difference2(\@unused_hardware_packages, \@wanted_hardware_packages); + @unused_hardware_packages || @unselected_locales or return; my $hardware = @unused_hardware_packages; @@ -263,7 +299,8 @@ sub remove_unused_packages { #- we should have some gurpme $wait = $in->wait_message(N("Please wait"), N("Removing packages...")); - run_program::run('urpme', '--auto', + #- disable timeout, it can cause irrepairable damage to the rpm database (mga#27580) + run_program::raw({ root => $o_prefix, timeout => 'never' }, 'urpme', '--auto', if_($hardware, @unused_hardware_packages), if_($locales, @unselected_locales), ); |
