summaryrefslogtreecommitdiffstats
path: root/urpm
diff options
context:
space:
mode:
Diffstat (limited to 'urpm')
-rw-r--r--urpm/download.pm2
-rw-r--r--urpm/util.pm74
2 files changed, 75 insertions, 1 deletions
diff --git a/urpm/download.pm b/urpm/download.pm
index 05bb4d52..f273b7aa 100644
--- a/urpm/download.pm
+++ b/urpm/download.pm
@@ -163,7 +163,7 @@ sub sync_curl {
chdir($options->{dir});
my (@ftp_files, @other_files);
foreach (@_) {
- m|^ftp://.*/([^/]*)$| && -s $1 > 8192 and do {
+ m|^ftp://.*/([^/]*)$| && -e $1 && -s _ > 8192 and do {
push @ftp_files, $_; next;
}; #- manage time stamp for large file only.
push @other_files, $_;
diff --git a/urpm/util.pm b/urpm/util.pm
new file mode 100644
index 00000000..cbfcb06b
--- /dev/null
+++ b/urpm/util.pm
@@ -0,0 +1,74 @@
+package urpm::util;
+
+use strict;
+use Exporter;
+our @ISA = 'Exporter';
+our @EXPORT = qw(quotespace unquotespace
+ remove_internal_name
+ reduce_pathname offset_pathname);
+
+#- quoting/unquoting a string that may be containing space chars.
+sub quotespace { my $x = $_[0] || ''; $x =~ s/(\s)/\\$1/g; $x }
+sub unquotespace { my $x = $_[0] || ''; $x =~ s/\\(\s)/$1/g; $x }
+sub remove_internal_name { my $x = $_[0] || ''; $x =~ s/\(\S+\)$/$1/g; $x }
+
+#- reduce pathname by removing <something>/.. each time it appears (or . too).
+sub reduce_pathname {
+ my ($url) = @_;
+
+ #- clean url to remove any macro (which cannot be solved now).
+ #- take care if this is a true url and not a simple pathname.
+ my ($host, $dir) = $url =~ m|([^:/]*://[^/]*/)?(.*)|;
+
+ #- remove any multiple /s or trailing /.
+ #- then split all components of pathname.
+ $dir =~ s|/+|/|g; $dir =~ s|/$||;
+ my @paths = split '/', $dir;
+
+ #- reset $dir, recompose it, and clean trailing / added by algorithm.
+ $dir = '';
+ foreach (@paths) {
+ if ($_ eq '..') {
+ if ($dir =~ s|([^/]+)/$||) {
+ if ($1 eq '..') {
+ $dir .= "../../";
+ }
+ } else {
+ $dir .= "../";
+ }
+ } elsif ($_ ne '.') {
+ $dir .= "$_/";
+ }
+ }
+ $dir =~ s|/$||;
+ $dir ||= '/';
+
+ $host . $dir;
+}
+
+#- offset pathname by returning the right things to add to a relative directory
+#- to make no change. url is needed to resolve going before to top base.
+sub offset_pathname {
+ my ($url, $offset) = map { reduce_pathname($_) } @_;
+
+ #- clean url to remove any macro (which cannot be solved now).
+ #- take care if this is a true url and not a simple pathname.
+ my (undef, $dir) = $url =~ m|([^:/]*://[^/]*/)?(.*)|;
+ my @paths = split '/', $dir;
+ my @offpaths = reverse split '/', $offset;
+ my @corrections;
+ my $result = '';
+
+ foreach (@offpaths) {
+ if ($_ eq '..') {
+ push @corrections, pop @paths;
+ } else {
+ $result .= '../';
+ }
+ }
+ $result . join('/', reverse @corrections);
+}
+
+1;
+
+__END__