summaryrefslogtreecommitdiffstats
path: root/urpm.pm
diff options
context:
space:
mode:
Diffstat (limited to 'urpm.pm')
-rw-r--r--urpm.pm30
1 files changed, 27 insertions, 3 deletions
diff --git a/urpm.pm b/urpm.pm
index bca3db29..467a8919 100644
--- a/urpm.pm
+++ b/urpm.pm
@@ -2461,8 +2461,11 @@ sub get_source_packages {
next;
} elsif (keys(%{$file2fullnames{$filename} || {}}) == 1) {
my ($fullname) = keys(%{$file2fullnames{$filename} || {}});
- defined($id = $fullname2id{$fullname})
- and $sources{$id} = $medium->{virtual} ? "$medium->{url}/$_" : $_;
+ if (defined($id = $fullname2id{$fullname})) {
+ if (!/\.delta\.rpm$/ || $urpm->is_delta_installable($urpm->{depslist}[$id], $options{root})) {
+ $sources{$id} = $medium->{virtual} ? "$medium->{url}/$_" : $_;
+ }
+ }
$list_examined{$fullname} = $examined{$fullname} = undef;
}
} else {
@@ -2491,7 +2494,11 @@ sub get_source_packages {
my ($fullname) = keys(%{$file2fullnames{$fi} || {}});
unless (exists($list_examined{$fullname})) {
++$list_warning;
- defined($id = $fullname2id{$fullname}) and $sources{$id} = "$medium->{url}/" . $fi;
+ if (defined($id = $fullname2id{$fullname})) {
+ if ($fi !~ /\.delta\.rpm$/ || $urpm->is_delta_installable($urpm->{depslist}[$id], $options{root})) {
+ $sources{$id} = "$medium->{url}/" . $fi;
+ }
+ }
$examined{$fullname} = undef;
}
}
@@ -2519,6 +2526,23 @@ sub get_source_packages {
$error ? @{[]} : (\%local_sources, \@list);
}
+sub is_delta_installable {
+ my ($urpm, $pkg, $root) = @_;
+ $pkg->flag_installed or return 0;
+ my $f = $pkg->filename;
+ my $n = $pkg->name;
+ my ($v_match) = $f =~ /^\Q$n\E-(.*)_.+\.delta\.rpm$/;
+ my $db = URPM::DB::open($root)
+ or $urpm->{fatal}(9, N("unable to open rpmdb"));
+ my $v_installed;
+ $db->traverse(sub {
+ my ($p) = @_;
+ $p->name eq $n and $v_installed = $p->version . '-' . $p->release;
+ });
+ return 0 if $v_match ne $v_installed;
+ 1;
+}
+
#- download package that may need to be downloaded.
#- make sure header are available in the appropriate directory.
#- change location to find the right package in the local