diff options
author | 2017-09-01 10:46:10 +0200 | |
---|---|---|
committer | 2017-09-01 12:29:20 +0200 | |
commit | 8d6fc64b18c7e35b93f5c43dae1dbd2f8cae2147 (patch) | |
tree | 4674235facfacbcffd0b898d4cd4363c6350fffd /src/main/java/com/google/devtools/build/lib/analysis/actions | |
parent | c27b4dac3daf36577b2d7944b730dbe346e130dc (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.java | 91 |
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 |