aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/java_tools/buildjar
diff options
context:
space:
mode:
authorGravatar Liam Miller-Cushon <cushon@google.com>2016-03-29 18:57:01 +0000
committerGravatar Klaus Aehlig <aehlig@google.com>2016-03-30 08:14:47 +0000
commitc42b09bd953c33452690191969125644deb6ea60 (patch)
treee99b9cadc7d1a61536cccc990becbeebae0864c5 /src/java_tools/buildjar
parent9f545a4e4f9127dd74ddfa3c62f56a576db8dbc9 (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')
-rw-r--r--src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac/JavacTurbine.java4
-rw-r--r--src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/JavacTurbineTest.java24
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");
+ }
}