use of com.google.devtools.build.lib.vfs.RootedPath in project bazel by bazelbuild.
the class WorkspaceFileFunction method compute.
@Override
public SkyValue compute(SkyKey skyKey, Environment env) throws WorkspaceFileFunctionException, InterruptedException {
WorkspaceFileKey key = (WorkspaceFileKey) skyKey.argument();
RootedPath workspaceRoot = key.getPath();
WorkspaceASTValue workspaceASTValue = (WorkspaceASTValue) env.getValue(WorkspaceASTValue.key(workspaceRoot));
if (workspaceASTValue == null) {
return null;
}
Path repoWorkspace = workspaceRoot.getRoot().getRelative(workspaceRoot.getRelativePath());
Package.Builder builder = packageFactory.newExternalPackageBuilder(repoWorkspace, ruleClassProvider.getRunfilesPrefix());
if (workspaceASTValue.getASTs().isEmpty()) {
return new WorkspaceFileValue(// resulting package
builder.build(), // list of imports
ImmutableMap.<String, Extension>of(), // list of symbol bindings
ImmutableMap.<String, Object>of(), // Workspace root
workspaceRoot, // first fragment, idx = 0
0, // last fragment
false);
}
WorkspaceFactory parser;
try (Mutability mutability = Mutability.create("workspace %s", repoWorkspace)) {
parser = new WorkspaceFactory(builder, ruleClassProvider, packageFactory.getEnvironmentExtensions(), mutability, key.getIndex() == 0, directories.getEmbeddedBinariesRoot(), directories.getWorkspace());
if (key.getIndex() > 0) {
WorkspaceFileValue prevValue = (WorkspaceFileValue) env.getValue(WorkspaceFileValue.key(key.getPath(), key.getIndex() - 1));
if (prevValue == null) {
return null;
}
if (prevValue.next() == null) {
return prevValue;
}
parser.setParent(prevValue.getPackage(), prevValue.getImportMap(), prevValue.getBindings());
}
BuildFileAST ast = workspaceASTValue.getASTs().get(key.getIndex());
PackageFunction.SkylarkImportResult importResult = PackageFunction.fetchImportsFromBuildFile(repoWorkspace, rootPackage, ast, env, null);
if (importResult == null) {
return null;
}
parser.execute(ast, importResult.importMap);
} catch (NoSuchPackageException e) {
throw new WorkspaceFileFunctionException(e, Transience.PERSISTENT);
} catch (NameConflictException e) {
throw new WorkspaceFileFunctionException(e, Transience.PERSISTENT);
}
return new WorkspaceFileValue(builder.build(), parser.getImportMap(), parser.getVariableBindings(), workspaceRoot, key.getIndex(), key.getIndex() < workspaceASTValue.getASTs().size() - 1);
}
use of com.google.devtools.build.lib.vfs.RootedPath in project bazel by bazelbuild.
the class SkyframeAwareActionTest method assertActionWithMaybeChangingInputAndChangingSkyframeDeps.
private void assertActionWithMaybeChangingInputAndChangingSkyframeDeps(ChangeArtifact changeInputFile) throws Exception {
final RootedPath depPath = createSkyframeDepOfAction();
final SkyKey skyframeDep = FileStateValue.key(depPath);
// Assert that an action-cache-check-bypassing action is executed twice if its skyframe deps
// change while its input does not. The skyframe dependency is established by making the action
// skyframe-aware and updating the value between builds.
assertActionExecutions(new ExecutionCountingActionFactory() {
@Override
public ExecutionCountingAction create(Artifact input, Artifact output, AtomicInteger executionCounter) {
return new SkyframeAwareExecutionCountingAction(input, output, executionCounter, skyframeDep);
}
}, changeInputFile, new Callable<Void>() {
@Override
public Void call() throws Exception {
// Invalidate the dependency and change what its value will be in the next build. This
// should enforce rebuilding of the action.
appendToFile(depPath.asPath());
differencer.invalidate(ImmutableList.of(skyframeDep));
return null;
}
}, ExpectActionIs.REEXECUTED);
}
use of com.google.devtools.build.lib.vfs.RootedPath in project bazel by bazelbuild.
the class WorkspaceASTFunctionTest method createWorkspaceFile.
private RootedPath createWorkspaceFile(String... contents) throws IOException {
Path workspacePath = scratch.overwriteFile("WORKSPACE", contents);
fakeWorkspaceFileValue.setSize(workspacePath.getFileSize());
return RootedPath.toRootedPath(workspacePath.getParentDirectory(), new PathFragment(workspacePath.getBaseName()));
}
use of com.google.devtools.build.lib.vfs.RootedPath in project bazel by bazelbuild.
the class WorkspaceASTFunctionTest method getASTs.
private List<BuildFileAST> getASTs(String... lines) throws IOException, SkyFunctionException, InterruptedException {
RootedPath workspacePath = createWorkspaceFile(lines);
WorkspaceASTValue value = (WorkspaceASTValue) astSkyFunc.compute(WorkspaceASTValue.key(workspacePath), getEnv());
return value.getASTs();
}
use of com.google.devtools.build.lib.vfs.RootedPath in project bazel by bazelbuild.
the class WorkspaceFileFunctionTest method testBindArgsReversed.
@Test
public void testBindArgsReversed() throws Exception {
String[] lines = { "bind(actual = '//foo:bar', name = 'foo/bar')" };
RootedPath workspacePath = createWorkspaceFile(lines);
SkyKey key = ExternalPackageFunction.key(workspacePath);
PackageValue value = (PackageValue) externalSkyFunc.compute(key, getEnv());
Package pkg = value.getPackage();
assertEquals(Label.parseAbsolute("//foo:bar"), getLabelMapping(pkg, "foo/bar"));
MoreAsserts.assertNoEvents(pkg.getEvents());
}
Aggregations