LUCENE-5295: Allow the license checker to optionally avoid check sum comparisons.

git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1533791 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Mark Robert Miller 2013-10-19 17:20:20 +00:00
parent d4f285c177
commit 5bfdfac931
2 changed files with 56 additions and 39 deletions

View File

@ -59,7 +59,7 @@
<sequential> <sequential>
<!-- LICENSE and NOTICE verification macro. --> <!-- LICENSE and NOTICE verification macro. -->
<echo>License check under: @{dir}</echo> <echo>License check under: @{dir}</echo>
<licenses licenseDirectory="@{licensedir}" skipSnapshotsChecksum="${skipSnapshotsChecksum}"> <licenses licenseDirectory="@{licensedir}" skipChecksum="${skipChecksum}" skipSnapshotsChecksum="${skipSnapshotsChecksum}">
<fileset dir="@{dir}"> <fileset dir="@{dir}">
<include name="**/*.jar" /> <include name="**/*.jar" />
<!-- Speed up scanning a bit. --> <!-- Speed up scanning a bit. -->

View File

@ -55,6 +55,7 @@ public class LicenseCheckTask extends Task {
private static final int CHECKSUM_BYTE_MASK = 0xFF; private static final int CHECKSUM_BYTE_MASK = 0xFF;
private boolean skipSnapshotsChecksum; private boolean skipSnapshotsChecksum;
private boolean skipChecksum;
/** /**
* All JAR files to check. * All JAR files to check.
@ -109,6 +110,10 @@ public class LicenseCheckTask extends Task {
public void setSkipSnapshotsChecksum(boolean skipSnapshotsChecksum) { public void setSkipSnapshotsChecksum(boolean skipSnapshotsChecksum) {
this.skipSnapshotsChecksum = skipSnapshotsChecksum; this.skipSnapshotsChecksum = skipSnapshotsChecksum;
} }
public void setSkipChecksum(boolean skipChecksum) {
this.skipChecksum = skipChecksum;
}
/** /**
* Execute the task. * Execute the task.
@ -119,7 +124,12 @@ public class LicenseCheckTask extends Task {
throw new BuildException("Expected an embedded <licenseMapper>."); throw new BuildException("Expected an embedded <licenseMapper>.");
} }
if (skipSnapshotsChecksum) log("Skipping checksum for SNAPSHOT dependencies", Project.MSG_INFO); if (skipChecksum) {
log("Skipping checksum verification for dependencies", Project.MSG_INFO);
} else if (skipSnapshotsChecksum) {
log("Skipping checksum for SNAPSHOT dependencies", Project.MSG_INFO);
}
jarResources.setProject(getProject()); jarResources.setProject(getProject());
processJars(); processJars();
@ -168,53 +178,60 @@ public class LicenseCheckTask extends Task {
private boolean checkJarFile(File jarFile) { private boolean checkJarFile(File jarFile) {
log("Scanning: " + jarFile.getPath(), verboseLevel); log("Scanning: " + jarFile.getPath(), verboseLevel);
if (!skipSnapshotsChecksum || !jarFile.getName().contains("-SNAPSHOT")) { if (!skipChecksum) {
// validate the jar matches against our expected hash if (!skipSnapshotsChecksum || !jarFile.getName().contains("-SNAPSHOT")) {
final File checksumFile = new File(licenseDirectory, // validate the jar matches against our expected hash
jarFile.getName() + "." + CHECKSUM_TYPE); final File checksumFile = new File(licenseDirectory, jarFile.getName()
if (! (checksumFile.exists() && checksumFile.canRead()) ) { + "." + CHECKSUM_TYPE);
log("MISSING " +CHECKSUM_TYPE+ " checksum file for: " + jarFile.getPath(), Project.MSG_ERR); if (!(checksumFile.exists() && checksumFile.canRead())) {
log("EXPECTED " +CHECKSUM_TYPE+ " checksum file : " + checksumFile.getPath(), Project.MSG_ERR); log("MISSING " + CHECKSUM_TYPE + " checksum file for: "
this.failures = true; + jarFile.getPath(), Project.MSG_ERR);
return false; log("EXPECTED " + CHECKSUM_TYPE + " checksum file : "
} else { + checksumFile.getPath(), Project.MSG_ERR);
final String expectedChecksum = readChecksumFile(checksumFile); this.failures = true;
try { return false;
final MessageDigest md = MessageDigest.getInstance(CHECKSUM_TYPE); } else {
byte[] buf = new byte[CHECKSUM_BUFFER_SIZE]; final String expectedChecksum = readChecksumFile(checksumFile);
try { try {
FileInputStream fis = new FileInputStream(jarFile); final MessageDigest md = MessageDigest.getInstance(CHECKSUM_TYPE);
byte[] buf = new byte[CHECKSUM_BUFFER_SIZE];
try { try {
DigestInputStream dis = new DigestInputStream(fis, md); FileInputStream fis = new FileInputStream(jarFile);
try { try {
while (dis.read(buf, 0, CHECKSUM_BUFFER_SIZE) != -1) { DigestInputStream dis = new DigestInputStream(fis, md);
// NOOP try {
while (dis.read(buf, 0, CHECKSUM_BUFFER_SIZE) != -1) {
// NOOP
}
} finally {
dis.close();
} }
} finally { } finally {
dis.close(); fis.close();
} }
} finally { } catch (IOException ioe) {
fis.close(); throw new BuildException("IO error computing checksum of file: "
+ jarFile, ioe);
} }
} catch (IOException ioe) { final byte[] checksumBytes = md.digest();
throw new BuildException("IO error computing checksum of file: " + jarFile, ioe); final String checksum = createChecksumString(checksumBytes);
if (!checksum.equals(expectedChecksum)) {
log("CHECKSUM FAILED for " + jarFile.getPath() + " (expected: \""
+ expectedChecksum + "\" was: \"" + checksum + "\")",
Project.MSG_ERR);
this.failures = true;
return false;
}
} catch (NoSuchAlgorithmException ae) {
throw new BuildException("Digest type " + CHECKSUM_TYPE
+ " not supported by your JVM", ae);
} }
final byte[] checksumBytes = md.digest();
final String checksum = createChecksumString(checksumBytes);
if ( ! checksum.equals(expectedChecksum) ) {
log("CHECKSUM FAILED for " + jarFile.getPath() +
" (expected: \"" + expectedChecksum + "\" was: \"" + checksum + "\")",
Project.MSG_ERR);
this.failures = true;
return false;
}
} catch (NoSuchAlgorithmException ae) {
throw new BuildException("Digest type " + CHECKSUM_TYPE + " not supported by your JVM", ae);
} }
} else if (skipSnapshotsChecksum) {
log("Skipping jar because it is a SNAPSHOT : "
+ jarFile.getAbsolutePath(), Project.MSG_INFO);
} }
} else if (skipSnapshotsChecksum) {
log("Skipping jar because it is a SNAPSHOT : " + jarFile.getAbsolutePath(), Project.MSG_INFO);
} }
// Get the expected license path base from the mapper and search for license files. // Get the expected license path base from the mapper and search for license files.