This is an automated email from the git hooks/post-receive script. osamu pushed a commit to branch master in repository devscripts.
commit ef1ae1f5291c7f2014e2f0e9e3fabd06eafaebb5 Merge: 59ae95f 2ea8f28 Author: Osamu Aoki <[email protected]> Date: Tue Nov 17 02:12:14 2015 +0900 Merge branch 'git' Conflicts fixed: scripts/uscan.pl scripts/uscan.pl | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --cc scripts/uscan.pl index d99cefd,b9fb2df..b0c87d2 --- a/scripts/uscan.pl +++ b/scripts/uscan.pl @@@ -2834,32 -961,92 +2834,89 @@@ sub process_watchline ($$$$$$ } } if (@hrefs) { - if ($verbose) { - print "-- Found the following matching hrefs:\n"; - foreach my $href (@hrefs) { print " $$href[1] ($$href[0])\n"; } + @hrefs = Devscripts::Versort::upstream_versort(@hrefs); + my $msg = "Found the following matching hrefs on the web page (newest first):\n"; + foreach my $href (@hrefs) { + $msg .= " $$href[2] ($$href[0]) $$href[3]\n"; } - if (defined $download_version) { - my @vhrefs = grep { $$_[0] eq $download_version } @hrefs; - if (@vhrefs) { - ($newversion, $newfile) = @{$vhrefs[0]}; - } else { - warn "$progname warning: In $watchfile no matching hrefs for version $download_version" - . " in watch line\n $line\n"; - return 1; - } + uscan_verbose $msg; + } + if (defined $download_version) { + my @vhrefs = grep { $$_[3] } @hrefs; + if (@vhrefs) { + ($newversion, undef, $newfile, undef) = @{$vhrefs[0]}; } else { - @hrefs = Devscripts::Versort::versort(@hrefs); - ($newversion, $newfile) = @{$hrefs[0]}; + uscan_warn "In $watchfile no matching hrefs for version $download_version" + . " in watch line\n $line\n"; + return 1; } } else { - warn "$progname warning: In $watchfile,\n no matching hrefs for watch line\n $line\n"; - return 1; + if (@hrefs) { + ($newversion, undef, $newfile, undef) = @{$hrefs[0]}; + } else { + uscan_warn "In $watchfile no matching files for watch line\n $line\n"; + return 1; + } } + } elsif ($site =~ m%^git://%) { + # TODO: sanitize $base + open(REFS, "-|", 'git', 'ls-remote', $base) || + die "$progname: you must have the git package installed\n" + . "to use git URLs\n"; + my (@refs, $line, $ref, $version); + while (<REFS>) { + chomp; + $line = $_; + foreach my $_pattern (@patterns) { + if ($line =~ + m&^([^[:space:]]+)[[:space:]]+(?:refs\/)?$_pattern$&) { + $ref = $1; $version = $2; + + $version = join(".", map { $_ if defined($_) } + $version); + foreach my $_p (@{$options{'uversionmangle'}}) { + if (! safe_replace(\$version, $_p)) { + warn "$progname: In $watchfile, potentially" + . " unsafe or malformed uversionmangle" + . " pattern:\n '$_p'" + . " found. Skipping watchline\n" + . " $line\n"; + return 1; + } + } + push @refs, [$version, $ref]; + } + } + } + if (@refs) { - if ($verbose) { - print "-- Found the following matching refs:\n"; - foreach my $ref (@refs) { - print " $$ref[1] ($$ref[0])\n"; - } ++ my $msg = "Found the following matching refs:\n"; ++ foreach my $ref (@refs) { ++ $msg .= " $$ref[1] ($$ref[0])\n"; + } ++ uscan_verbose "$msg"; + if (defined $download_version) { + my @vrefs = grep { $$_[0] eq $download_version } @refs; + if (@vrefs) { + ($newversion, $newfile) = @{$vrefs[0]}; + } else { + warn "$progname warning: In $watchfile no matching" + . " refs for version $download_version" + . " in watch line\n $line\n"; + return 1; + } + + } else { + @refs = Devscripts::Versort::versort(@refs); + ($newversion, $newfile) = @{$refs[0]}; + } + } else { + warn "$progname warning: In $watchfile,\n" . + " no matching refs for watch line\n" . + " $line\n"; + return 1; + } - } else { - # Better be an FTP site - if ($site !~ m%^ftp://%) { - warn "$progname warning: Unknown protocol in $watchfile, skipping:\n $site\n"; - return 1; - } - + } elsif ($site =~ m%^ftp://%) { + # FTP site if (exists $options{'pasv'}) { $ENV{'FTP_PASSIVE'}=$options{'pasv'}; } @@@ -3076,219 -1271,76 +3135,246 @@@ EO # FTP site $upstream_url = "$base$newfile"; } + uscan_verbose "Upstream URL (downloadurlmangled):\n $upstream_url\n"; - $dehs_tags{'debian-uversion'} = $lastversion; - $dehs_tags{'debian-mangled-uversion'} = $mangled_lastversion; - $dehs_tags{'upstream-version'} = $newversion; - $dehs_tags{'upstream-url'} = $upstream_url; + # $newversion = version used for pkg-ver.tar.gz and version comparison + uscan_verbose "Newest upstream tarball version selected for download (uversionmangled): $newversion\n" if $newversion; - # Can't just use $lastversion eq $newversion, as then 0.01 and 0.1 - # compare different, whereas they are treated as equal by dpkg - if (system("dpkg", "--compare-versions", "$mangled_lastversion", "eq", "$newversion") == 0) { - if ($verbose or ($download == 0 and $report and ! $dehs)) { - print $pkg_report_header; - $pkg_report_header = ''; - print "Newest version on remote site is $newversion, local version is $lastversion\n" . - ($mangled_lastversion eq $lastversion ? "" : " (mangled local version number $mangled_lastversion)\n"); - print " => Package is up to date\n"; - } - $dehs_tags{'status'} = "up to date"; - if (! $force_download) { - return 0; + my $newfile_base; + if (exists $options{'filenamemangle'}) { + if ($versionless) { + $newfile_base = $upstream_url; } else { - $download = 1; + $newfile_base = $newfile; + } + uscan_verbose "Matching target for filenamemangle: $newfile_base\n"; + foreach my $pat (@{$options{'filenamemangle'}}) { + uscan_verbose "filenamemangle rule $pat\n"; + if (! safe_replace(\$newfile_base, $pat)) { + uscan_warn "In $watchfile, potentially" + . " unsafe or malformed filenamemangle" + . " pattern:\n '$pat'" + . " found. Skipping watchline\n" + . " $line\n"; + return 1; + } + } + unless ($newversion) { + # uversionmanglesd version is '', make best effort to set it + $newfile_base =~ m/^.+[-_]([^-_]+)(?:\.tar\.(gz|bz2|xz)|\.zip)$/i; + $newversion = $1; + unless ($newversion) { + uscan_warn "Fix filenamemangle to produce a filename with the correct version\n"; + return 1; + } + uscan_verbose "Newest upstream tarball version from the filenamemangled filename: $newversion\n"; + } + } else { + $newfile_base = basename($newfile); + # Remove HTTP header trash + if ($site =~ m%^https?://%) { + $newfile_base =~ s/[\?#].*$//; # PiPy + # just in case this leaves us with nothing + if ($newfile_base eq '') { + uscan_warn "No good upstream filename found after removing tailing ?... and #....\n Use filenamemangle to fix this.\n"; + return 1; + } ++ } elsif ($site =~ m%^git://%) { ++ # Default name for git archive ++ my $ext = "tar.xz"; ++ if ($repack) { ++ $ext = "tar.gz"; ++ } ++ $newfile_base = "$pkg-$newversion.$ext"; } } + uscan_verbose "Download filename (filenamemangled): $newfile_base\n"; + unless (defined $common_newversion) { + $common_newversion = $newversion; + } + + $dehs_tags{'debian-uversion'} = $lastversion; + $dehs_tags{'debian-mangled-uversion'} = $mangled_lastversion; + $dehs_tags{'upstream-version'} = $newversion; + $dehs_tags{'upstream-url'} = $upstream_url; - # In all other cases, we'll want to report information even with --report - if ($verbose or ($download == 0 and ! $dehs)) { - print $pkg_report_header; - $pkg_report_header = ''; - print "Newest version on remote site is $newversion, local version is $lastversion\n" . - ($mangled_lastversion eq $lastversion ? "" : " (mangled local version number $mangled_lastversion)\n"); + my $compver; + if (system("dpkg", "--compare-versions", "1:${mangled_lastversion}-0", "eq", "1:${newversion}-0") >> 8 == 0) { + $compver = 'same'; # ${mangled_lastversion} == ${newversion} + } elsif (system("dpkg", "--compare-versions", "1:${mangled_lastversion}-0", "gt", "1:${newversion}-0") >> 8 == 0) { + $compver = 'older'; # ${mangled_lastversion} >> ${newversion} + } else { + $compver = 'newer'; # ${mangled_lastversion} << ${newversion} } - # We use dpkg's rules to determine whether our current version - # is newer or older than the remote version. - if (!defined $download_version) { - if (system("dpkg", "--compare-versions", "$mangled_lastversion", "gt", "$newversion") == 0) { - if ($verbose) { - print " => remote site does not even have current version\n"; - } elsif ($dehs) { - $dehs_tags{'status'} = "Debian version newer than remote site"; - } else { - print "$pkg: remote site does not even have current version\n"; - } - return 0; - } else { + # Version dependent $download adjustment + if (defined $download_version) { + # Pretend to found a newer upstream version to exit without error + uscan_msg "Newest version on remote site is $newversion, specified download version is $download_version\n"; + $found++; + } elsif ($options{'versionmode'} eq 'newer') { + uscan_msg "Newest version on remote site is $newversion, local version is $lastversion\n" . + ($mangled_lastversion eq $lastversion ? "" : " (mangled local version is $mangled_lastversion)\n"); + if ($compver eq 'newer') { # There's a newer upstream version available, which may already # be on our system or may not be + uscan_msg " => Newer package available\n"; + $dehs_tags{'status'} = "newer package available"; $found++; + } elsif ($compver eq 'same') { + uscan_msg " => Package is up to date\n"; + $dehs_tags{'status'} = "up to date"; + if ($download > 1) { + # 2=force-download or 3=overwrite-download + uscan_msg " => Forcing download as requested\n"; + $found++; + } else { + # 0=no-download or 1=download + $download = 0; + } + } else { # $compver eq 'old' + uscan_msg " => Only older package available\n"; + $dehs_tags{'status'} = "only older package available"; + if ($download > 1) { + uscan_msg " => Forcing download as requested\n"; + $found++; + } else { + $download = 0; + } } - } else { - # Flag that we found a newer upstream version, so that the exit status - # is set correctly + } elsif ($options{'versionmode'} eq 'ignore') { + uscan_msg "Newest version on remote site is $newversion, ignore local version\n"; + $dehs_tags{'status'} = "package available"; $found++; + } else { # same/previous -- secondary-tarball or signature-file + uscan_die "strange ... <version> stanza = same/previous should have defined \$download_version\n"; } - if (defined $pkg_dir) { - if (! -d "$destdir") { - print "Package directory '$destdir to store downloaded file is not existing\n"; - return 1; + ############################# BEGIN SUB DOWNLOAD ################################## + my $downloader = sub { + my ($url, $fname) = @_; + if ($url =~ m%^http(s)?://%) { + if (defined($1) and !$haveSSL) { + uscan_die "$progname: you must have the liblwp-protocol-https-perl package installed\nto use https URLs\n"; + } + # substitute HTML entities + # Is anything else than "&" required? I doubt it. + uscan_verbose "Requesting URL:\n $url\n"; + my $headers = HTTP::Headers->new; + $headers->header('Accept' => '*/*'); + $headers->header('Referer' => $base); + $request = HTTP::Request->new('GET', $url, $headers); + $response = $user_agent->request($request, $fname); + if (! $response->is_success) { + if (defined $pkg_dir) { + uscan_warn "In directory $pkg_dir, downloading\n $url failed: " . $response->status_line . "\n"; + } else { + uscan_warn "Downloading\n $url failed:\n" . $response->status_line . "\n"; + } + return 0; + } ++ } elsif ($url =~ m%^git://%) { ++ uscan_verbose "Requesting URL:\n $url\n"; ++ my @cmd = ('git', 'archive', '--format=tar', ++ "--prefix=$pkg-$newversion/",'--remote'); ++ my @upstream_ref = split /[[:space:]]+/, $url, 2; ++ push @cmd, @upstream_ref; ++ my (undef, $fnametar) = tempfile(UNLINK => 1); ++ spawn(exec => \@cmd, to_file => $fnametar, wait_child => 1); ++ if ($repack) { ++ spawn(exec => ['gzip', '-n', '-9'], ++ from_file => $fnametar, ++ to_file => "$fname", ++ wait_child => 1); ++ } else { ++ spawn(exec => ['xz', '-c'], ++ from_file => $fnametar, ++ to_file => "$fname", ++ wait_child => 1); ++ } ++ uscan_verbose "Generated archive $fname from the git repository.\n"; + } else { + # FTP site + if (exists $options{'pasv'}) { + $ENV{'FTP_PASSIVE'}=$options{'pasv'}; + } + uscan_verbose "Requesting URL:\n $url\n"; + $request = HTTP::Request->new('GET', "$url"); + $response = $user_agent->request($request, $fname); + if (exists $options{'pasv'}) { + if (defined $passive) { + $ENV{'FTP_PASSIVE'}=$passive; + } else { + delete $ENV{'FTP_PASSIVE'}; + } + } + if (! $response->is_success) { + if (defined $pkg_dir) { + uscan_warn "In directory $pkg_dir, downloading\n $url failed: " . $response->status_line . "\n"; + } else { + uscan_warn "Downloading\n $url failed:\n" . $response->status_line . "\n"; + } + return 0; + } } - if (-f "$destdir/$newfile_base") { - print " => $newfile_base already in package directory\n" - if $verbose or ($download == 0 and ! $dehs); - return 0; + return 1; + }; + ############################# END SUB DOWNLOAD ################################## + + # Download tarball + my $download_available; + my $sigfile_base = $newfile_base; + if ($options{'pgpmode'} ne 'previous') { + # try download package + if ( $download == 3 and -e "$destdir/$newfile_base") { + uscan_msg "Download and overwrite the existing file: $newfile_base\n"; + } elsif ( -e "$destdir/$newfile_base") { + uscan_msg "Don\'t download and use the existing file: $newfile_base\n"; + $download_available = 1; + } elsif ($download >0) { + uscan_msg "Downloading upstream package: $newfile_base\n"; + $download_available = $downloader->($upstream_url, "$destdir/$newfile_base"); + } else { # $download = 0, + uscan_msg "Don\'t downloading upstream package: $newfile_base\n"; + $download_available = 0; } - foreach my $suffix (qw(gz bz2 lzma xz)) { - if (-f "$destdir/${pkg}_${newversion}.orig.tar.$suffix") { - print " => ${pkg}_${newversion}.orig.tar.$suffix already in package directory '$destdir'\n" - if $verbose or ($download == 0 and ! $dehs); - return 0; + + # Decompress archive if requested and applicable + if ($download_available and $options{'decompress'}) { + my $suffix = $sigfile_base; + $suffix =~ s/.*?(\.gz|\.xz|\.bz2|\.lzma)?$/$1/; + if ($suffix eq '.gz') { + if ( -x '/bin/gunzip') { + system('/bin/gunzip', "$destdir/$sigfile_base"); + $sigfile_base =~ s/(.*?)\.gz/$1/; + } else { + uscan_warn("Please install gzip.\n"); + return 1; + } + } elsif ($suffix eq '.xz') { + if ( -x '/usr/bin/unxz') { + system('/usr/bin/unxz', "$destdir/$sigfile_base"); + $sigfile_base =~ s/(.*?)\.xz/$1/; + } else { + uscan_warn("Please install xz-utils.\n"); + return 1; + } + } elsif ($suffix eq '.bz2') { + if ( -x '/bin/bunzip2') { + system('/bin/bunzip2', "$destdir/$sigfile_base"); + $sigfile_base =~ s/(.*?)\.bz2/$1/; + } else { + uscan_warn("Please install bzip2.\n"); + return 1; + } + } elsif ($suffix eq '.lzma') { + if ( -x '/usr/bin/unlzma') { + system('/usr/bin/unlzma', "$destdir/$sigfile_base"); + $sigfile_base =~ s/(.*?)\.lzma/$1/; + } else { + uscan_warn "Please install xz-utils or lzma.\n"; + return 1; + } } } } -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/collab-maint/devscripts.git _______________________________________________ devscripts-devel mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/devscripts-devel
