summaryrefslogtreecommitdiffstats
path: root/urpm/media.pm
diff options
context:
space:
mode:
Diffstat (limited to 'urpm/media.pm')
-rw-r--r--urpm/media.pm85
1 files changed, 71 insertions, 14 deletions
diff --git a/urpm/media.pm b/urpm/media.pm
index 2e91fdd5..c7995b52 100644
--- a/urpm/media.pm
+++ b/urpm/media.pm
@@ -16,6 +16,7 @@ our @PER_MEDIA_OPT = qw(
key-ids
list
media_info_dir
+ mirrorlist
name
no-media-info
noreconfigure
@@ -56,6 +57,7 @@ sub _only_media_opts_write {
my ($m) = @_;
my $c = only_media_opts($m);
delete $c->{media_info_dir} if $c->{media_info_dir} eq 'media_info';
+ delete $c->{url} if $c->{mirrorlist};
$c;
}
@@ -84,7 +86,7 @@ sub read_config_add_passwords {
my ($urpm, $config) = @_;
my @netrc = read_private_netrc($urpm) or return;
- foreach (@{$config->{media}}) {
+ foreach (grep { $_->{url} } @{$config->{media}}) {
my $u = urpm::download::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});
@@ -98,7 +100,7 @@ sub remove_passwords_and_write_private_netrc {
my ($urpm, $config) = @_;
my @l;
- foreach (@{$config->{media}}) {
+ foreach (grep { $_->{url} } @{$config->{media}}) {
my $u = urpm::download::parse_url_with_login($_->{url}) or next;
#- check whether a password is visible
$u->{password} or next;
@@ -149,7 +151,7 @@ sub read_config {
foreach my $m (@{$config->{media}}) {
my $medium = _only_media_opts_read($m);
- if (!$medium->{url}) {
+ if (!$medium->{url} && !$medium->{mirrorlist}) {
#- recover the url the old deprecated way...
#- only useful for migration, new urpmi.cfg will use netrc
recover_url_from_list($urpm, $medium);
@@ -180,7 +182,7 @@ sub check_existing_medium {
my ($urpm, $medium) = @_;
my $err;
- if (!$medium->{url}) {
+ if (!$medium->{url} && !$medium->{mirrorlist}) {
$err = $medium->{virtual} ?
N("virtual medium \"%s\" should have a clear url, medium ignored",
$medium->{name}) :
@@ -602,6 +604,8 @@ sub _parse_media {
delete @$_{qw(start end)};
_parse_synthesis_or_ignore($urpm, $_, $options->{callback});
+ _pick_mirror_if_needed($urpm, $_, '');
+
if ($_->{searchmedia}) {
$urpm->{searchmedia} = 1;
$urpm->{log}(N("Search start: %s end: %s", $_->{start}, $_->{end}));
@@ -644,7 +648,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, media_info_dir, xml-info
+#- options: ignore, index_name, nolock, update, virtual, media_info_dir, mirrorlist, with-dir, xml-info
sub add_medium {
my ($urpm, $name, $url, $with_synthesis, %options) = @_;
@@ -670,7 +674,7 @@ sub add_medium {
url => $url,
modified => !$options{ignore},
};
- foreach (qw(downloader update ignore media_info_dir xml-info)) {
+ foreach (qw(downloader update ignore media_info_dir mirrorlist with-dir xml-info)) {
$medium->{$_} = $options{$_} if exists $options{$_};
}
@@ -683,6 +687,17 @@ sub add_medium {
probe_removable_device($urpm, $medium);
}
+ if (!$medium->{url} && $options{mirrorlist}) {
+ # forcing the standard media_info_dir if undefined
+ $medium->{media_info_dir} ||= 'media_info';
+
+ require urpm::mirrors;
+ urpm::mirrors::try($urpm, $medium, sub {
+ # this is a little ugly since MD5SUM will be downloaded again later, but it's small enough...
+ _download_MD5SUM($urpm, $medium);
+ }) or return;
+ }
+
if ($with_synthesis) {
_migrate__with_synthesis($medium, $with_synthesis);
} elsif (!$medium->{media_info_dir}) {
@@ -719,6 +734,7 @@ sub add_medium {
#- - probe_with : force use of rpms instead of using synthesis
#- - ask_media : callback to know whether each media should be added
#- - only_updates : only add "update" media (used by rpmdrake)
+#- - mirrorlist
#- other options are passed to add_medium(): ignore, nolock, virtual
sub add_distrib_media {
my ($urpm, $name, $url, %options) = @_;
@@ -728,7 +744,7 @@ sub add_distrib_media {
my $distribconf;
- if (my $dir = file_from_local_url($url)) {
+ if (my $dir = $url && file_from_local_url($url)) {
urpm::removable::try_mounting($urpm, $dir)
or $urpm->{error}(N("unable to mount the distribution medium")), return ();
$distribconf = MDV::Distribconf->new($dir, undef);
@@ -737,7 +753,15 @@ sub add_distrib_media {
} else {
unlink "$urpm->{cachedir}/partial/media.cfg";
- $distribconf = _new_distribconf_and_download($urpm, $url);
+ if ($options{mirrorlist}) {
+ $url and die "unexpected url $url together with mirrorlist $options{mirrorlist}\n";
+ }
+
+ my $m = { mirrorlist => $options{mirrorlist}, url => $url };
+ try__maybe_mirrorlist($urpm, $m, sub {
+ $distribconf = _new_distribconf_and_download($urpm, $m->{url});
+ });
+ $url = $m->{url};
if ($distribconf) {
$distribconf->parse_mediacfg("$urpm->{cachedir}/partial/media.cfg")
@@ -795,6 +819,7 @@ sub add_distrib_media {
!$use_copied_synthesis && $options{probe_with} ? ($options{probe_with} => 1) : (),
index_name => $name ? undef : 0,
$add_by_default ? () : (ignore => 1),
+ $options{mirrorlist} ? ('with-dir' => $distribconf->getpath($media, 'path')) : (),
%options,
# the following override %options
update => $is_update_media ? 1 : undef,
@@ -900,6 +925,8 @@ sub _clean_statedir_medium_files {
sub _probe_with_try_list {
my ($urpm, $medium, $f) = @_;
+ $medium->{mirrorlist} and die "_probe_with_try_list does not handle mirrorlist\n";
+
my @media_info_dirs = ('media_info', '.');
my $base = file_from_local_url($medium->{url}) || $medium->{url};
@@ -919,6 +946,8 @@ sub _probe_with_try_list {
sub may_reconfig_urpmi {
my ($urpm, $medium) = @_;
+ $medium->{url} or return; # we should handle mirrorlist?
+
my $f;
if (my $dir = file_from_local_url($medium->{url})) {
$f = reduce_pathname("$dir/reconfig.urpmi");
@@ -1116,6 +1145,7 @@ sub get_descriptions_local {
$medium->{ignore} = 1;
}
}
+#- not handling different mirrors since the file is not always available
sub get_descriptions_remote {
my ($urpm, $medium) = @_;
@@ -1158,15 +1188,16 @@ sub get_synthesis__local {
sub get_synthesis__remote {
my ($urpm, $medium, $callback, $quiet) = @_;
- if (urpm::download::sync($urpm, $medium, [ _url_with_synthesis($medium) ],
+ my $ok = try__maybe_mirrorlist($urpm, $medium, sub {
+ urpm::download::sync($urpm, $medium, [ _url_with_synthesis($medium) ],
quiet => $quiet, callback => $callback) &&
- file_size(cachedir_with_synthesis($urpm, $medium)) >= 20) {
- 1;
- } else {
+ file_size(cachedir_with_synthesis($urpm, $medium)) >= 20;
+ });
+ if (!$ok) {
chomp(my $err = $@);
$urpm->{error}(N("...retrieving failed: %s", $err));
- 0;
}
+ $ok;
}
#- check copied/downloaded file has right signature.
@@ -1425,6 +1456,8 @@ sub _update_medium_ {
unlink "$urpm->{cachedir}/partial/$_";
}
+ _pick_mirror_if_needed($urpm, $medium, 'allow-cache-update');
+
#- check for a reconfig.urpmi file (if not already reconfigured)
if (!$medium->{noreconfigure}) {
may_reconfig_urpmi($urpm, $medium);
@@ -1503,7 +1536,7 @@ sub _update_media__handle_some_flags {
$medium->{modified} = 0;
} elsif ($all) {
#- if we're rebuilding all media, mark them as modified (except removable ones)
- $medium->{modified} ||= $medium->{url} !~ m!^removable!;
+ $medium->{modified} ||= !($medium->{url} && $medium->{url} =~ m!^removable!);
}
}
}
@@ -1625,6 +1658,30 @@ sub _any_media_info__or_download {
$f;
}
+#- side-effects:
+#- + those of urpm::mirrors::pick_one ($urpm->{mirrors_cache}, $medium->{url})
+sub _pick_mirror_if_needed {
+ my ($urpm, $medium, $allow_cache_update) = @_;
+
+ $medium->{mirrorlist} && !$medium->{url} or return;
+
+ require urpm::mirrors;
+ urpm::mirrors::pick_one($urpm, $medium, $allow_cache_update);
+}
+
+#- side-effects:
+#- + those of urpm::mirrors::try ($urpm->{mirrors_cache}, $medium->{url})
+sub try__maybe_mirrorlist {
+ my ($urpm, $medium, $try) = @_;
+
+ if ($medium->{mirrorlist}) {
+ require urpm::mirrors;
+ urpm::mirrors::try($urpm, $medium, $try);
+ } else {
+ $try->();
+ }
+}
+
#- clean params and depslist computation zone.
sub clean {
my ($urpm) = @_;