aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/analysis/actions
diff options
context:
space:
mode:
authorGravatar elenairina <elenairina@google.com>2017-09-01 10:46:10 +0200
committerGravatar Vladimir Moskva <vladmos@google.com>2017-09-01 12:29:20 +0200
commit8d6fc64b18c7e35b93f5c43dae1dbd2f8cae2147 (patch)
tree4674235facfacbcffd0b898d4cd4363c6350fffd /src/main/java/com/google/devtools/build/lib/analysis/actions
parentc27b4dac3daf36577b2d7944b730dbe346e130dc (diff)
Rolling forward Java coverage.
Instead of passing all the runtime jars in the environment variable, we now write them all to a file and store the file path in the env variable, jacoco runner reading the jars from there. Changes on Jacoco runner side are here: https://github.com/bazelbuild/bazel/commit/05418b33dd87d63e2653e594d462b2aedb0e22e5 RELNOTES: A new Java coverage implementation is available. Makes possible coverage for Skylark JVM rules. PiperOrigin-RevId: 167248966
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/analysis/actions')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/actions/LazyWritePathsFileAction.java91
1 files changed, 91 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/actions/LazyWritePathsFileAction.java b/src/main/java/com/google/devtools/build/lib/analysis/actions/LazyWritePathsFileAction.java
new file mode 100644
index 0000000000..d349c6c02e
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/analysis/actions/LazyWritePathsFileAction.java
@@ -0,0 +1,91 @@
+// Copyright 2017 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.analysis.actions;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.devtools.build.lib.actions.ActionExecutionContext;
+import com.google.devtools.build.lib.actions.ActionOwner;
+import com.google.devtools.build.lib.actions.Artifact;
+import com.google.devtools.build.lib.collect.nestedset.NestedSet;
+import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
+import com.google.devtools.build.lib.util.Fingerprint;
+import java.io.IOException;
+import java.io.OutputStream;
+
+/**
+ * Lazily writes the exec path of the given files separated by newline into a specified output file.
+ */
+public final class LazyWritePathsFileAction extends AbstractFileWriteAction {
+ private static final String GUID = "6be94d90-96f3-4bec-8104-1fb08abc2546";
+
+ private final NestedSet<Artifact> files;
+ private final boolean includeOnlyIfSource;
+
+ public LazyWritePathsFileAction(
+ ActionOwner owner, Artifact output, NestedSet<Artifact> files, boolean includeOnlyIfSource) {
+ super(owner, Artifact.NO_ARTIFACTS, output, false);
+ this.files = NestedSetBuilder.fromNestedSet(files).build();
+ this.includeOnlyIfSource = includeOnlyIfSource;
+ }
+
+ public LazyWritePathsFileAction(
+ ActionOwner owner, Artifact output,
+ ImmutableSet<Artifact> files,
+ boolean includeOnlyIfSource) {
+ super(owner, Artifact.NO_ARTIFACTS, output, false);
+ this.files = NestedSetBuilder.<Artifact>stableOrder().addAll(files).build();
+ this.includeOnlyIfSource = includeOnlyIfSource;
+ }
+
+ @Override
+ public DeterministicWriter newDeterministicWriter(ActionExecutionContext ctx) {
+ return new DeterministicWriter() {
+ @Override
+ public void writeOutputFile(OutputStream out) throws IOException {
+ out.write(getContents().toString().getBytes(UTF_8));
+ }
+ };
+ }
+
+ /**
+ * Computes the Action key for this action by computing the fingerprint for the file contents.
+ */
+ @Override
+ protected String computeKey() {
+ Fingerprint f = new Fingerprint();
+ f.addString(GUID);
+ f.addBoolean(includeOnlyIfSource);
+ f.addString(getContents());
+ return f.hexDigestAndReset();
+ }
+
+ private String getContents() {
+ StringBuilder stringBuilder = new StringBuilder();
+ for (Artifact file : files) {
+ if (includeOnlyIfSource) {
+ if (file.isSourceArtifact()) {
+ stringBuilder.append(file.getRootRelativePathString());
+ stringBuilder.append("\n");
+ }
+ } else {
+ stringBuilder.append(file.getRootRelativePathString());
+ stringBuilder.append("\n");
+ }
+ }
+ return stringBuilder.toString();
+ }
+} \ No newline at end of file