urpmi
view release on metacpan or search on metacpan
urpm/main_loop.pm view on Meta::CPAN
callback_open_helper => $callbacks->{open_helper},
callback_trans => $callbacks->{trans},
callback_uninst => $callbacks->{uninst},
callback_verify => $callbacks->{verify},
raw_message => 1,
);
}
sub _log_installing {
my ($urpm, $transaction_sources_install, $transaction_sources) = @_;
if (my @packnames = (values %$transaction_sources_install, values %$transaction_sources)) {
(my $common_prefix) = $packnames[0] =~ m!^(.*)/!;
if (length($common_prefix) && @packnames == grep { m!^\Q$common_prefix/! } @packnames) {
#- there's a common prefix, simplify message
$urpm->{print}(N("installing %s from %s", join(' ', map { s!.*/!!; $_ } @packnames), $common_prefix));
} else {
$urpm->{print}(N("installing %s", join "\n", @packnames));
}
}
}
sub _run_parallel_transaction {
my ($urpm, $state, $transaction_sources, $transaction_sources_install) = @_;
$urpm->{print}(N("distributing %s", join(' ', values %$transaction_sources_install, values %$transaction_sources)));
#- no remove are handle here, automatically done by each distant node.
$urpm->{log}("starting distributed install");
$urpm->{parallel_handler}->parallel_install(
$urpm,
[ keys %{$state->{rejected} || {}} ], $transaction_sources_install, $transaction_sources,
test => $test,
excludepath => $urpm->{options}{excludepath}, excludedocs => $urpm->{options}{excludedocs},
);
}
sub _run_transaction {
my ($urpm, $state, $callbacks, $set, $transaction_sources_install, $transaction_sources, $errors) = @_;
my $options = $urpm->{options};
my $allow_force = $options->{'allow-force'};
my $to_remove = $allow_force ? [] : $set->{remove} || [];
$urpm->{log}("starting installing packages");
urpm::orphans::add_unrequested($urpm, $state) if !$test;
my %install_options_common = _init_common_options($urpm, $state, $callbacks);
install:
my @l = urpm::install::install($urpm,
$to_remove,
$transaction_sources_install, $transaction_sources,
%install_options_common,
);
if (!@l) {
++$ok;
return 1;
}
my ($raw_error, $translated) = partition { /^(badarch|bados|installed|badrelocate|conflicts|installed|diskspace|disknodes|requires|conflicts|unknown)\@/ } @l;
@l = @$translated;
my $fatal = find { /^disk/ } @$raw_error;
my $no_question = $fatal || $options->{auto};
#- Warning : the following message is parsed in urpm::parallel_*
my $msg = N("Installation failed:") . "\n" . join("\n", map { "\t$_" } @l) . "\n";
if (!$no_question && !$install_options_common{nodeps} && ($options->{'allow-nodeps'} || $allow_force)) {
if ($callbacks->{ask_yes_or_no}->(N("Installation failed"),
$msg . N("Try installation without checking dependencies?"))) {
$urpm->{log}("starting installing packages without deps");
$install_options_common{nodeps} = 1;
# try again:
goto install;
}
} elsif (!$no_question && !$install_options_common{force} && $allow_force) {
if ($callbacks->{ask_yes_or_no}->(N("Installation failed"),
$msg . N("Try harder to install (--force)?"))) {
$urpm->{log}("starting force installing packages without deps");
$install_options_common{force} = 1;
# try again:
goto install;
}
}
$urpm->{log}($msg);
++$nok;
push @$errors, @l;
!$fatal;
}
=item run($urpm, $state, $something_was_to_be_done, $ask_unselect, $callbacks)
Run the main urpm loop:
=over
=item * mount removable media if needed
=item * split the work in smaller transactions
=item * for each transaction:
=over
=item * prepare the transaction
=item * download packages needed for this small transaction
=item * verify packages
=item * split package that should be installed instead of upgraded,
=item * install source package only (whatever the user is root or not, but use rpm for that)
=item * install/remove other packages
=back
=item * migrate the chrooted rpmdb if needed
( run in 0.569 second using v1.01-cache-2.11-cpan-5511b514fd6 )