[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