[devscripts] 03/04: Merge branch 'git'
Osamu Aoki
osamu at moszumanska.debian.org
Mon Nov 16 17:28:58 UTC 2015
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 <osamu at debian.org>
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
More information about the devscripts-devel
mailing list