diff options
-rw-r--r-- | urpm.pm | 163 | ||||
-rwxr-xr-x | urpmi | 368 | ||||
-rw-r--r-- | urpmi.spec | 10 |
3 files changed, 308 insertions, 233 deletions
@@ -3,7 +3,7 @@ package urpm; use strict; use vars qw($VERSION @ISA @EXPORT); -$VERSION = '4.3'; +$VERSION = '4.4'; @ISA = qw(Exporter URPM); @EXPORT = qw(*N); @@ -784,10 +784,16 @@ sub configure { } #- determine package to withdraw (from skip.list file) only if something should be withdrawn. unless ($options{noskipping}) { - $urpm->compute_skip_flags($urpm->get_unwanted_packages($options{skip}), callback => sub { - my ($urpm, $pkg) = @_; - $urpm->{log}(N("skipping package %s", scalar($pkg->fullname))); - }); + $urpm->compute_flags($urpm->get_packages_list($urpm->{skiplist}, $options{skip}), skip => 1, callback => sub { + my ($urpm, $pkg) = @_; + $urpm->{log}(N("skipping package %s", scalar($pkg->fullname))); + }); + } + unless ($options{noinstalling}) { + $urpm->compute_flags($urpm->get_packages_list($urpm->{instlist}, $options{skip}), disable_obsolete => 1, callback => sub { + my ($urpm, $pkg) = @_; + $urpm->{log}(N("would install instead of upgrade package %s", scalar($pkg->fullname))); + }); } if ($options{bug}) { #- and a dump of rpmdb itself as synthesis file. @@ -2150,32 +2156,41 @@ sub resolve_dependencies { $options{auto_select} and $urpm->request_packages_to_upgrade($db, $state, $requested, requested => undef); $urpm->resolve_requested($db, $state, $requested, %options); + + #- build transaction set now... + $urpm->build_transaction_set($db, $state, %options); } } #- get list of package that should not be upgraded. -sub get_unwanted_packages { - my ($urpm, $skip) = @_; - my %skip; +sub get_packages_list { + my ($urpm, $file, $extra) = @_; + my %val; local ($_, *F); - open F, $urpm->{skiplist}; + open F, $file; while (<F>) { chomp; s/#.*$//; s/^\s*//; s/\s*$//; if (my ($n, $s) = /^([^\s\[]+)(?:\[\*\])?\[?\s*([^\s\]]*\s*[^\s\]]*)/) { - $skip{$n}{$s} = undef; + $val{$n}{$s} = undef; } } close F; #- additional skipping from given parameter. - foreach (split ',', $skip) { + foreach (split ',', $extra) { if (my ($n, $s) = /^([^\s\[]+)(?:\[\*\])?\[?\s*([^\s\]]*\s*[^\s\]]*)/) { - $skip{$n}{$s} = undef; + $val{$n}{$s} = undef; } } - \%skip; + \%val; +} +#- for compability... +sub get_unwanted_packages { + my ($urpm, $skip) = @_; + print STDERR "calling obsoleted method urpm::get_unwanted_packages\n"; + get_packages_list($urpm->{skiplist}, $skip); } #- select source for package selected. @@ -2307,7 +2322,48 @@ sub get_source_packages { #- return a list of package ready for rpm. sub download_source_packages { my ($urpm, $local_sources, $list, %options) = @_; - my (%sources, %error_sources, %removables); + my %sources = %$local_sources; + my %error_sources; + + print STDERR "calling obsoleted method urpm::download_source_packages\n"; + + $urpm->exlock_urpmi_db; + $urpm->copy_packages_of_removable_media($list, \%sources, %options) or return; + $urpm->download_packages_of_distant_media($list, \%sources, \%error_sources, %options); + $urpm->unlock_urpmi_db; + + %sources, %error_sources; +} + +sub exlock_urpmi_db { + my ($urpm) = @_; + + #- avoid putting a require on Fcntl ':flock' (which is perl and not perl-base). + my $LOCK_EX = 2; + + #- lock urpmi database, but keep lock to wait for an urpmi.update to finish. + open LOCK_FILE, $urpm->{statedir}; + flock LOCK_FILE, $LOCK_EX or $urpm->{fatal}(7, N("urpmi database locked")); +} + +sub unlock_urpmi_db { + my ($_urpm) = @_; + + #- avoid putting a require on Fcntl ':flock' (which is perl and not perl-base). + my $LOCK_UN = 8; + + #- now everything is finished. + system("sync"); + + #- release lock on database. + flock LOCK_FILE, $LOCK_UN; + close LOCK_FILE; + +} + +sub copy_packages_of_removable_media { + my ($urpm, $list, $sources, %options) = @_; + my %removables; #- make sure everything is correct on input... @{$urpm->{media} || []} == @$list or return; @@ -2361,13 +2417,13 @@ sub download_source_packages { #- now we can consider the file to be fine. unlink "$urpm->{cachedir}/rpms/$filename"; rename "$urpm->{cachedir}/partial/$filename", "$urpm->{cachedir}/rpms/$filename"; - -r "$urpm->{cachedir}/rpms/$filename" and $sources{$i} = "$urpm->{cachedir}/rpms/$filename"; + -r "$urpm->{cachedir}/rpms/$filename" and $sources->{$i} = "$urpm->{cachedir}/rpms/$filename"; } } else { - $sources{$i} = $filepath; + $sources->{$i} = $filepath; } } - unless ($sources{$i}) { + unless ($sources->{$i}) { #- fallback to use other method for retrieving the file later. $urpm->{error}(N("unable to read rpm file [%s] from medium \"%s\"", $filepath, $medium->{name})); } @@ -2381,14 +2437,6 @@ sub download_source_packages { } }; - #- avoid putting a require on Fcntl ':flock' (which is perl and not perl-base). - my ($LOCK_EX, $LOCK_UN) = (2, 8); - - #- lock urpmi database, but keep lock to wait for an urpmi.update to finish. - local (*LOCK_FILE); - open LOCK_FILE, $urpm->{statedir}; - flock LOCK_FILE, $LOCK_EX or $urpm->{fatal}(7, N("urpmi database locked")); - foreach (0..$#$list) { values %{$list->[$_]} or next; my $medium = $urpm->{media}[$_]; @@ -2428,6 +2476,12 @@ sub download_source_packages { $examine_removable_medium->($removables{$device}[0], $device, $urpm->is_using_supermount($device) && 'copy'); } + 1; +} + +sub download_packages_of_distant_media { + my ($urpm, $list, $sources, $error_sources, %options) = @_; + #- get back all ftp and http accessible rpms file into the local cache #- if necessary (as used by checksig or any other reasons). foreach (0..$#$list) { @@ -2439,18 +2493,18 @@ sub download_source_packages { #- examine all files to know what can be indexed on multiple media. while (my ($i, $url) = each %{$list->[$_]}) { #- it is trusted that the url given is acceptable, so the file can safely be ignored. - defined $sources{$i} and next; + defined $sources->{$i} and next; if ($url =~ /^(removable[^:]*|file):\/(.*\.rpm)$/) { if (-r $2) { - $sources{$i} = $2; + $sources->{$i} = $2; } else { - $error_sources{$i} = $2; + $error_sources->{$i} = $2; } } elsif ($url =~ /^([^:]*):\/(.*\/([^\/]*\.rpm))$/) { if ($options{force_local} || $1 ne 'ftp' && $1 ne 'http') { #- only ftp and http protocol supported by grpmi. $distant_sources{$i} = "$1:/$2"; } else { - $sources{$i} = "$1:/$2"; + $sources->{$i} = "$1:/$2"; } } else { $urpm->{error}(N("malformed input: [%s]", $url)); @@ -2484,51 +2538,44 @@ sub download_source_packages { #- it seems the the file has been downloaded correctly and has been checked to be valid. unlink "$urpm->{cachedir}/rpms/$filename"; rename "$urpm->{cachedir}/partial/$filename", "$urpm->{cachedir}/rpms/$filename"; - -r "$urpm->{cachedir}/rpms/$filename" and $sources{$i} = "$urpm->{cachedir}/rpms/$filename"; + -r "$urpm->{cachedir}/rpms/$filename" and $sources->{$i} = "$urpm->{cachedir}/rpms/$filename"; } - unless ($sources{$i}) { - $error_sources{$i} = $distant_sources{$i}; + unless ($sources->{$i}) { + $error_sources->{$i} = $distant_sources{$i}; } } } } #- clean failed download which have succeeded. - delete @error_sources{keys %sources}; + delete @{$error_sources}{keys %$sources}; - #- now everything is finished. - system("sync"); + 1; +} - #- release lock on database. - flock LOCK_FILE, $LOCK_UN; - close LOCK_FILE; +#- prepare transaction. +sub prepare_transaction { + my ($urpm, $set, $list, $sources, $transaction_list, $transaction_sources) = @_; - #- return the hash of rpm file that have to be installed, they are all local now. - %$local_sources, %sources, %error_sources; + foreach my $id (@{$set->{upgrade}}) { + my $pkg = $urpm->{depslist}[$id]; + foreach (0..$#$list) { + exists $list->[$_]{$id} and $transaction_list->[$_]{$id} = $list->[$_]{$id}; + } + exists $sources->{$id} and $transaction_sources->{$id} = $sources->{$id}; + } } #- extract package that should be installed instead of upgraded, #- sources is a hash of id -> source rpm filename. sub extract_packages_to_install { my ($urpm, $sources) = @_; - my %inst; - local ($_, *F); - open F, $urpm->{instlist}; - while (<F>) { - chomp; s/#.*$//; s/^\s*//; s/\s*$//; - foreach (keys %{$urpm->{provides}{$_} || {}}) { - my $pkg = $urpm->{depslist}[$_] or next; - #- some package with specific naming convention to avoid upgrade problem - #- should not be taken into account here. - #- these package have version=1 and release=1mdk, and name contains version and release. - $pkg->version eq '1' && $pkg->release eq '1mdk' && $pkg->name =~ /^.*-[^\-]*mdk$/ and next; - - exists($sources->{$pkg->id}) and $inst{$pkg->id} = delete $sources->{$pkg->id}; - } + foreach (keys %$sources) { + my $pkg = $urpm->{depslist}[$_] or next; + $pkg->flag_disable_obsolete and $inst{$pkg->id} = delete $sources->{$pkg->id}; } - close F; \%inst; } @@ -2572,7 +2619,7 @@ sub install { my $trans = $db->create_transaction($urpm->{root}); if ($trans) { $urpm->{log}(N("created transaction for installing on %s (remove=%d, install=%d, upgrade=%d)", $urpm->{root} || '/', - scalar(@$remove), scalar(values %$install), scalar(values %$upgrade))); + scalar(@{$remove || []}), scalar(values %$install), scalar(values %$upgrade))); } else { return (N("unable to create transaction")); } @@ -2792,7 +2839,7 @@ sub parallel_remove { #- misc functions to help finding ask_unselect and ask_remove elements with their reasons translated. sub unselected_packages { - my ($urpm, $state, %options) = @_; + my ($urpm, $state) = @_; grep { $state->{rejected}{$_}{backtrack} } keys %{$state->{rejected} || {}}; } @@ -2808,7 +2855,7 @@ sub translate_why_unselected { } sub removed_packages { - my ($urpm, $state, %options) = @_; + my ($urpm, $state) = @_; grep { $state->{rejected}{$_}{removed} && !$state->{rejected}{$_}{obsoleted} } keys %{$state->{rejected} || {}}; } @@ -386,6 +386,7 @@ $urpm->resolve_dependencies($state, \%requested, callback_choices => \&ask_choice, install_src => $install_src, nodeps => $urpm->{options}{'allow-nodeps'} || $urpm->{options}{'allow-force'}, + split_level => 1, ); my @ask_unselect = $urpm->unselected_packages($state); @@ -475,7 +476,8 @@ if (@root_only) { #- if not root, the list become invisible and no download will be possible. my ($local_sources, $list) = $urpm->get_source_packages($state->{selected}, - clean_all => $clean, clean_other => !$noclean && $urpm->{options}{'pre-clean'}); + clean_all => $clean, + clean_other => !$noclean && $urpm->{options}{'pre-clean'}); unless ($local_sources || $list) { $urpm->{fatal}(3, N("unable to get source packages, aborting")); } @@ -484,207 +486,229 @@ if ($X) { require gurpm; gurpm::init(N("Package installation..."), N("Initializing...")); } -my %sources = $urpm->download_source_packages($local_sources, $list, + +my %sources = %$local_sources; +my %error_sources; + +$urpm->exlock_urpmi_db; +$urpm->copy_packages_of_removable_media($list, \%sources, + verbose => $verbose > 0, + force_local => 1, + ask_for_medium => (!$auto || $allow_medium_change) && sub { + my $msg = N("Please insert the medium named \"%s\" on device [%s]", @_); + my $msg2 = N("Press Enter when ready..."); + if ($X) { + $msg =~ s/"/\\"/g; + gmessage($msg); + !$?; + } else { + defined message_input("$msg\n$msg2 "); + } + }); + +foreach my $set (@{$state->{transaction} || []}) { + my (@transaction_list, %transaction_sources); + + #- prepare transaction... + $urpm->prepare_transaction($set, $list, \%sources, \@transaction_list, \%transaction_sources); + + #- first, filter out what is really needed to download for this small transaction. + $urpm->download_packages_of_distant_media($list, \%transaction_sources, \%error_sources, verbose => $verbose > 0, limit_rate => $urpm->{options}{'limit-rate'}, + force_local => 1, callback => sub { my ($mode, $file, $percent, $total, $eta, $speed) = @_; - if ($X) { - if ($mode eq 'start') { - $file =~ s|/*\s*$||; $file =~ s|.*/||; - gurpm::label(N("Downloading package `%s'...", $file)); - } elsif ($mode eq 'progress') { - gurpm::progress($percent/100); - } elsif ($mode eq 'end') { - gurpm::progress(1); - } - } else { - if ($mode eq 'start') { - print STDERR " $file\n"; #- allow pass-protected url to be logged. - } elsif ($mode eq 'progress') { - if (defined $total && defined $eta) { - print SAVEERR N(" %s%% of %s completed, ETA = %s, speed = %s", - $percent, $total, $eta, $speed) . "\r"; - } else { - print SAVEERR N(" %s%% completed, speed = %s", - $percent, $speed) . "\r"; - } - } elsif ($mode eq 'end') { - print SAVEERR " " x 79, "\r"; - } - } - }, - force_local => 1, - ask_for_medium => (!$auto || $allow_medium_change) && sub { - my $msg = N("Please insert the medium named \"%s\" on device [%s]", @_); - my $msg2 = N("Press Enter when ready..."); if ($X) { - $msg =~ s/"/\\"/g; - gmessage($msg); - !$?; + if ($mode eq 'start') { + $file =~ s|/*\s*$||; $file =~ s|.*/||; + gurpm::label(N("Downloading package `%s'...", $file)); + } elsif ($mode eq 'progress') { + gurpm::progress($percent/100); + } elsif ($mode eq 'end') { + gurpm::progress(1); + } } else { - defined message_input("$msg\n$msg2 "); + if ($mode eq 'start') { + print STDERR " $file\n"; #- allow pass-protected url to be logged. + } elsif ($mode eq 'progress') { + if (defined $total && defined $eta) { + print SAVEERR N(" %s%% of %s completed, ETA = %s, speed = %s", + $percent, $total, $eta, $speed) . "\r"; + } else { + print SAVEERR N(" %s%% completed, speed = %s", + $percent, $speed) . "\r"; + } + } elsif ($mode eq 'end') { + print SAVEERR " " x 79, "\r"; + } } - }); -my %sources_install = %{$urpm->extract_packages_to_install(\%sources) || {}}; - -if ($urpm->{options}{'verify-rpm'}) { - my ($medium, %invalid_sources); + }, + ); + my %transaction_sources_install = %{$urpm->extract_packages_to_install(\%transaction_sources) || {}}; + + if ($urpm->{options}{'verify-rpm'}) { + my ($medium, %invalid_sources); - foreach my $id (sort { $a <=> $b } keys %sources_install, keys %sources) { - my $verif = URPM::verify_rpm($sources_install{$id} || $sources{$id}); + foreach my $id (sort { $a <=> $b } keys %transaction_sources_install, keys %transaction_sources) { + my $verif = URPM::verify_rpm($transaction_sources_install{$id} || $transaction_sources{$id}); - if ($verif =~ /NOT OK/) { - $invalid_sources{$sources_install{$id} || $sources{$id}} = N("Invalid signature (%s)", $verif); - } else { - unless ($medium && $medium->{start} <= $id && $id <= $medium->{end}) { - $medium = undef; - foreach (@{$urpm->{media}}) { - $_->{start} <= $id && $id <= $_->{end} and $medium = $_, last; + if ($verif =~ /NOT OK/) { + $invalid_sources{$transaction_sources_install{$id} || + $transaction_sources{$id}} = N("Invalid signature (%s)", $verif); + } else { + unless ($medium && $medium->{start} <= $id && $id <= $medium->{end}) { + $medium = undef; + foreach (@{$urpm->{media}}) { + $_->{start} <= $id && $id <= $_->{end} and $medium = $_, last; + } } - } - my $key_ids = $medium && $medium->{key_ids} || $urpm->{options}{key_ids}; - #- check the key ids of the medium are matching (all) the given key id of the package. - if ($key_ids) { - my $valid_ids = 0; - my $invalid_ids = 0; - - foreach my $key_id ($verif =~ /#(\S+)/g) { - if (grep { hex($_) == hex($key_id) } split /[,\s]+/, $key_ids) { - ++$valid_ids; - } else { - ++$invalid_ids; + my $key_ids = $medium && $medium->{key_ids} || $urpm->{options}{key_ids}; + #- check the key ids of the medium are matching (all) the given key id of the package. + if ($key_ids) { + my $valid_ids = 0; + my $invalid_ids = 0; + + foreach my $key_id ($verif =~ /#(\S+)/g) { + if (grep { hex($_) == hex($key_id) } split /[,\s]+/, $key_ids) { + ++$valid_ids; + } else { + ++$invalid_ids; + } } - } - if ($invalid_ids) { - $invalid_sources{$sources_install{$id} || $sources{$id}} = N("Invalid Key ID (%s)", $verif); - } elsif (!$valid_ids) { - $invalid_sources{$sources_install{$id} || $sources{$id}} = N("Missing signature (%s)", $verif); + if ($invalid_ids) { + $invalid_sources{$transaction_sources_install{$id} || + $transaction_sources{$id}} = N("Invalid Key ID (%s)", $verif); + } elsif (!$valid_ids) { + $invalid_sources{$transaction_sources_install{$id} || + $transaction_sources{$id}} = N("Missing signature (%s)", $verif); + } } } } - } - if (%invalid_sources) { - my $msg = N("The following packages have bad signatures"); - my $msg2 = N("Do you want to continue installation ?"); - my $p = join "\n", map { "$_: $invalid_sources{$_}"} sort { $a cmp $b} keys %invalid_sources; - if ($auto) { - message("$msg:\n$p\n", 'noX'); - exit 1; - } else { - if ($X) { - gmessage("$msg:\n$p\n\n$msg2"); - $? and exit 1; + if (%invalid_sources) { + my $msg = N("The following packages have bad signatures"); + my $msg2 = N("Do you want to continue installation ?"); + my $p = join "\n", map { "$_: $invalid_sources{$_}"} sort { $a cmp $b} keys %invalid_sources; + if ($auto) { + message("$msg:\n$p\n", 'noX'); + exit 1; } else { - $noexpr = N("Nn"); - $yesexpr = N("Yy"); - message_input("$msg:\n$p\n$msg2" . N(" (y/N) ")) =~ /[$yesexpr]/ or exit 1; + if ($X) { + gmessage("$msg:\n$p\n\n$msg2"); + $? and exit 1; + } else { + $noexpr = N("Nn"); + $yesexpr = N("Yy"); + message_input("$msg:\n$p\n$msg2" . N(" (y/N) ")) =~ /[$yesexpr]/ or exit 1; + } } } } -} -#- check for local files. -if (my @missing = grep { m|^/| && ! -e $_ } values %sources_install, values %sources) { - message(N("Installation failed, some files are missing:\n%s\nYou may want to update your urpmi database", - join "\n", map { " $_" } @missing)); - exit 2; -} + #- check for local files. + if (my @missing = grep { m|^/| && ! -e $_ } values %transaction_sources_install, values %transaction_sources) { + message(N("Installation failed, some files are missing:\n%s\nYou may want to update your urpmi database", + join "\n", map { " $_" } @missing)); + exit 2; + } -#- install source package only (whatever the user is root or not, but use rpm for that). -if ($install_src) { - if (my @l = grep { /\.src\.rpm$/ } values %sources_install, values %sources) { - system("rpm", "-i$rpm_opt", @l, ($root ? ("--root", $root) : @{[]})); - $? and message(N("Installation failed")), exit 1; + #- install source package only (whatever the user is root or not, but use rpm for that). + if ($install_src) { + if (my @l = grep { /\.src\.rpm$/ } values %transaction_sources_install, values %transaction_sources) { + system("rpm", "-i$rpm_opt", @l, ($root ? ("--root", $root) : @{[]})); + $? and message(N("Installation failed")), exit 1; + } + exit 0; } - exit 0; -} -#- clean to remove any src package now. -foreach (\%sources_install, \%sources) { - foreach my $id (keys %$_) { - my $pkg = $urpm->{depslist}[$id] or next; - $pkg->arch eq 'src' and delete $_->{$id}; + #- clean to remove any src package now. + foreach (\%transaction_sources_install, \%transaction_sources) { + foreach my $id (keys %$_) { + my $pkg = $urpm->{depslist}[$id] or next; + $pkg->arch eq 'src' and delete $_->{$id}; + } } -} -if (%sources_install || %sources) { - if ($parallel) { - message(N("distributing %s\n", join(' ', values %sources_install, values %sources)), 'noX'); - #- no remove are handle here, automatically done by each distant node. - $urpm->{log}("starting distributed install"); - $urpm->parallel_install([ keys %{$state->{rejected} || {}} ], \%sources_install, \%sources, - test => $test, - excludepath => $urpm->{options}{excludepath}, excludedocs => $urpm->{options}{excludedocs}); + if (%transaction_sources_install || %transaction_sources) { + if ($parallel) { + message(N("distributing %s\n", join(' ', values %transaction_sources_install, values %transaction_sources)), 'noX'); + #- no remove are handle here, automatically done by each distant node. + $urpm->{log}("starting distributed install"); + $urpm->parallel_install([ keys %{$state->{rejected} || {}} ], \%transaction_sources_install, \%transaction_sources, + test => $test, + excludepath => $urpm->{options}{excludepath}, excludedocs => $urpm->{options}{excludedocs}); + } else { + message(N("installing %s\n", join(' ', values %transaction_sources_install, values %transaction_sources)), 'noX'); + log_it(scalar localtime, " ", join(' ', values %transaction_sources_install, values %transaction_sources), "\n"); + $urpm->{log}("starting installing packages"); + my $progress_nb; + my $total_nb = grep { m|^/| } values %transaction_sources_install, values %transaction_sources; + my $callback_inst = $X && sub { + my ($urpm, $type, $id, $subtype, $amount, $total) = @_; + my $pkg = defined $id && $urpm->{depslist}[$id]; + + if ($subtype eq 'start') { + if ($type eq 'trans') { + gurpm::label(N("Preparing...")); + } else { + gurpm::label(N("Installing package `%s' (%s/%s)...", $pkg->name, ++$progress_nb, $total_nb)); + } + } elsif ($subtype eq 'progress') { + gurpm::progress($amount/$total); + } + }; + my @l = $urpm->install($set->{remove} || [], \%transaction_sources_install, \%transaction_sources, + translate_message => 1, + oldpackage => $state->{oldpackage}, post_clean_cache => $urpm->{options}{'post-clean'}, + test => $test, + excludepath => $urpm->{options}{excludepath}, excludedocs => $urpm->{options}{excludedocs}, + callback_inst => $callback_inst, callback_trans => $callback_inst); + $X and gurpm::end(); + if (@l) { + message(N("Installation failed") . ":\n" . join("\n", map { "\t$_" } @l)); + + m|^/| && !-e $_ and exit 2 foreach values %transaction_sources_install, values %transaction_sources; #- missing local file + $auto || !$urpm->{options}{'allow-nodeps'} && !$urpm->{options}{'allow-force'} and exit 1; + + $noexpr = N("Nn"); + $yesexpr = N("Yy"); + message_input(N("Try installation without checking dependencies? (y/N) "), $force && $yesexpr) =~ /[$yesexpr]/ + or exit 1; + $urpm->{log}("starting installing packages without deps"); + @l = $urpm->install($set->{remove} || [], \%transaction_sources_install, \%transaction_sources, + translate_message => 1, nodeps => 1, + oldpackage => $state->{oldpackage}, post_clean_cache => $urpm->{options}{'post-clean'}, + test => $test, + excludepath => $urpm->{options}{excludepath}, excludedocs => $urpm->{options}{excludedocs}); + if (@l) { + message(N("Installation failed") . ":\n" . join("\n", map { "\t$_" } @l)); + !$urpm->{options}{'allow-force'} and exit 1; + message_input(N("Try installation even more strongly (--force)? (y/N) "), $force && $yesexpr) =~ /[$yesexpr]/ + or exit 1; + $urpm->{log}("starting force installing packages without deps"); + @l = $urpm->install($set->{remove} || [], \%transaction_sources_install, \%transaction_sources, + translate_message => 1, nodeps => 1, force => 1, + oldpackage => $state->{oldpackage}, post_clean_cache => $urpm->{options}{'post-clean'}, + test => $test, + excludepath => $urpm->{options}{excludepath}, + excludedocs => $urpm->{options}{excludedocs}); + @l and $urpm->fatal(2, N("Installation failed") . ":\n" . join("\n", map { "\t$_" } @l)); + } + } else { + $test and message(N("Installation is possible")); + } + } + } elsif ($test) { + message(N("Installation is possible")); } else { - message(N("installing %s\n", join(' ', values %sources_install, values %sources)), 'noX'); - log_it(scalar localtime, " ", join(' ', values %sources_install, values %sources), "\n"); - $urpm->{log}("starting installing packages"); - my $progress_nb; - my $total_nb = grep { m|^/| } values %sources_install, values %sources; - my $callback_inst = $X && sub { - my ($urpm, $type, $id, $subtype, $amount, $total) = @_; - my $pkg = defined $id && $urpm->{depslist}[$id]; - - if ($subtype eq 'start') { - if ($type eq 'trans') { - gurpm::label(N("Preparing...")); - } else { - gurpm::label(N("Installing package `%s' (%s/%s)...", $pkg->name, ++$progress_nb, $total_nb)); - } - } elsif ($subtype eq 'progress') { - gurpm::progress($amount/$total); - } - }; - my @l = $urpm->install(\@ask_remove, \%sources_install, \%sources, - translate_message => 1, - oldpackage => $state->{oldpackage}, post_clean_cache => $urpm->{options}{'post-clean'}, - test => $test, - excludepath => $urpm->{options}{excludepath}, excludedocs => $urpm->{options}{excludedocs}, - callback_inst => $callback_inst, callback_trans => $callback_inst); - $X and gurpm::end(); - if (@l) { - message(N("Installation failed") . ":\n" . join("\n", map { "\t$_" } @l)); - - m|^/| && !-e $_ and exit 2 foreach values %sources_install, values %sources; #- missing local file - $auto || !$urpm->{options}{'allow-nodeps'} && !$urpm->{options}{'allow-force'} and exit 1; - - $noexpr = N("Nn"); - $yesexpr = N("Yy"); - message_input(N("Try installation without checking dependencies? (y/N) "), $force && $yesexpr) =~ /[$yesexpr]/ - or exit 1; - $urpm->{log}("starting installing packages without deps"); - @l = $urpm->install(\@ask_remove, \%sources_install, \%sources, - translate_message => 1, nodeps => 1, - oldpackage => $state->{oldpackage}, post_clean_cache => $urpm->{options}{'post-clean'}, - test => $test, - excludepath => $urpm->{options}{excludepath}, excludedocs => $urpm->{options}{excludedocs}); - if (@l) { - message(N("Installation failed") . ":\n" . join("\n", map { "\t$_" } @l)); - !$urpm->{options}{'allow-force'} and exit 1; - message_input(N("Try installation even more strongly (--force)? (y/N) "), $force && $yesexpr) =~ /[$yesexpr]/ - or exit 1; - $urpm->{log}("starting force installing packages without deps"); - @l = $urpm->install(\@ask_remove, \%sources_install, \%sources, - translate_message => 1, nodeps => 1, force => 1, - oldpackage => $state->{oldpackage}, post_clean_cache => $urpm->{options}{'post-clean'}, - test => $test, - excludepath => $urpm->{options}{excludepath}, - excludedocs => $urpm->{options}{excludedocs}); - @l and $urpm->fatal(2, N("Installation failed") . ":\n" . join("\n", map { "\t$_" } @l)); - } - } else { - $test and message(N("Installation is possible")); - } + $verbose >= 0 and message(N("Everything already installed"), $auto); } -} elsif ($test) { - message(N("Installation is possible")); -} else { - $verbose >= 0 and message(N("Everything already installed"), $auto); } +$urpm->unlock_urpmi_db; #- try to umount removable device which may have been mounted. $urpm->try_umounting_removables; @@ -1,15 +1,15 @@ %define group System/Configuration/Packaging Name: urpmi -Version: 4.3 -Release: 15mdk +Version: 4.4 +Release: 1mdk License: GPL Source0: %{name}.tar.bz2 Source1: %{name}.logrotate Summary: User mode rpm install URL: http://cvs.mandrakesoft.com/cgi-bin/cvsweb.cgi/soft/urpmi Requires: eject webfetch perl-DateManip >= 5.40 gnupg -PreReq: perl-Locale-gettext >= 1.01-7mdk rpmtools >= 4.3-6mdk perl-URPM >= 0.90-10mdk +PreReq: perl-Locale-gettext >= 1.01-7mdk rpmtools >= 4.3-6mdk perl-URPM >= 0.91 BuildRequires: bzip2-devel gettext rpm-devel >= 4.0.3 perl-MDK-Common-devel BuildRoot: %{_tmppath}/%{name}-buildroot BuildArch: noarch @@ -202,6 +202,10 @@ $urpm->update_media; %changelog +* Mon Jun 16 2003 François Pons <fpons@mandrakesoft.com> 4.4-1mdk +- added preliminary support for small transaction set. +- internal library changes (compabilility should have been kept). + * Fri Jun 13 2003 François Pons <fpons@mandrakesoft.com> 4.3-15mdk - fixed incorrect behaviour when no key_ids options are set. - created retrieve methods and translation methods for packages |