mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-20 02:54:35 +02:00
8054465: Add --permit-artifact=bar to sjavac
Add --permit-artifact=bar to white-list files that have been written to the destination directory and that sjavac should not delete. Reviewed-by: jjg, alundblad
This commit is contained in:
parent
c8256e4d27
commit
c110d6437f
7 changed files with 85 additions and 16 deletions
|
@ -127,7 +127,11 @@ public class JavacState
|
||||||
// Where to send stdout and stderr.
|
// Where to send stdout and stderr.
|
||||||
private PrintStream out, err;
|
private PrintStream out, err;
|
||||||
|
|
||||||
JavacState(Options options, boolean removeJavacState, PrintStream o, PrintStream e) {
|
// Command line options.
|
||||||
|
private Options options;
|
||||||
|
|
||||||
|
JavacState(Options op, boolean removeJavacState, PrintStream o, PrintStream e) {
|
||||||
|
options = op;
|
||||||
out = o;
|
out = o;
|
||||||
err = e;
|
err = e;
|
||||||
numCores = options.getNumCores();
|
numCores = options.getNumCores();
|
||||||
|
@ -147,7 +151,7 @@ public class JavacState
|
||||||
// We do not want to risk building a broken incremental build.
|
// We do not want to risk building a broken incremental build.
|
||||||
// BUT since the makefiles still copy things straight into the bin_dir et al,
|
// BUT since the makefiles still copy things straight into the bin_dir et al,
|
||||||
// we avoid deleting files here, if the option --permit-unidentified-classes was supplied.
|
// we avoid deleting files here, if the option --permit-unidentified-classes was supplied.
|
||||||
if (!options.isUnidentifiedArtifactPermitted()) {
|
if (!options.areUnidentifiedArtifactsPermitted()) {
|
||||||
deleteContents(binDir);
|
deleteContents(binDir);
|
||||||
deleteContents(gensrcDir);
|
deleteContents(gensrcDir);
|
||||||
deleteContents(headerDir);
|
deleteContents(headerDir);
|
||||||
|
@ -511,7 +515,8 @@ public class JavacState
|
||||||
allKnownArtifacts.add(javacState);
|
allKnownArtifacts.add(javacState);
|
||||||
|
|
||||||
for (File f : binArtifacts) {
|
for (File f : binArtifacts) {
|
||||||
if (!allKnownArtifacts.contains(f)) {
|
if (!allKnownArtifacts.contains(f) &&
|
||||||
|
!options.isUnidentifiedArtifactPermitted(f.getAbsolutePath())) {
|
||||||
Log.debug("Removing "+f.getPath()+" since it is unknown to the javac_state.");
|
Log.debug("Removing "+f.getPath()+" since it is unknown to the javac_state.");
|
||||||
f.delete();
|
f.delete();
|
||||||
}
|
}
|
||||||
|
@ -604,13 +609,16 @@ public class JavacState
|
||||||
/**
|
/**
|
||||||
* Recursively delete a directory and all its contents.
|
* Recursively delete a directory and all its contents.
|
||||||
*/
|
*/
|
||||||
private static void deleteContents(File dir) {
|
private void deleteContents(File dir) {
|
||||||
if (dir != null && dir.exists()) {
|
if (dir != null && dir.exists()) {
|
||||||
for (File f : dir.listFiles()) {
|
for (File f : dir.listFiles()) {
|
||||||
if (f.isDirectory()) {
|
if (f.isDirectory()) {
|
||||||
deleteContents(f);
|
deleteContents(f);
|
||||||
}
|
}
|
||||||
f.delete();
|
if (!options.isUnidentifiedArtifactPermitted(f.getAbsolutePath())) {
|
||||||
|
Log.debug("Removing "+f.getAbsolutePath());
|
||||||
|
f.delete();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -305,7 +305,7 @@ public class Main {
|
||||||
// For examples, files that have been manually copied into these dirs.
|
// For examples, files that have been manually copied into these dirs.
|
||||||
// Artifacts with bad timestamps (ie the on disk timestamp does not match the timestamp
|
// Artifacts with bad timestamps (ie the on disk timestamp does not match the timestamp
|
||||||
// in javac_state) have already been removed when the javac_state was loaded.
|
// in javac_state) have already been removed when the javac_state was loaded.
|
||||||
if (!options.isUnidentifiedArtifactPermitted()) {
|
if (!options.areUnidentifiedArtifactsPermitted()) {
|
||||||
javac_state.removeUnidentifiedArtifacts();
|
javac_state.removeUnidentifiedArtifacts();
|
||||||
}
|
}
|
||||||
// Go through all sources and taint all packages that miss artifacts.
|
// Go through all sources and taint all packages that miss artifacts.
|
||||||
|
|
|
@ -231,7 +231,14 @@ public enum Option {
|
||||||
helper.logLevel("info");
|
helper.logLevel("info");
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
PERMIT_UNIDENTIFIED_ARTIFACTS("--permit-unidentified-artifacts", "Keep unidentified artifacts in destination directory") {
|
PERMIT_ARTIFACT("--permit-artifact=", "Allow this artifact in destination directory") {
|
||||||
|
@Override
|
||||||
|
protected void processMatching(ArgumentIterator iter, OptionHelper helper) {
|
||||||
|
String a = iter.current().substring(arg.length());
|
||||||
|
helper.permitArtifact(Paths.get(a).toFile().getAbsolutePath());
|
||||||
|
}
|
||||||
|
},
|
||||||
|
PERMIT_UNIDENTIFIED_ARTIFACTS("--permit-unidentified-artifacts", "Allow unidentified artifacts in destination directory") {
|
||||||
@Override
|
@Override
|
||||||
protected void processMatching(ArgumentIterator iter, OptionHelper helper) {
|
protected void processMatching(ArgumentIterator iter, OptionHelper helper) {
|
||||||
helper.permitUnidentifiedArtifacts();
|
helper.permitUnidentifiedArtifacts();
|
||||||
|
|
|
@ -80,6 +80,9 @@ public abstract class OptionHelper {
|
||||||
/** Record path for reference source list */
|
/** Record path for reference source list */
|
||||||
public abstract void compareFoundSources(Path referenceList);
|
public abstract void compareFoundSources(Path referenceList);
|
||||||
|
|
||||||
|
/** Record a single permitted artifact */
|
||||||
|
public abstract void permitArtifact(String f);
|
||||||
|
|
||||||
/** Record the fact that unidentified artifacts are permitted */
|
/** Record the fact that unidentified artifacts are permitted */
|
||||||
public abstract void permitUnidentifiedArtifacts();
|
public abstract void permitUnidentifiedArtifacts();
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,8 @@ import java.util.Collection;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.HashSet;
|
||||||
|
|
||||||
import com.sun.tools.sjavac.Transformer;
|
import com.sun.tools.sjavac.Transformer;
|
||||||
|
|
||||||
|
@ -51,7 +53,8 @@ public class Options {
|
||||||
|
|
||||||
private String logLevel = "info";
|
private String logLevel = "info";
|
||||||
|
|
||||||
private boolean permitUnidentifiedArtifact = false;
|
private Set<String> permitted_artifacts = new HashSet<>();
|
||||||
|
private boolean permitUnidentifiedArtifacts = false;
|
||||||
private boolean permitSourcesInDefaultPackage = false;
|
private boolean permitSourcesInDefaultPackage = false;
|
||||||
|
|
||||||
private Path sourceReferenceList;
|
private Path sourceReferenceList;
|
||||||
|
@ -119,10 +122,15 @@ public class Options {
|
||||||
return logLevel;
|
return logLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Returns true iff the artifact is permitted in the output dir. */
|
||||||
|
public boolean isUnidentifiedArtifactPermitted(String f) {
|
||||||
|
return permitted_artifacts.contains(f);
|
||||||
|
}
|
||||||
|
|
||||||
/** Returns true iff artifacts in the output directories should be kept,
|
/** Returns true iff artifacts in the output directories should be kept,
|
||||||
* even if they would not be generated in a clean build. */
|
* even if they would not be generated in a clean build. */
|
||||||
public boolean isUnidentifiedArtifactPermitted() {
|
public boolean areUnidentifiedArtifactsPermitted() {
|
||||||
return permitUnidentifiedArtifact;
|
return permitUnidentifiedArtifacts;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns true iff sources in the default package should be permitted. */
|
/** Returns true iff sources in the default package should be permitted. */
|
||||||
|
@ -249,7 +257,11 @@ public class Options {
|
||||||
if (permitSourcesInDefaultPackage)
|
if (permitSourcesInDefaultPackage)
|
||||||
args.addArg(Option.PERMIT_SOURCES_WITHOUT_PACKAGE);
|
args.addArg(Option.PERMIT_SOURCES_WITHOUT_PACKAGE);
|
||||||
|
|
||||||
if (permitUnidentifiedArtifact)
|
for (String f : permitted_artifacts) {
|
||||||
|
args.addArg(Option.PERMIT_ARTIFACT, f);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (permitUnidentifiedArtifacts)
|
||||||
args.addArg(Option.PERMIT_UNIDENTIFIED_ARTIFACTS);
|
args.addArg(Option.PERMIT_UNIDENTIFIED_ARTIFACTS);
|
||||||
|
|
||||||
// Translation rules
|
// Translation rules
|
||||||
|
@ -399,9 +411,14 @@ public class Options {
|
||||||
sourceReferenceList = referenceList;
|
sourceReferenceList = referenceList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void permitArtifact(String f) {
|
||||||
|
permitted_artifacts.add(f);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void permitUnidentifiedArtifacts() {
|
public void permitUnidentifiedArtifacts() {
|
||||||
permitUnidentifiedArtifact = true;
|
permitUnidentifiedArtifacts = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @test
|
* @test
|
||||||
* @bug 8035063
|
* @bug 8035063 8054465
|
||||||
* @summary Tests decoding of String[] into Options.
|
* @summary Tests decoding of String[] into Options.
|
||||||
*
|
*
|
||||||
* @build Wrapper
|
* @build Wrapper
|
||||||
|
@ -192,13 +192,16 @@ public class OptionDecoding {
|
||||||
assertEquals(17, options.getNumCores());
|
assertEquals(17, options.getNumCores());
|
||||||
assertEquals("debug", options.getLogLevel());
|
assertEquals("debug", options.getLogLevel());
|
||||||
assertEquals(false, options.isDefaultPackagePermitted());
|
assertEquals(false, options.isDefaultPackagePermitted());
|
||||||
assertEquals(false, options.isUnidentifiedArtifactPermitted());
|
assertEquals(false, options.areUnidentifiedArtifactsPermitted());
|
||||||
|
assertEquals(false, options.isUnidentifiedArtifactPermitted(Paths.get("bar.txt").toFile().getAbsolutePath()));
|
||||||
|
|
||||||
options = Options.parseArgs("--permit-unidentified-artifacts",
|
options = Options.parseArgs("--permit-unidentified-artifacts",
|
||||||
|
"--permit-artifact=bar.txt",
|
||||||
"--permit-sources-without-package");
|
"--permit-sources-without-package");
|
||||||
assertEquals("info", options.getLogLevel());
|
assertEquals("info", options.getLogLevel());
|
||||||
assertEquals(true, options.isDefaultPackagePermitted());
|
assertEquals(true, options.isDefaultPackagePermitted());
|
||||||
assertEquals(true, options.isUnidentifiedArtifactPermitted());
|
assertEquals(true, options.areUnidentifiedArtifactsPermitted());
|
||||||
|
assertEquals(true, options.isUnidentifiedArtifactPermitted(Paths.get("bar.txt").toFile().getAbsolutePath()));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test server configuration options
|
// Test server configuration options
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
/*
|
/*
|
||||||
* @test
|
* @test
|
||||||
* @summary Test all aspects of sjavac.
|
* @summary Test all aspects of sjavac.
|
||||||
* @bug 8004658 8042441 8042699 8054461 8054474
|
* @bug 8004658 8042441 8042699 8054461 8054474 8054465
|
||||||
*
|
*
|
||||||
* @build Wrapper
|
* @build Wrapper
|
||||||
* @run main Wrapper SJavac
|
* @run main Wrapper SJavac
|
||||||
|
@ -101,6 +101,7 @@ public class SJavac {
|
||||||
incrementalCompileTestFullyQualifiedRef();
|
incrementalCompileTestFullyQualifiedRef();
|
||||||
compileWithAtFile();
|
compileWithAtFile();
|
||||||
testStateDir();
|
testStateDir();
|
||||||
|
testPermittedArtifact();
|
||||||
|
|
||||||
delete(gensrc);
|
delete(gensrc);
|
||||||
delete(gensrc2);
|
delete(gensrc2);
|
||||||
|
@ -527,6 +528,36 @@ public class SJavac {
|
||||||
"bar/javac_state");
|
"bar/javac_state");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test white listing of external artifacts inside the destination dir.
|
||||||
|
* @throws Exception If test fails
|
||||||
|
*/
|
||||||
|
void testPermittedArtifact() throws Exception {
|
||||||
|
System.out.println("\nVerify that --permit-artifact=bar works.");
|
||||||
|
System.out.println("-------------------------------------------");
|
||||||
|
|
||||||
|
delete(gensrc);
|
||||||
|
delete(bin);
|
||||||
|
|
||||||
|
previous_bin_state = collectState(bin);
|
||||||
|
|
||||||
|
populate(gensrc,
|
||||||
|
"alfa/omega/A.java",
|
||||||
|
"package alfa.omega; public class A { }");
|
||||||
|
|
||||||
|
populate(bin,
|
||||||
|
"alfa/omega/AA.class",
|
||||||
|
"Ugh, a messy build system (tobefixed) wrote this class file, sjavac must not delete it.");
|
||||||
|
|
||||||
|
compile("--log=debug", "--permit-artifact=bin/alfa/omega/AA.class", "-src", "gensrc", "-d", "bin", serverArg);
|
||||||
|
|
||||||
|
Map<String,Long> new_bin_state = collectState(bin);
|
||||||
|
verifyThatFilesHaveBeenAdded(previous_bin_state, new_bin_state,
|
||||||
|
"bin/alfa/omega/A.class",
|
||||||
|
"bin/alfa/omega/AA.class",
|
||||||
|
"bin/javac_state");
|
||||||
|
}
|
||||||
|
|
||||||
void removeFrom(Path dir, String... args) throws IOException {
|
void removeFrom(Path dir, String... args) throws IOException {
|
||||||
for (String filename : args) {
|
for (String filename : args) {
|
||||||
Path p = dir.resolve(filename);
|
Path p = dir.resolve(filename);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue