[lintian] 01/01: Only emit source-contains-prebuilt-java-object reported for .jar files that contain classes. (Closes: #789802)
This is an automated email from the git hooks/post-receive script.
lamby pushed a commit to branch master
in repository lintian.
commit f0e60714b87403db6478fae7f8e3671430fa393f
Author: Chris Lamb <lamby@debian.org>
Date: Sun Mar 18 17:59:39 2018 -0400
Only emit source-contains-prebuilt-java-object reported for .jar files that contain classes. (Closes: #789802)
---
checks/cruft.desc | 8 ----
checks/java.desc | 10 ++++-
checks/java.pm | 15 +++++--
collection/java-info.desc | 2 +-
data/cruft/warn-file-type | 1 -
debian/changelog | 4 ++
lib/Lintian/Collect/Source.pm | 88 ++++++++++++++++++++++++++++++++++++-
t/tests/cruft-general-upstream/desc | 3 +-
t/tests/cruft-general-upstream/tags | 1 -
t/tests/java-jars/desc | 2 +
10 files changed, 117 insertions(+), 17 deletions(-)
diff --git a/checks/cruft.desc b/checks/cruft.desc
index 0574fd0..c469fdd 100644
--- a/checks/cruft.desc
+++ b/checks/cruft.desc
@@ -446,14 +446,6 @@ Info: The source tarball contains a prebuilt file in the Shockwave Flash
sure the package includes the source for the file and that the
packaging rebuilds it.
-Tag: source-contains-prebuilt-java-object
-Severity: pedantic
-Certainty: possible
-Info: The source tarball contains a prebuilt Java class file. These are often
- included by mistake when developers generate a tarball without cleaning
- the source directory first. If there is no sign this was intended,
- consider reporting it as an upstream bug.
-
Tag: source-contains-prebuilt-javascript-object
Severity: pedantic
Certainty: possible
diff --git a/checks/java.desc b/checks/java.desc
index 7a8af22..27739e1 100644
--- a/checks/java.desc
+++ b/checks/java.desc
@@ -1,7 +1,7 @@
Check-Script: java
Author: Vincent Fourmond <fourmond@debian.org>
Abbrev: java
-Type: binary
+Type: binary, source
Needs-Info: java-info, unpacked
Info: This script checks if the packages comply with various aspects of the
Debian Java policy.
@@ -119,3 +119,11 @@ Info: The package ships the specified Jar file containing a
Please ensure that the specified <tt>.java</tt> files are not shipped in
the Jar file.
Ref: java-policy 2.4
+
+Tag: source-contains-prebuilt-java-object
+Severity: pedantic
+Certainty: possible
+Info: The source tarball contains a prebuilt Java class file. These are often
+ included by mistake when developers generate a tarball without cleaning
+ the source directory first. If there is no sign this was intended,
+ consider reporting it as an upstream bug.
diff --git a/checks/java.pm b/checks/java.pm
index 59c7d35..dafe531 100644
--- a/checks/java.pm
+++ b/checks/java.pm
@@ -30,16 +30,26 @@ use Lintian::Data ();
use Lintian::Tags qw(tag);
use Lintian::Util qw(normalize_pkg_path $PKGNAME_REGEX);
+our $CLASS_REGEX = qr/\.(?:class|cljc?)/o;
our $MAX_BYTECODE = Lintian::Data->new('java/constants', qr/\s*=\s*/o);
sub run {
- my ($pkg, undef, $info) = @_;
+ my ($pkg, $type, $info) = @_;
my $java_info = $info->java_info;
my $missing_jarwrapper = 0;
my $has_public_jars = 0;
my $has_jars = 0;
my $jmajlow = '-';
+ if ($type eq 'source') {
+ for my $jar_file (sort keys %{$java_info}) {
+ my $files = $java_info->{$jar_file}{files};
+ tag 'source-contains-prebuilt-java-object', $jar_file
+ if any { m/$CLASS_REGEX$/i } keys %{$files};
+ }
+ return;
+ }
+
my $depends = $info->relation('strong')->unparse;
# Remove all libX-java-doc packages to avoid thinking they are java libs
# - note the result may not be a valid dependency listing
@@ -76,8 +86,7 @@ sub run {
unless basename($jar_file) =~ /^$PKGNAME_REGEX\.jar$/;
}
# check for common code files like .class or .clj (Clojure files)
- foreach
- my $class (grep { m/\.(?:class|cljc?)$/oi } sort keys %{$files}){
+ foreach my $class (grep { m/$CLASS_REGEX$/i } sort keys %{$files}){
my $mver = $files->{$class};
(my $src = $class) =~ s/\.[^.]+$/\.java/;
tag 'jar-contains-source', $jar_file, $src if %{$files}{$src};
diff --git a/collection/java-info.desc b/collection/java-info.desc
index a4e44e0..98aade4 100644
--- a/collection/java-info.desc
+++ b/collection/java-info.desc
@@ -1,7 +1,7 @@
Collector-Script: java-info
Author: Vincent Fourmond <fourmond@debian.org>
Info: This script extracts information from manifests of JAR files
-Type: binary
+Type: binary, source
Version: 3
Needs-Info: file-info, unpacked
Interface: perl-coll
diff --git a/data/cruft/warn-file-type b/data/cruft/warn-file-type
index dd60910..f93ff6a 100644
--- a/data/cruft/warn-file-type
+++ b/data/cruft/warn-file-type
@@ -9,7 +9,6 @@
source-contains-prebuilt-binary ~~ \bELF\b ~~ ~~ map { 's/(?i)(?:[\.-](?:bin|elf|e|hs|linux\d+|oo?|or|out|so(?:\.\d+)*)|static)?$/'.$_.'/'} qw(.asm .c .cc .cpp .cxx .f .F .i .ml .rc .S)
source-contains-prebuilt-flash-object ~~ ^Macromedia \s Flash ~~ ~~ s/(?i)\.swf$/.as/
source-contains-prebuilt-flash-project ~~ ^Composite \s Document \s File ~~ (?i)\.fla$ ~~ s/(?i)\.fla$/.as/
-source-contains-prebuilt-java-object ~~ (?: Java [ ] (?:Jar [ ] file|archive [ ] data) | Zip [ ] archive | JAR) ~~ (?i)\.jar$
# do not forget to change also $JS_EXT in file.pm
source-contains-prebuilt-javascript-object ~~ .* ~~ (?i)[-._](?:compiled|compressed|lite|min|pack(?:ed)?|yc)\.js$ ~~ map{'s/(?i)(?:[-._](?:compiled|compressed|lite|min|pack(?:ed)?|prod|yc))?\.js$/'.$_.'/'} qw(.js _orig.js .js.orig .src.js -src.js .debug.js -debug.js -nc.js)
source-contains-prebuilt-python-object ~~ ^python \s \d(\.\d+)? \s byte-compiled ~~ .* ~~ s/(?i)(?:\.cpython-\d{2}|\.pypy)?\.py[co]$/.py/
diff --git a/debian/changelog b/debian/changelog
index 1d2beb9..e83588e 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -13,6 +13,10 @@ lintian (2.5.80) UNRELEASED; urgency=medium
+ [CL] Look under all of /usr/share/doc (not just /usr/share/doc/$pkg)
when looking for installed examples and update tag description to
match. Thanks to Ferenc Wágner for the report. (Closes: #892905)
+ * checks/java.{desc,pm}:
+ + [CL] Only emit source-contains-prebuilt-java-object reported for .jar
+ files that contain classes. Thanks to Emmanuel Bourg for the report.
+ (Closes: #789802)
* checks/fields.pm:
+ [CL] Only check dependency fields in binary packages for
mail-transport-agent-dependency-does-not-specify-default-mta etc.
diff --git a/lib/Lintian/Collect/Source.pm b/lib/Lintian/Collect/Source.pm
index a085a6f..e0a1c6f 100644
--- a/lib/Lintian/Collect/Source.pm
+++ b/lib/Lintian/Collect/Source.pm
@@ -30,7 +30,7 @@ use Lintian::Relation;
use Parse::DebianChangelog;
use Lintian::Util
- qw(get_file_checksum read_dpkg_control $PKGNAME_REGEX $PKGREPACK_REGEX);
+ qw(get_file_checksum read_dpkg_control open_gz $PKGNAME_REGEX $PKGREPACK_REGEX);
=head1 NAME
@@ -445,6 +445,92 @@ sub _load_dctrl {
return 1;
}
+=item java_info
+
+Returns a hashref containing information about JAR files found in
+source packages, in the form I<file name> -> I<info>, where I<info> is
+a hash containing the following keys:
+
+=over 4
+
+=item manifest
+
+A hash containing the contents of the JAR file manifest. For instance,
+to find the classpath of I<$file>, you could use:
+
+ if (exists $info->java_info->{$file}{'manifest'}) {
+ my $cp = $info->java_info->{$file}{'manifest'}{'Class-Path'};
+ # ...
+ }
+
+NB: Not all jar files have a manifest. For those without, this will
+value will not be available. Use exists (rather than defined) to
+check for it.
+
+=item files
+
+A table of the files in the JAR. Each key is a file name and its value
+is its "Major class version" for Java or "-" if it is not a class file.
+
+=item error
+
+If it exists, this is an error that occurred during reading of the zip
+file. If it exists, it is unlikely that the other fields will be
+present.
+
+=back
+
+Needs-Info requirements for using I<java_info>: java-info
+
+=cut
+
+sub java_info {
+ my ($self) = @_;
+ return $self->{java_info} if exists $self->{java_info};
+ my $javaf = $self->lab_data_path('java-info.gz');
+ my %java_info;
+ if (!-f $javaf) {
+ # no java-info.gz => no jar files to collect data. Just
+ # return an empty hash ref.
+ $self->{java_info} = \%java_info;
+ return $self->{java_info};
+ }
+ my $idx = open_gz($javaf);
+ my $file;
+ my $file_list;
+ my $manifest = 0;
+ local $_;
+ while (<$idx>) {
+ chomp;
+ next if m/^\s*$/o;
+
+ if (m#^-- ERROR:\s*(\S.++)$#o) {
+ $java_info{$file}{error} = $1;
+ } elsif (m#^-- MANIFEST: (?:\./)?(?:.+)$#o) {
+ # TODO: check $file == $1 ?
+ $java_info{$file}{manifest} = {};
+ $manifest = $java_info{$file}{manifest};
+ $file_list = 0;
+ } elsif (m#^-- (?:\./)?(.+)$#o) {
+ $file = $1;
+ $java_info{$file}{files} = {};
+ $file_list = $java_info{$file}{files};
+ $manifest = 0;
+ } else {
+ if ($manifest && m#^ (\S+):\s(.*)$#o) {
+ $manifest->{$1} = $2;
+ } elsif ($file_list) {
+ my ($fname, $clmajor) = (m#^([^-].*):\s*([-\d]+)$#);
+ $file_list->{$fname} = $clmajor;
+ }
+
+ }
+ }
+ $self->{java_info} = \%java_info;
+ close($idx);
+ return $self->{java_info};
+}
+
=item binary_relation (PACKAGE, FIELD)
Returns a L<Lintian::Relation> object for the specified FIELD in the
diff --git a/t/tests/cruft-general-upstream/desc b/t/tests/cruft-general-upstream/desc
index e5805d3..b0dadfa 100644
--- a/t/tests/cruft-general-upstream/desc
+++ b/t/tests/cruft-general-upstream/desc
@@ -4,6 +4,8 @@ Type: non-native
Skeleton: pedantic
Options: --pedantic -I -E
Description: Check for cruft in the upstream source
+Test-Against:
+ source-contains-prebuilt-java-object
Test-For:
configure-generated-file-in-source
source-contains-arch-control-dir
@@ -16,7 +18,6 @@ Test-For:
source-contains-hg-control-dir
source-contains-hg-tags-file
source-contains-prebuilt-flash-object
- source-contains-prebuilt-java-object
source-contains-prebuilt-javascript-object
source-contains-prebuilt-flash-project
source-contains-prebuilt-ms-help-file
diff --git a/t/tests/cruft-general-upstream/tags b/t/tests/cruft-general-upstream/tags
index 4adbf18..96e24e8 100644
--- a/t/tests/cruft-general-upstream/tags
+++ b/t/tests/cruft-general-upstream/tags
@@ -16,7 +16,6 @@ P: cruft-general-upstream source: source-contains-hg-tags-file .hgtags
P: cruft-general-upstream source: source-contains-prebuilt-flash-object fakeflash.swf
P: cruft-general-upstream source: source-contains-prebuilt-flash-project fakefla.fla
P: cruft-general-upstream source: source-contains-prebuilt-flash-project fakeflasourced.fla
-P: cruft-general-upstream source: source-contains-prebuilt-java-object fake.jar
P: cruft-general-upstream source: source-contains-prebuilt-javascript-object fake.min.js
P: cruft-general-upstream source: source-contains-prebuilt-python-object fake.pyc
P: cruft-general-upstream source: source-contains-prebuilt-python-object fake.pyo
diff --git a/t/tests/java-jars/desc b/t/tests/java-jars/desc
index 3f95962..696007b 100644
--- a/t/tests/java-jars/desc
+++ b/t/tests/java-jars/desc
@@ -5,6 +5,8 @@ Description: Various checks about JAR files
Author: Vincent Fourmond <fourmond@debian.org>
Section: java
Test-Depends: javahelper
+Test-Against:
+ source-contains-prebuilt-java-object
Test-For:
bad-jar-name
codeless-jar
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/lintian/lintian.git
Reply to: