summaryrefslogtreecommitdiffstats
path: root/urpm/media.pm
diff options
context:
space:
mode:
Diffstat (limited to 'urpm/media.pm')
-rw-r--r--urpm/media.pm75
1 files changed, 39 insertions, 36 deletions
diff --git a/urpm/media.pm b/urpm/media.pm
index de2155ab..d65a7351 100644
--- a/urpm/media.pm
+++ b/urpm/media.pm
@@ -15,6 +15,7 @@ our @PER_MEDIA_OPT = qw(
ignore
key-ids
list
+ name
noreconfigure
priority
priority-upgrade
@@ -28,6 +29,12 @@ our @PER_MEDIA_OPT = qw(
with_hdlist
);
+sub only_media_opts {
+ my ($m) = @_;
+ my %m = map { $_ => $m->{$_} } grep { defined $m->{$_} } @PER_MEDIA_OPT;
+ \%m;
+}
+
sub read_private_netrc {
my ($urpm) = @_;
@@ -59,7 +66,7 @@ sub read_config_add_passwords {
my ($urpm, $config) = @_;
my @netrc = read_private_netrc($urpm) or return;
- foreach (values %$config) {
+ foreach (@{$config->{media}}) {
my $u = parse_url_with_login($_->{url}) or next;
if (my ($e) = grep { ($_->{default} || $_->{machine} eq $u->{machine}) && $_->{login} eq $u->{login} } @netrc) {
$_->{url} = sprintf('%s://%s:%s@%s%s', $u->{proto}, $u->{login}, $e->{password}, $u->{machine}, $u->{dir});
@@ -73,7 +80,7 @@ sub remove_passwords_and_write_private_netrc {
my ($urpm, $config) = @_;
my @l;
- foreach (values %$config) {
+ foreach (@{$config->{media}}) {
my $u = parse_url_with_login($_->{url}) or next;
#- check whether a password is visible
$u->{password} or next;
@@ -115,7 +122,7 @@ sub read_config {
or $urpm->{fatal}(6, $urpm::cfg::err);
#- global options
- if (my $global = $config->{''}) {
+ if (my $global = $config->{global}) {
foreach my $opt (keys %$global) {
if (defined $global->{$opt} && !exists $urpm->{options}{$opt}) {
$urpm->{options}{$opt} = $global->{$opt};
@@ -127,11 +134,8 @@ sub read_config {
read_config_add_passwords($urpm, $config);
- foreach my $m (grep { $_ ne '' } keys %$config) {
- my $medium = { name => $m };
- foreach my $opt (@PER_MEDIA_OPT) {
- defined $config->{$m}{$opt} and $medium->{$opt} = $config->{$m}{$opt};
- }
+ foreach my $m (@{$config->{media}}) {
+ my $medium = only_media_opts($m);
if (!$medium->{url}) {
#- recover the url the old deprecated way...
@@ -150,8 +154,6 @@ sub read_config {
exists $urpm->{options}{$_} or $urpm->{options}{$_} = 1;
}
- $urpm->{media} = [ sort { $a->{priority} <=> $b->{priority} } @{$urpm->{media}} ];
-
#- read MD5 sums (not in urpmi.cfg but in a separate file)
foreach (@{$urpm->{media}}) {
if (my $md5sum = urpm::md5sum::from_MD5SUM("$urpm->{statedir}/MD5SUM", statedir_hdlist_or_synthesis($urpm, $_))) {
@@ -160,7 +162,7 @@ sub read_config {
}
#- remember global options for write_config
- $urpm->{global_config} = $config->{''};
+ $urpm->{global_config} = $config->{global};
}
#- if invalid, set {ignore}
@@ -377,16 +379,9 @@ sub write_urpmi_cfg {
my $config = {
#- global config options found in the config file, without the ones
#- set from the command-line
- '' => $urpm->{global_config},
+ global => $urpm->{global_config},
+ media => [ map { only_media_opts($_) } grep { !$_->{external} } @{$urpm->{media}} ],
};
- foreach my $medium (@{$urpm->{media}}) {
- next if $medium->{external};
- my $medium_name = $medium->{name};
-
- foreach (@PER_MEDIA_OPT) {
- defined $medium->{$_} and $config->{$medium_name}{$_} = $medium->{$_};
- }
- }
remove_passwords_and_write_private_netrc($urpm, $config);
urpm::cfg::dump_config($urpm->{config}, $config)
@@ -514,7 +509,6 @@ sub _parse_media {
our $currentmedia = $_; #- hack for urpmf
delete @$_{qw(start end)};
if ($_->{virtual}) {
- if (file_from_file_url($_->{url})) {
if ($_->{synthesis}) {
_parse_synthesis($urpm, $_,
hdlist_or_synthesis_for_virtual_medium($_), $options->{callback});
@@ -525,10 +519,6 @@ sub _parse_media {
$options->{callback},
);
}
- } else {
- $urpm->{error}(N("virtual medium \"%s\" is not local, medium ignored", $_->{name}));
- $_->{ignore} = 1;
- }
} else {
if ($options->{need_hdlist} && file_size(statedir_hdlist($urpm, $_)) > 32) {
_parse_hdlist($urpm, $_, statedir_hdlist($urpm, $_), $options->{callback});
@@ -596,7 +586,7 @@ sub _compute_flags_for_instlist {
#- add a new medium, sync the config file accordingly.
#- returns the new medium's name. (might be different from the requested
#- name if index_name was specified)
-#- options: ignore, index_name, nolock, update, virtual
+#- options: ignore, index_name, nolock, synthesis, update, virtual
sub add_medium {
my ($urpm, $name, $url, $with_hdlist, %options) = @_;
@@ -620,7 +610,13 @@ sub add_medium {
$url =~ s,/*$,,; #- clear URLs for trailing /es.
#- creating the medium info.
- $medium = { name => $name, url => $url, update => $options{update}, modified => 1, ignore => $options{ignore} };
+ $medium = { name => $name,
+ url => $url,
+ modified => 1,
+ update => $options{update},
+ ignore => $options{ignore},
+ synthesis => $options{synthesis},
+ };
if ($options{virtual}) {
file_from_file_url($url) or $urpm->{fatal}(1, N("virtual medium needs to be local"));
$medium->{virtual} = 1;
@@ -629,19 +625,25 @@ sub add_medium {
probe_removable_device($urpm, $medium);
}
+ $with_hdlist and $medium->{with_hdlist} = $with_hdlist;
+
#- local media have priority, other are added at the end.
+ my $inserted;
if (file_from_file_url($url)) {
- $medium->{priority} = 0.5;
- } else {
- $medium->{priority} = 1 + @{$urpm->{media}};
+ #- insert before first remote medium
+ @{$urpm->{media}} = map {
+ if (!file_from_file_url($_->{url}) && !$inserted) {
+ $inserted = 1;
+ $urpm->{log}(N("added medium %s before remote medium %s", $name, $_->{name}));
+ $medium, $_;
+ } else { $_ }
+ } @{$urpm->{media}};
+ }
+ if (!$inserted) {
+ $urpm->{log}(N("added medium %s", $name));
+ push @{$urpm->{media}}, $medium;
}
- $with_hdlist and $medium->{with_hdlist} = $with_hdlist;
-
- #- create an entry in media list.
- push @{$urpm->{media}}, $medium;
-
- $urpm->{log}(N("added medium %s", $name));
$urpm->{modified} = 1;
$name;
@@ -729,6 +731,7 @@ sub add_distrib_media {
) . '/' . $distribconf->getpath($media, $options{probe_with} eq 'synthesis' ? 'synthesis' : 'hdlist'),
index_name => $name ? undef : 0,
%options,
+ synthesis => $options{probe_with} eq 'synthesis',
# the following override %options
update => $is_update_media ? 1 : undef,
);