Package: uscan
Severity: wishlist
Tags: patch

If a HREF contains HTML entities (most commonly "&") or no filename can
be extracted with basename(), uscan fails to download the file.

I suggest to add a new option "localfilename" which can override
$newfile_base.

The patch I've attached, adds this option, so something like this is
possible:

    #
    # HREF=http://foo.bar.org/download/?path=&download=foo-0.1.1.tar.gz
    #
    version=4
    opts=localfilename=s/.*=(.*)/$1/ \
      http://foo.bar.org/download/ \?path=&download=foo-(.*).tar.gz


The localfilename-option behaves just like uversionmangle and
dversionmangle.
It may be possible, that the HREF does not contain a filename at all. In
this
case, something like this can be done:

    #
    # HREF=http://foo.bar.org/download/?path=&download_version=0.1.1
    #
    version=4
    opts=localfilename=s/.*/download.tar.gz/ \
      http://foo.bar.org/download/ \?path=&download_version=(.*)


This will always save the download as download.tar.gz.

In both of the above examples, "&" has to be replaced by "&" before
starting the download (see attached patch).

-- System Information:
Debian Release: testing/unstable
  APT prefers testing
  APT policy: (500, 'testing')
Architecture: i386 (i686)
Shell:  /bin/sh linked to /bin/bash
Kernel: Linux 2.6.11-1-k7
Locale: [EMAIL PROTECTED], [EMAIL PROTECTED] (charmap=ISO-8859-15)

--- uscan	2005-08-04 04:15:22.000000000 +0200
+++ uscan-neu	2005-09-09 23:24:41.000000000 +0200
@@ -43,7 +43,7 @@
 	}
     }
 }
-my $CURRENT_WATCHFILE_VERSION = 3;
+my $CURRENT_WATCHFILE_VERSION = 4;
 
 my $progname = basename($0);
 my $modified_conf_msg;
@@ -627,6 +627,9 @@
 		elsif ($opt =~ /^dversionmangle\s*=\s*(.+)/) {
 		    @{$options{'dversionmangle'}} = split /;/, $1;
 		}
+		elsif ($opt =~ /^localfilename\s*=\s*(.+)/) {
+		    @{$options{'localfilename'}} = split /;/, $1;
+		}
 		else {
 		    warn "$progname warning: unrecognised option $opt\n";
 		}
@@ -807,6 +810,13 @@
     }
 
     my $newfile_base=basename($newfile);
+    if (exists $options{'localfilename'})
+    {
+        $newfile_base=$newfile;
+    }
+    foreach my $pat (@{$options{'localfilename'}}) {
+	eval "\$newfile_base =~ $pat;";
+    }
     # Remove HTTP header trash
     if ($site =~ m%^http://%)
     {
@@ -921,6 +931,11 @@
     # Download newer package
     if ($upstream_url =~ m%^http://%) {
 	print STDERR "$progname debug: requesting URL $upstream_url\n" if $debug;
+
+	# substitute HTML entities
+	# TODO: anything else than "&" required?
+	$upstream_url =~ s/&/&/;
+
 	$request = HTTP::Request->new('GET', $upstream_url);
 	$response = $user_agent->request($request, "../$newfile_base");
 	if (! $response->is_success) {

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to