summaryrefslogtreecommitdiffstats
path: root/urpm.pm
diff options
context:
space:
mode:
Diffstat (limited to 'urpm.pm')
-rw-r--r--urpm.pm47
1 files changed, 31 insertions, 16 deletions
diff --git a/urpm.pm b/urpm.pm
index 4d881d1c..ac5b99fb 100644
--- a/urpm.pm
+++ b/urpm.pm
@@ -102,7 +102,7 @@ sub sync_curl {
my (@ftp_files, @other_files);
foreach (@_) {
/^ftp:\/\/.*\/([^\/]*)$/ && -s $1 > 8192 and do { push @ftp_files, $_; next }; #- manage time stamp for large file only.
- push @other_files;
+ push @other_files, $_;
}
if (@ftp_files) {
my ($cur_ftp_file, %ftp_files_info);
@@ -1336,11 +1336,11 @@ sub filter_packages_to_upgrade {
my (@forced_selection, @selection);
#- at this point we have almost only choices to resolves.
- #- but we have to check if one package here is already selected
- #- previously, if this is the case, use it instead.
- #- if a choice is proposed with package already installed (this is the case for
- #- a provide with a lot of choices, we have to filter according to those who
- #- are installed).
+ #- but we have to check if one package here is already selected
+ #- previously, if this is the case, use it instead.
+ #- if a choice is proposed with package already installed (this is the case for
+ #- a provide with a lot of choices, we have to filter according to those who
+ #- are installed).
foreach (@$id) {
if (exists $packages->{$_} ||
rpmtools::db_traverse_tag($db, "name",
@@ -1353,11 +1353,11 @@ sub filter_packages_to_upgrade {
#- propose the choice to the user now, or select the best one (as it is supposed to be).
@selection = @forced_selection ? @forced_selection :
- $select_choices && @selection > 1 ?
- ($select_choices->($urpm, undef, @selection)) : ($selection[0]);
+ $select_choices ? (@selection > 1 ? ($select_choices->($urpm, undef, @selection)) : ($selection[0])) :
+ (join '|', @selection);
foreach (@selection) {
unless (exists $packages->{$_}) {
- unshift @packages, $_;
+ /\|/ or unshift @packages, $_;
$packages->{$_} = 1;
}
}
@@ -1753,6 +1753,12 @@ sub extract_packages_to_install {
chomp; s/#.*$//; s/^\s*//; s/\s*$//;
foreach (keys %{$urpm->{params}{provides}{$_} || {}}) {
my $pkg = $urpm->{params}{info}{$_} 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}};
}
}
@@ -1762,7 +1768,7 @@ sub extract_packages_to_install {
}
sub select_packages_to_upgrade {
- my ($urpm, $prefix, $packages, $remove_packages, $keep_files) = @_;
+ my ($urpm, $prefix, $packages, $remove_packages, $keep_files, %options) = @_;
my $db = rpmtools::db_open($prefix);
#- used for package that are not correctly updated.
@@ -1787,10 +1793,16 @@ sub select_packages_to_upgrade {
#- latter for each transaction.
local (*INPUT, *OUTPUT_CHILD); pipe INPUT, OUTPUT_CHILD;
local (*INPUT_CHILD, *OUTPUT); pipe INPUT_CHILD, OUTPUT;
- if (my $pid = fork()) {
+ if (my $pid = $options{use_parsehdlist} ? fork() : 1) {
close INPUT_CHILD;
close OUTPUT_CHILD;
- select((select(OUTPUT), $| = 1)[0]);
+ #- check if there is a parsehdlist running in the background.
+ if ($pid == 1) {
+ close INPUT;
+ close OUTPUT;
+ } else {
+ select((select(OUTPUT), $| = 1)[0]);
+ }
#- internal reading from interactive mode of parsehdlist.
#- takes a code to call with the line read, this avoid allocating
@@ -1802,7 +1814,7 @@ sub select_packages_to_upgrade {
#- the hdlist does not exists and the medium is marked as using a
#- synthesis file).
my $p = $urpm->{params}{info}{$name} || $urpm->{params}{names}{$name};
- if ($p && $p->{$tag}) {
+ if ($pid == 1 || $p && $p->{$tag}) {
foreach (@{$p->{$tag} || []}) {
$code->($_);
}
@@ -1958,9 +1970,12 @@ sub select_packages_to_upgrade {
%installedFilesForUpgrade = ();
#- no need to still use the child as this point, we can let him to terminate.
- close OUTPUT;
- close INPUT;
- waitpid $pid, 0;
+ #- but only if a child has really been used.
+ if ($pid != 1) {
+ close OUTPUT;
+ close INPUT;
+ waitpid $pid, 0;
+ }
} else {
close INPUT;
close OUTPUT;