diff options
-rw-r--r-- | urpm.pm | 150 | ||||
-rwxr-xr-x | urpmi.addmedia | 2 | ||||
-rw-r--r-- | urpmi.spec | 11 |
3 files changed, 110 insertions, 53 deletions
@@ -256,6 +256,21 @@ sub probe_medium { } } $medium->{url} ||= $medium->{clear_url}; + + #- probe removable device. + $urpm->probe_removable_device($medium); + + #- clear URLs for trailing /es. + $medium->{url} =~ s|(.*?)/*$|$1|; + $medium->{clear_url} =~ s|(.*?)/*$|$1|; + + $medium; +} + +#- probe device associated with a removable device. +sub probe_removable_device { + my ($urpm, $medium) = @_; + if ($medium->{url} =~ /^removable_?([^_:]*)(?:_[^:]*)?:/) { $medium->{removable} ||= $1 && "/dev/$1"; } else { @@ -282,12 +297,6 @@ sub probe_medium { $urpm->{error}(_("unable to retrieve pathname for removable medium \"%s\"", $medium->{name})); } } - - #- clear URLs for trailing /es. - $medium->{url} =~ s|(.*?)/*$|$1|; - $medium->{clear_url} =~ s|(.*?)/*$|$1|; - - $medium; } #- write back urpmi.cfg code to allow modification of medium listed. @@ -341,7 +350,7 @@ sub add_medium { }; #- check to see if the medium is using file protocol or removable medium. - if (my ($prefix, $dir) = $url =~ /^(removable_?[^:]*|file):\/(.*)/) { + if (my ($prefix, $dir) = $url =~ /^(removable[^:]*|file):\/(.*)/) { #- the directory given does not exist or may be accessible #- by mounting some other. try to figure out these directory and #- mount everything necessary. @@ -357,7 +366,9 @@ sub add_medium { #- add some more flags for this type of medium. $medium->{clear_url} = $url; - $medium->{removable} = $url =~ /^removable_?([^_:]*)(?:_[^:]*)?:/ && "/dev/$1"; #" + + #- try to find device associated. + $urpm->probe_removable_device($medium); } #- all flags once everything has been computed. @@ -416,9 +427,26 @@ sub select_media { } #- check if some arguments does not correspond to medium name. + #- in such case, try to find the unique medium (or list candidate + #- media found). foreach (keys %media) { unless ($media{$_}) { - $urpm->{error}(_("trying to select inexistent medium \"%s\"", $_)); + my $q = quotemeta; + my (@found, @foundi); + foreach my $medium (@{$urpm->{media}}) { + $medium->{name} =~ /$q/ and push @found, $medium; + $medium->{name} =~ /$q/i and push @foundi, $medium; + } + if (@found == 1) { + $found[0]{modified} = 1; + } elsif (@foundi == 1) { + $foundi[0]{modified} = 1; + } elsif (@found == 0 && @foundi == 0) { + $urpm->{error}(_("trying to select inexistent medium \"%s\"", $_)); + } else { #- multiple element in found or foundi list. + $urpm->{error}(_("trying to select multiple medium: %s", join(", ", map { _("\"%s\"", $_->{name}) } + (@found ? @found : @foundi)))); + } } } } @@ -480,7 +508,7 @@ sub update_media { $medium->{ignore} and next; #- and create synthesis file associated if it does not already exists... - -s "$urpm->{statedir}/synthesis.$medium->{hdlist}" or push @rebuild_synthesis_of_media, $medium; + -s "$urpm->{statedir}/synthesis.$medium->{hdlist}" > 32 or push @rebuild_synthesis_of_media, $medium; #- but do not take care of removable media for all. $medium->{modified} ||= $options{all} && $medium->{url} !~ /removable/ or next; @@ -490,7 +518,7 @@ sub update_media { my ($prefix, $dir, $error, @files); #- check to see if the medium is using file protocol or removable medium. - if (($prefix, $dir) = $medium->{url} =~ /^(removable_?[^_:]*|file):\/(.*)/) { + if (($prefix, $dir) = $medium->{url} =~ /^(removable[^:]*|file):\/(.*)/) { #- the directory given does not exist and may be accessible #- by mounting some other. try to figure out these directory and #- mount everything necessary. @@ -498,19 +526,45 @@ sub update_media { #- try to get the description if it has been found. unlink "$urpm->{statedir}/descriptions.$medium->{name}"; - -e "$dir/../descriptions" and - system("cp", "-a", "$dir/../descriptions", "$urpm->{statedir}/descriptions.$medium->{name}"); + if (-e "$dir/../descriptions") { + $urpm->{log}(_("copying description file of \"%s\"...", $medium->{name})); + system("cp", "-a", "$dir/../descriptions", "$urpm->{statedir}/descriptions.$medium->{name}") ? + $urpm->{log}(_("...copying falied")) : $urpm->{log}(_("...copying done")); + } + + #- try to probe for possible with_hdlist parameter, unless + #- it is already defined (and valid). + if ($options{probe_with_hdlist} && (!$medium->{with_hdlist} || ! -e "$dir/$medium->{with_hdlist}")) { + my ($suffix) = $dir =~ /RPMS([^\/]*)\/*$/; + if (-s "$dir/synthesis.hdlist.cz" > 32) { + $medium->{with_hdlist} = "./synthesis.hdlist.cz"; + } elsif (-s "$dir/synthesis.hdlist$suffix.cz" > 32) { + $medium->{with_hdlist} = "./synthesis.hdlist$suffix.cz"; + } elsif (defined $suffix && !$suffix && -s "$dir/synthesis.hdlist1.cz" > 32) { + $medium->{with_hdlist} = "./synthesis.hdlist1.cz"; + } elsif (-s "$dir/../synthesis.hdlist$suffix.cz" > 32) { + $medium->{with_hdlist} = "../synthesis.hdlist$suffix.cz"; + } elsif (defined $suffix && !$suffix && -s "$dir/../synthesis.hdlist1.cz" > 32) { + $medium->{with_hdlist} = "../synthesis.hdlist1.cz"; + } elsif (-s "$dir/../base/hdlist$suffix.cz" > 32) { + $medium->{with_hdlist} = "../base/hdlist$suffix.cz"; + } elsif (defined $suffix && !$suffix && -s "$dir/../base/hdlist1.cz" > 32) { + $medium->{with_hdlist} = "../base/hdlist1.cz"; + } + } #- if the source hdlist is present and we are not forcing using rpms file - if (!$options{force} && $medium->{with_hdlist} && -e "$dir/$medium->{with_hdlist}") { + if ($options{force} < 2 && $medium->{with_hdlist} && -e "$dir/$medium->{with_hdlist}") { unlink "$urpm->{cachedir}/partial/$medium->{hdlist}"; - system("cp", "-a", "$dir/$medium->{with_hdlist}", "$urpm->{cachedir}/partial/$medium->{hdlist}"); + $urpm->{log}(_("copying source hdlist (or synthesis) of \"%s\"...", $medium->{name})); + system("cp", "-a", "$dir/$medium->{with_hdlist}", "$urpm->{cachedir}/partial/$medium->{hdlist}") ? + $urpm->{log}(_("...copying falied")) : $urpm->{log}(_("...copying done")); - -s "$urpm->{cachedir}/partial/$medium->{hdlist}" - or $error = 1, $urpm->{error}(_("copy of [%s] failed", "$dir/$medium->{with_hdlist}")); + -s "$urpm->{cachedir}/partial/$medium->{hdlist}" > 32 or + $error = 1, $urpm->{error}(_("copy of [%s] failed", "$dir/$medium->{with_hdlist}")); - #- check if the file are equals... - unless ($error) { + #- check if the file are equals... and no force copy... + unless ($error || $options{force}) { my @sstat = stat "$urpm->{cachedir}/partial/$medium->{hdlist}"; my @lstat = stat "$urpm->{statedir}/$medium->{hdlist}"; if ($sstat[7] == $lstat[7] && $sstat[9] == $lstat[9]) { @@ -549,24 +603,17 @@ sub update_media { #- try to get the description if it has been found. unlink "$urpm->{cachedir}/partial/descriptions"; if (-e "$urpm->{statedir}/descriptions.$medium->{name}") { - rename("$urpm->{statedir}/descriptions.$medium->{name}", - "$urpm->{cachedir}/partial/descriptions") or - system("mv", - "$urpm->{statedir}/descriptions.$medium->{name}", - "$urpm->{cachedir}/partial/descriptions"); + rename("$urpm->{statedir}/descriptions.$medium->{name}", "$urpm->{cachedir}/partial/descriptions") or + system("mv", "$urpm->{statedir}/descriptions.$medium->{name}", "$urpm->{cachedir}/partial/descriptions"); } eval { - $urpm->{log}(_("retrieving description file...")); + $urpm->{log}(_("retrieving description file of \"%s\"...", $medium->{name})); $urpm->{sync}("$urpm->{cachedir}/partial", "$medium->{url}/../descriptions"); $urpm->{log}(_("...retrieving done")); }; - $@ and $urpm->{log}(_("...retrieving failed: %s", $@)); if (-e "$urpm->{cachedir}/partial/descriptions") { - rename("$urpm->{cachedir}/partial/descriptions", - "$urpm->{statedir}/descriptions.$medium->{name}") or - system("mv", - "$urpm->{cachedir}/partial/descriptions", - "$urpm->{statedir}/descriptions.$medium->{name}"); + rename("$urpm->{cachedir}/partial/descriptions", "$urpm->{statedir}/descriptions.$medium->{name}") or + system("mv", "$urpm->{cachedir}/partial/descriptions", "$urpm->{statedir}/descriptions.$medium->{name}"); } #- try to sync (copy if needed) local copy after restored the previous one. @@ -579,34 +626,33 @@ sub update_media { system("cp", "-a", "$urpm->{statedir}/$medium->{hdlist}", "$urpm->{cachedir}/partial/$basename"); } eval { - $urpm->{log}(_("retrieving source hdlist (or synthesis)...")); + $urpm->{log}(_("retrieving source hdlist (or synthesis) of \"%s\"...", $medium->{name})); $urpm->{sync}("$urpm->{cachedir}/partial", "$medium->{url}/$medium->{with_hdlist}"); $urpm->{log}(_("...retrieving done")); }; $@ and $urpm->{log}(_("...retrieving failed: %s", $@)); - -s "$urpm->{cachedir}/partial/$basename" or + -s "$urpm->{cachedir}/partial/$basename" > 32 or $error = 1, $urpm->{error}(_("retrieve of [%s] failed", "<source_url>/$medium->{with_hdlist}")); unless ($error) { - my @sstat = stat "$urpm->{cachedir}/partial/$basename"; - my @lstat = stat "$urpm->{statedir}/$medium->{hdlist}"; - if ($sstat[7] == $lstat[7] && $sstat[9] == $lstat[9]) { - #- the two files are considered equal here, the medium is so not modified. - $medium->{modified} = 0; - unlink "$urpm->{cachedir}/partial/$basename"; - next; + unless ($options{force}) { + my @sstat = stat "$urpm->{cachedir}/partial/$basename"; + my @lstat = stat "$urpm->{statedir}/$medium->{hdlist}"; + if ($sstat[7] == $lstat[7] && $sstat[9] == $lstat[9]) { + #- the two files are considered equal here, the medium is so not modified. + $medium->{modified} = 0; + unlink "$urpm->{cachedir}/partial/$basename"; + next; + } } #- the file are different, update local copy. - rename("$urpm->{cachedir}/partial/$basename", - "$urpm->{cachedir}/partial/$medium->{hdlist}") or - system("mv", - "$urpm->{cachedir}/partial/$basename", - "$urpm->{cachedir}/partial/$medium->{hdlist}"); + rename("$urpm->{cachedir}/partial/$basename", "$urpm->{cachedir}/partial/$medium->{hdlist}") or + system("mv", "$urpm->{cachedir}/partial/$basename", "$urpm->{cachedir}/partial/$medium->{hdlist}"); } } #- build list file according to hdlist used. - unless (-s "$urpm->{cachedir}/partial/$medium->{hdlist}") { + unless (-s "$urpm->{cachedir}/partial/$medium->{hdlist}" > 32) { $error = 1; $urpm->{error}(_("no hdlist file found for medium \"%s\"", $medium->{name})); } @@ -661,8 +707,8 @@ sub update_media { close LIST; #- check if at least something has been written into list file. - -s "$urpm->{cachedir}/partial/$medium->{list}" - or $error = 1, $urpm->{error}(_("nothing written in list file for \"%s\"", $medium->{name})); + -s "$urpm->{cachedir}/partial/$medium->{list}" > 32 or + $error = 1, $urpm->{error}(_("nothing written in list file for \"%s\"", $medium->{name})); } if ($error) { @@ -1451,7 +1497,7 @@ sub upload_source_packages { my ($id, $device, $copy) = @_; my $medium = $urpm->{media}[$id]; $media{$id} = undef; - if (my ($prefix, $dir) = $medium->{url} =~ /^(removable_?[^_:]*|file):\/(.*)/) { + if (my ($prefix, $dir) = $medium->{url} =~ /^(removable[^:]*|file):\/(.*)/) { my $count_not_found = sub { my $not_found; if (-e $dir) { @@ -1479,7 +1525,7 @@ sub upload_source_packages { if (-e $dir) { my @removable_sources; while (my ($i, $url) = each %{$list->[$id]}) { - $url =~ /^(removable_?[^_:]*|file):\/(.*\/([^\/]*))/ or next; + $url =~ /^(removable[^:]*|file):\/(.*\/([^\/]*))/ or next; -r $2 or $urpm->{error}(_("unable to read rpm file [%s] from medium \"%s\"", $2, $medium->{name})); if ($copy) { push @removable_sources, $2; @@ -1505,7 +1551,7 @@ sub upload_source_packages { #- examine non removable device but that may be mounted. if ($medium->{removable}) { push @{$removables{$medium->{removable}} ||= []}, $_; - } elsif (my ($prefix, $dir) = $medium->{url} =~ /^(removable_?[^_:]*|file):\/(.*)/) { + } elsif (my ($prefix, $dir) = $medium->{url} =~ /^(removable[^:]*|file):\/(.*)/) { -e $dir || $urpm->try_mounting($dir) or $urpm->{error}(_("unable to access medium \"%s\"", $medium->{name})), next; } @@ -1535,7 +1581,7 @@ sub upload_source_packages { exists $media{$_} and next; values %{$list->[$_]} or next; while (my ($i, $url) = each %{$list->[$_]}) { - if ($url =~ /^(removable_?[^_:]*|file):\/(.*)/) { + if ($url =~ /^(removable[^:]*|file):\/(.*)/) { $sources{$i} = $2; } elsif ($url =~ /^([^:]*):\/(.*\/([^\/]*))/) { if ($force_local) { diff --git a/urpmi.addmedia b/urpmi.addmedia index 2e296988..e257c40d 100755 --- a/urpmi.addmedia +++ b/urpmi.addmedia @@ -36,6 +36,7 @@ where <url> is one of and [options] are from ") . _(" -c - clean headers cache directory. +") . _(" -h - try to find and use synthesis or hdlist file. ") . _(" -f - force generation of hdlist files. ") . _(" --wget - use wget to retrieve distant files. ") . _(" --curl - use curl to retrieve distant files. @@ -46,6 +47,7 @@ and [options] are from $options{sync} = undef; while ($_ = shift @_) { /^--?c/ and $options{noclean} = 0, next; + /^--?h/ and $options{probe_with_hdlist} = 1, next; /^--?f/ and ++$options{force}, next; /^--wget/ and $options{sync} = \&urpm::sync_wget, next; /^--curl/ and $options{sync} = \&urpm::sync_curl, next; @@ -2,7 +2,7 @@ Name: urpmi Version: 3.0 -Release: 5mdk +Release: 6mdk License: GPL Source0: %{name}.tar.bz2 Source1: %{name}.logrotate @@ -142,6 +142,15 @@ fi %changelog +* Wed Dec 12 2001 François Pons <fpons@mandrakesoft.com> 3.0-6mdk +- fixed removable device probe for addition of medium. +- fixed synthesis size checking. +- added log when copying file (nfs). +- removed error when description file is not retrieved successfully. +- added -h option to urpmi.addmedia to probe for synthesis or hdlist. +- modified --force of urpmi.update to behave smootly (given once to + force copy of file, given twice to force regeneration of hdlist). + * Mon Dec 10 2001 François Pons <fpons@mandrakesoft.com> 3.0-5mdk - fixed %%post again. - added kernel-source in /etc/urpmi/inst.list. |