[devscripts] 01/14: Uscan enabled excluding files mentioned in debian/copyright.
James McCoy
jamessan at debian.org
Thu Nov 21 03:53:45 UTC 2013
This is an automated email from the git hooks/post-receive script.
jamessan pushed a commit to branch master
in repository devscripts.
commit 89afbb7fc0241935f30efcb0dd90abe490c66424
Author: Andreas Tille <tille at debian.org>
Date: Sat Aug 25 07:22:31 2012 +0200
Uscan enabled excluding files mentioned in debian/copyright.
---
scripts/uscan.1 | 8 ++++
scripts/uscan.pl | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 115 insertions(+), 1 deletion(-)
diff --git a/scripts/uscan.1 b/scripts/uscan.1
index af4e57f..fb53f3e 100644
--- a/scripts/uscan.1
+++ b/scripts/uscan.1
@@ -444,6 +444,10 @@ Give verbose output.
.B \-\-no\-verbose
Don't give verbose output. (This is the default behaviour.)
.TP
+.B \-\-no\-exclusion
+Do not automatically exclude files mentioned in
+\fIdebian/copyright\fR field \fBFiles-Excluded\fR
+.TP
.B \-\-debug
Dump the downloaded web pages to stdout for debugging your watch file.
.TP
@@ -517,6 +521,10 @@ equivalent to the \fB\-\-destdir\fR option.
If this is set to \fIyes\fR, then after having downloaded a bzip tar,
lzma tar, xz tar, or zip archive, \fBuscan\fR will repack it to a gzip tar.
This is equivalent to the \fB\-\-repack\fR option.
+.B USCAN_NO_EXCLUSION
+If this is set to \fIyes\fR, files mentioned in the field \fBFiles-Excluded\fR
+of \fIdebian/copyright\fR will be ignored and no exclusion of files will be
+tried. This is equivalent to the \fB\-\-no-exclusion\fR option.
.SH "EXIT STATUS"
The exit status gives some indication of whether a newer version was
found or not; one is advised to read the output to determine exactly
diff --git a/scripts/uscan.pl b/scripts/uscan.pl
index 976b368..b886e5f 100755
--- a/scripts/uscan.pl
+++ b/scripts/uscan.pl
@@ -46,6 +46,8 @@ BEGIN {
}
}
}
+use Dpkg::Control::Hash;
+
my $CURRENT_WATCHFILE_VERSION = 3;
my $progname = basename($0);
@@ -72,6 +74,7 @@ sub uscan_die (@);
sub dehs_output ();
sub quoted_regex_replace ($);
sub safe_replace ($$);
+sub get_main_source_dir($$$);
sub usage {
print <<"EOF";
@@ -138,6 +141,8 @@ Options:
--no-conf, --noconf
Don\'t read devscripts config files;
must be the first option given
+ --no-exclusion no automatic exclusion of files mentioned in
+ debian/copyright field Files-Excluded
--help Show this message
--version Show version information
@@ -180,6 +185,7 @@ my $dehs_start_output = 0;
my $pkg_report_header = '';
my $timeout = 20;
my $user_agent_string = 'Debian uscan ###VERSION###';
+my $exclusion = 1;
if (@ARGV and $ARGV[0] =~ /^--no-?conf$/) {
$modified_conf_msg = " (no configuration files read)";
@@ -196,6 +202,7 @@ if (@ARGV and $ARGV[0] =~ /^--no-?conf$/) {
'USCAN_DEHS_OUTPUT' => 'no',
'USCAN_USER_AGENT' => '',
'USCAN_REPACK' => 'no',
+ 'USCAN_EXCLUSION' => 'yes',
'DEVSCRIPTS_CHECK_DIRNAME_LEVEL' => 1,
'DEVSCRIPTS_CHECK_DIRNAME_REGEX' => 'PACKAGE(-.+)?',
);
@@ -233,6 +240,8 @@ if (@ARGV and $ARGV[0] =~ /^--no-?conf$/) {
or $config_vars{'USCAN_DEHS_OUTPUT'}='no';
$config_vars{'USCAN_REPACK'} =~ /^(yes|no)$/
or $config_vars{'USCAN_REPACK'}='no';
+ $config_vars{'USCAN_EXCLUSION'} =~ /^(yes|no)$/
+ or $config_vars{'USCAN_EXCLUSION'}='yes';
$config_vars{'DEVSCRIPTS_CHECK_DIRNAME_LEVEL'} =~ /^[012]$/
or $config_vars{'DEVSCRIPTS_CHECK_DIRNAME_LEVEL'}=1;
@@ -263,7 +272,7 @@ if (@ARGV and $ARGV[0] =~ /^--no-?conf$/) {
# Now read the command line arguments
my $debug = 0;
my ($opt_h, $opt_v, $opt_destdir, $opt_download, $opt_force_download,
- $opt_report, $opt_passive, $opt_symlink, $opt_repack);
+ $opt_report, $opt_passive, $opt_symlink, $opt_repack, $opt_exclusion);
my ($opt_verbose, $opt_level, $opt_regex, $opt_noconf);
my ($opt_package, $opt_uversion, $opt_watchfile, $opt_dehs, $opt_timeout);
my $opt_download_version;
@@ -295,6 +304,7 @@ GetOptions("help" => \$opt_h,
"useragent=s" => \$opt_user_agent,
"noconf" => \$opt_noconf,
"no-conf" => \$opt_noconf,
+ "exclusion!" => \$opt_exclusion,
"download-current-version" => \$opt_download_current_version,
)
or die "Usage: $progname [options] [directories]\nRun $progname --help for more details\n";
@@ -318,6 +328,7 @@ $timeout = 20 unless defined $timeout and $timeout > 0;
$symlink = $opt_symlink if defined $opt_symlink;
$verbose = $opt_verbose if defined $opt_verbose;
$dehs = $opt_dehs if defined $opt_dehs;
+$exclusion = $opt_exclusion if defined $opt_exclusion;
$user_agent_string = $opt_user_agent if defined $opt_user_agent;
$download_version = $opt_download_version if defined $opt_download_version;
@@ -1480,6 +1491,54 @@ EOF
}
}
+ if ($exclusion) {
+ my $data = Dpkg::Control::Hash->new();
+ $data->load('debian/copyright');
+ my $okformat = qr'http://www.debian.org/doc/packaging-manuals/copyright-format/1.0';
+ if ($data->{'format'} =~ m{^$okformat/?$} and $data->{'files-excluded'} ) {
+ my $tempdir = tempdir ( "uscanXXXX", TMPDIR => 1, CLEANUP => 1 );
+ my $globpattern = "*";
+ my $hidden = ".[!.]*";
+ if (defined glob("$tempdir/$hidden")) {
+ $globpattern .= " $hidden";
+ }
+ my $absdestdir = abs_path($destdir);
+ unless (system("cd $tempdir; tar -xaf \"$absdestdir/$newfile_base\" 2>/dev/null") == 0) {
+ print "-- $newfile_base is no tarball. Try unzip.\n" if $verbose;
+ # try unzip if tar fails - we do want to do something sensible even if no --repack was specified
+ system('command -v unzip >/dev/null 2>&1') >> 8 == 0
+ or uscan_die("unzip binary not found. This would serve as fallback because tar just failed.\n");
+ system('unzip', '-q', '-a', '-d', $tempdir, "$destdir/$newfile_base") == 0
+ or uscan_die("Repacking from zip to tar.gz failed (could not unzip)\n");
+ }
+ my $main_source_dir = get_main_source_dir($tempdir, $pkg, $newversion);
+ unless ( -d $main_source_dir ) {
+ print STDERR "Error: $main_source_dir is no directory";
+ }
+ my $nfiles_before = `find $main_source_dir | wc -l`;
+ foreach (grep {/\//} split /\s+/, $data->{"files-excluded"}) {
+ # delete trailing '/' because otherwise find -path will fail
+ s?/+$?? ;
+ # use rm -rf to enable deleting non-empty directories
+ `find $main_source_dir -path "$main_source_dir/$_" | xargs rm -rf`;
+ };
+ foreach (grep {/^[^\/]+$/} split /\s+/, $data->{"files-excluded"}) {
+ `find $main_source_dir -type f -name $_ -delete`;
+ };
+ my $nfiles_after = `find $main_source_dir | wc -l`;
+ if ( $nfiles_before == $nfiles_after ) {
+ print "-- Source tree remains identical - no need for repacking.\n" if $verbose;
+ } else {
+ my $excludesuffix = '+dfsg' ;
+ my $suffix = 'gz' ;
+ my $newfile_base_dfsg = "${pkg}_${newversion}${excludesuffix}.orig.tar.$suffix" ;
+ system("cd $tempdir; GZIP='-n -9' tar --owner=root --group=root --mode=a+rX -czf \"$absdestdir/$newfile_base_dfsg\" $globpattern") == 0
+ or die("Excluding files failed (could not create tarball)\n");
+ $symlink = 'no' # prevent symlinking or renaming
+ }
+ }
+ }
+
my @renames = (
[qr/\.(tar\.gz|tgz)$/, 'gz'],
[qr/\.(tar\.bz2|tbz2?)$/, 'bz2'],
@@ -2066,3 +2125,50 @@ sub safe_replace($$) {
return 1;
}
}
+
+sub get_main_source_dir($$$) {
+ my ($tempdir, $pkg, $newversion) = @_;
+ my $fcount = 0;
+ my $main_source_dir = '';
+ my $any_dir = '';
+ opendir DIR, $tempdir or uscan_die "opendir $tempdir: $!";
+ my @files = readdir DIR;
+ closedir DIR;
+ foreach my $file (@files) {
+ unless ($file =~ /^\.\.?$/) {
+ $fcount++;
+ if (-d $tempdir.'/'.$file) {
+ $any_dir = $tempdir . '/' . $file;
+ $main_source_dir = $any_dir if $file =~ /^$pkg\w*$newversion$/i;
+ }
+ }
+ }
+ if ($fcount == 1 and $main_source_dir) {
+ return $main_source_dir;
+ }
+ if ($fcount == 1 and $any_dir) {
+ # Unusual base dir in tarball - should be rather something like ${pkg}-${newversion}
+ $main_source_dir = $tempdir . '/' . $pkg . '-' . $newversion;
+ move($any_dir, $main_source_dir) or uscan_die("Unable to move $any_dir directory $main_source_dir\n");
+ return $main_source_dir;
+ }
+ print "-- Dirty tarball found.\n" if $verbose;
+ if ($main_source_dir) { # if tarball is dirty but does contain a $pkg-$newversion dir we will not undirty but leave it as is
+ print "-- No idea how to create proper tarball structure - leaving as is.\n" if $verbose;
+ return $tempdir;
+ }
+ print "-- Move files to subdirectory $pkg-$newversion.\n" if $verbose;
+ $main_source_dir = $tempdir . '/' . $pkg . '-' . $newversion;
+ mkdir($main_source_dir) or uscan_die("Unable to create temporary source directory $main_source_dir\n");
+ foreach my $file (@files) {
+ unless ($file =~ /^\.\.?/) {
+ # move("${tempdir}/$file", $main_source_dir) or die("Unable to move ${tempdir}/$file directory $main_source_dir\n");
+ unless (move("${tempdir}/$file", $main_source_dir)) {
+ # HELP: why can't perl move not move directories????
+ print "Perl move seems to be not able to ` move(\"${tempdir}/$file\", $main_source_dir) ` ... trying system mv\n" if $debug;
+ system('mv', "${tempdir}/$file", $main_source_dir);
+ }
+ }
+ }
+ return $main_source_dir;
+}
--
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