summaryrefslogtreecommitdiffstats
path: root/urpm.pm
diff options
context:
space:
mode:
Diffstat (limited to 'urpm.pm')
-rw-r--r--urpm.pm209
1 files changed, 2 insertions, 207 deletions
diff --git a/urpm.pm b/urpm.pm
index 01294940..80895262 100644
--- a/urpm.pm
+++ b/urpm.pm
@@ -369,146 +369,6 @@ sub resolve_dependencies {
$need_restart;
}
-#- select sources for selected packages,
-#- according to keys of the packages hash.
-#- returns a list of lists containing the source description for each rpm,
-#- matching the exact number of registered media; ignored media being
-#- associated to a null list.
-sub get_source_packages {
- my ($urpm, $packages, %options) = @_;
- my (%protected_files, %local_sources, %fullname2id);
-
- #- build association hash to retrieve id and examine all list files.
- foreach (keys %$packages) {
- foreach (split /\|/, $_) {
- if ($urpm->{source}{$_}) {
- $protected_files{$local_sources{$_} = $urpm->{source}{$_}} = undef;
- } else {
- $fullname2id{$urpm->{depslist}[$_]->fullname} = $_ . '';
- }
- }
- }
-
- #- examine each medium to search for packages.
- #- now get rpm file name in hdlist to match list file.
- my %file2fullnames;
- foreach my $pkg (@{$urpm->{depslist} || []}) {
- $file2fullnames{$pkg->filename}{$pkg->fullname} = undef;
- }
-
- #- examine the local repository, which is trusted (no gpg or pgp signature check but md5 is now done).
- my $dh = urpm::sys::opendir_safe($urpm, "$urpm->{cachedir}/rpms");
- if ($dh) {
- while (defined(my $filename = readdir $dh)) {
- my $filepath = "$urpm->{cachedir}/rpms/$filename";
- if (-d $filepath) {
- } elsif ($options{clean_all} || ! -s _) {
- unlink $filepath; #- this file should be removed or is already empty.
- } else {
- if (keys(%{$file2fullnames{$filename} || {}}) > 1) {
- $urpm->{error}(N("there are multiple packages with the same rpm filename \"%s\"", $filename));
- } elsif (keys(%{$file2fullnames{$filename} || {}}) == 1) {
- my ($fullname) = keys(%{$file2fullnames{$filename} || {}});
- if (defined(my $id = delete $fullname2id{$fullname})) {
- $local_sources{$id} = $filepath;
- } else {
- $options{clean_other} && ! exists $protected_files{$filepath} and unlink $filepath;
- }
- } else {
- $options{clean_other} && ! exists $protected_files{$filepath} and unlink $filepath;
- }
- }
- }
- closedir $dh;
- }
-
- if ($options{clean_all}) {
- #- clean download directory, do it here even if this is not the best moment.
- urpm::sys::clean_dir("$urpm->{cachedir}/partial");
- }
-
- my ($error, @list_error, @list, %examined);
-
- foreach my $medium (@{$urpm->{media} || []}) {
- my (%sources, %list_examined, $list_warning);
-
- if (urpm::media::is_valid_medium($medium) && !$medium->{ignore}) {
- #- always prefer a list file if available.
- if ($medium->{list}) {
- if (-r urpm::media::statedir_list($urpm, $medium)) {
- foreach (cat_(urpm::media::statedir_list($urpm, $medium))) {
- chomp;
- if (my ($filename) = m!([^/]*\.rpm)$!) {
- if (keys(%{$file2fullnames{$filename} || {}}) > 1) {
- $urpm->{error}(N("there are multiple packages with the same rpm filename \"%s\"", $filename));
- next;
- } elsif (keys(%{$file2fullnames{$filename} || {}}) == 1) {
- my ($fullname) = keys(%{$file2fullnames{$filename} || {}});
- if (defined(my $id = $fullname2id{$fullname})) {
- if (!/\.delta\.rpm$/ || $urpm->is_delta_installable($urpm->{depslist}[$id], $options{root})) {
- $sources{$id} = "$medium->{url}/$filename";
- }
- }
- $list_examined{$fullname} = $examined{$fullname} = undef;
- }
- } else {
- chomp;
- $error = 1;
- $urpm->{error}(N("unable to correctly parse [%s] on value \"%s\"", urpm::media::statedir_list($urpm, $medium), $_));
- last;
- }
- }
- } else {
- # list file exists but isn't readable
- # report error only if no result found, list files are only readable by root
- push @list_error, N("unable to access list file of \"%s\", medium ignored", $medium->{name});
- $< and push @list_error, " " . N("(retry as root?)");
- next;
- }
- }
- if (defined $medium->{url}) {
- foreach ($medium->{start} .. $medium->{end}) {
- my $pkg = $urpm->{depslist}[$_];
- my $fi = $pkg->filename;
- if (keys(%{$file2fullnames{$fi} || {}}) > 1) {
- $urpm->{error}(N("there are multiple packages with the same rpm filename \"%s\"", $fi));
- next;
- } elsif (keys(%{$file2fullnames{$fi} || {}}) == 1) {
- my ($fullname) = keys(%{$file2fullnames{$fi} || {}});
- unless (exists($list_examined{$fullname})) {
- ++$list_warning;
- if (defined(my $id = $fullname2id{$fullname})) {
- if ($fi !~ /\.delta\.rpm$/ || $urpm->is_delta_installable($urpm->{depslist}[$id], $options{root})) {
- $sources{$id} = "$medium->{url}/" . $fi;
- }
- }
- $examined{$fullname} = undef;
- }
- }
- }
- $list_warning && $medium->{list} && -r urpm::media::statedir_list($urpm, $medium) && -f _
- and $urpm->{error}(N("medium \"%s\" uses an invalid list file:
- mirror is probably not up-to-date, trying to use alternate method", $medium->{name}));
- } elsif (!%list_examined) {
- $error = 1;
- $urpm->{error}(N("medium \"%s\" does not define any location for rpm files", $medium->{name}));
- }
- }
- push @list, \%sources;
- }
-
- #- examine package list to see if a package has not been found.
- foreach (grep { ! exists($examined{$_}) } keys %fullname2id) {
- # print list errors only once if any
- $urpm->{error}($_) foreach @list_error;
- @list_error = ();
- $error = 1;
- $urpm->{error}(N("package %s is not found.", $_));
- }
-
- $error ? @{[]} : (\%local_sources, \@list);
-}
-
#- checks whether the delta RPM represented by $pkg is installable wrt the
#- RPM DB on $root. For this, it extracts the rpm version to which the
#- delta applies from the delta rpm filename itself. So naming conventions
@@ -534,9 +394,10 @@ sub download_source_packages {
my %sources = %$local_sources;
my %error_sources;
+ require urpm::get_pkgs;
urpm::sys::lock_urpmi_db($urpm, 'exclusive') if !$options{nolock};
urpm::removable::copy_packages_of_removable_media($urpm, $list, \%sources, $options{ask_for_medium}) or return;
- $urpm->download_packages_of_distant_media($list, \%sources, \%error_sources, %options);
+ urpm::get_pkgs::download_packages_of_distant_media($urpm, $list, \%sources, \%error_sources, %options);
urpm::sys::unlock_urpmi_db($urpm) unless $options{nolock};
%sources, %error_sources;
@@ -548,72 +409,6 @@ sub exlock_urpmi_db {
urpm::sys::lock_urpmi_db($urpm, 'exclusive');
}
-# TODO verify that files are downloaded from the right corresponding media
-#- options: quiet, callback,
-sub download_packages_of_distant_media {
- my ($urpm, $list, $sources, $error_sources, %options) = @_;
-
- #- get back all ftp and http accessible rpm files into the local cache
- foreach my $n (0..$#$list) {
- my %distant_sources;
-
- #- ignore media that contain nothing for the current set of files
- values %{$list->[$n]} or next;
-
- #- examine all files to know what can be indexed on multiple media.
- while (my ($i, $url) = each %{$list->[$n]}) {
- #- the given URL is trusted, so the file can safely be ignored.
- defined $sources->{$i} and next;
- my $local_file = file_from_local_url($url);
- if ($local_file && $local_file =~ /\.rpm$/) {
- if (-r $local_file) {
- $sources->{$i} = $local_file;
- } else {
- $error_sources->{$i} = $local_file;
- }
- } elsif ($url =~ m!^([^:]*):/(.*/([^/]*\.rpm))\Z!) {
- $distant_sources{$i} = "$1:/$2"; #- will download now
- } else {
- $urpm->{error}(N("malformed URL: [%s]", $url));
- }
- }
-
- #- download files from the current medium.
- if (%distant_sources) {
- $urpm->{log}(N("retrieving rpm files from medium \"%s\"...", $urpm->{media}[$n]{name}));
- if (urpm::download::sync($urpm, $urpm->{media}[$n], [ values %distant_sources ],
- quiet => $options{quiet}, resume => $urpm->{options}{resume}, callback => $options{callback})) {
- $urpm->{log}(N("...retrieving done"));
- } else {
- $urpm->{error}(N("...retrieving failed: %s", $@));
- }
- #- clean files that have not been downloaded, but keep in mind
- #- there have been problems downloading them at least once, this
- #- is necessary to keep track of failing downloads in order to
- #- present the error to the user.
- foreach my $i (keys %distant_sources) {
- my ($filename) = $distant_sources{$i} =~ m|/([^/]*\.rpm)$|;
- if ($filename && -s "$urpm->{cachedir}/partial/$filename" &&
- URPM::verify_rpm("$urpm->{cachedir}/partial/$filename", nosignatures => 1))
- {
- #- it seems the the file has been downloaded correctly and has been checked to be valid.
- unlink "$urpm->{cachedir}/rpms/$filename";
- urpm::util::move("$urpm->{cachedir}/partial/$filename", "$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};
- }
- }
- }
- }
-
- #- clean failed download which have succeeded.
- delete @$error_sources{keys %$sources};
-
- 1;
-}
-
#- extract package that should be installed instead of upgraded,
#- sources is a hash of id -> source rpm filename.
sub extract_packages_to_install {