diff options
author | 2016-03-29 18:57:01 +0000 | |
---|---|---|
committer | 2016-03-30 08:14:47 +0000 | |
commit | c42b09bd953c33452690191969125644deb6ea60 (patch) | |
tree | e99b9cadc7d1a61536cccc990becbeebae0864c5 /src/java_tools/buildjar | |
parent | 9f545a4e4f9127dd74ddfa3c62f56a576db8dbc9 (diff) |
Handle overlapping source jars
JavaBuilder overwrites files when extracting source jars, silently ignoring duplicates. It it'd be better if it didn't, but until it's fixed turbine should have the same behaviour.
--
MOS_MIGRATED_REVID=118487939
Diffstat (limited to 'src/java_tools/buildjar')
2 files changed, 27 insertions, 1 deletions
diff --git a/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac/JavacTurbine.java b/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac/JavacTurbine.java index e30b672c5b..88393958ec 100644 --- a/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac/JavacTurbine.java +++ b/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac/JavacTurbine.java @@ -38,6 +38,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.SimpleFileVisitor; +import java.nio.file.StandardCopyOption; import java.nio.file.attribute.BasicFileAttributes; import java.util.ArrayList; import java.util.Arrays; @@ -318,7 +319,8 @@ public class JavacTurbine implements AutoCloseable { } Path dest = tmpdir.resolve(ze.getName()); Files.createDirectories(dest.getParent()); - Files.copy(zf.getInputStream(ze), dest); + // allow overlapping source jars for compatibility with JavaBuilder (see b/26688023) + Files.copy(zf.getInputStream(ze), dest, StandardCopyOption.REPLACE_EXISTING); extractedSources.add(dest.toAbsolutePath().toString()); } } diff --git a/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/JavacTurbineTest.java b/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/JavacTurbineTest.java index e2e832c39f..b4c7b32b35 100644 --- a/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/JavacTurbineTest.java +++ b/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/JavacTurbineTest.java @@ -972,4 +972,28 @@ public class JavacTurbineTest { "java.lang.NoClassDefFoundError:" + " com/google/devtools/build/java/turbine/javac/JavacTurbine"); } + + @Test + public void overlappingSourceJars() throws Exception { + Path sourceJar1 = temp.newFile("srcs1.jar").toPath(); + try (OutputStream os = Files.newOutputStream(sourceJar1); + JarOutputStream jos = new JarOutputStream(os)) { + jos.putNextEntry(new JarEntry("Hello.java")); + jos.write("public class Hello {}".getBytes(StandardCharsets.UTF_8)); + } + + Path sourceJar2 = temp.newFile("srcs2.jar").toPath(); + try (OutputStream os = Files.newOutputStream(sourceJar2); + JarOutputStream jos = new JarOutputStream(os)) { + jos.putNextEntry(new JarEntry("Hello.java")); + jos.write("public class Hello {}".getBytes(StandardCharsets.UTF_8)); + } + + optionsBuilder.setSourceJars(ImmutableList.of(sourceJar2.toString(), sourceJar1.toString())); + + compile(); + + Map<String, byte[]> outputs = collectOutputs(); + assertThat(outputs.keySet()).containsExactly("Hello.class"); + } } |