blob: b8987c60149c85449332ba47bda6ebc84aa7b804 [file] [log] [blame]
// Copyright 2018 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.rules.repository;
import com.google.devtools.build.lib.actions.FileValue;
import com.google.devtools.build.lib.cmdline.LabelConstants;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.devtools.build.lib.vfs.Root;
import com.google.devtools.build.lib.vfs.RootedPath;
import com.google.devtools.build.skyframe.SkyFunction.Environment;
import com.google.devtools.build.skyframe.SkyKey;
import java.io.IOException;
/** A class to help dealing with WORKSPACE.bazel and WORKSAPCE file */
public class WorkspaceFileHelper {
public static RootedPath getWorkspaceRootedFile(Root directory, Environment env)
throws IOException, InterruptedException {
return getWorkspaceRootedFile(
RootedPath.toRootedPath(directory, PathFragment.EMPTY_FRAGMENT), env);
}
/**
* Get a RootedPath of the WORKSPACE file we should use for a given directory. This function
* returns a RootedPath to <directory>/WORKSPACE.bazel file if it exists and it's a regular file
* or file symlink, otherwise, return a RootedPath to <directory>/WORKSPACE. The caller of this
* function cannot assume the path returned exists, because in the second case we don't check the
* FileValue of `WORKSPACE` file.
*
* @param directory The directory that could contain WORKSPACE.bazel or WORKSPACE file.
* @param env Skyframe env
* @return A RootedPath to the WORKSPACE file we should use for the given directory.
*/
public static RootedPath getWorkspaceRootedFile(RootedPath directory, Environment env)
throws IOException, InterruptedException {
RootedPath workspaceRootedFile =
RootedPath.toRootedPath(
directory.getRoot(),
directory
.getRootRelativePath()
.getRelative(LabelConstants.WORKSPACE_DOT_BAZEL_FILE_NAME));
SkyKey workspaceFileKey = FileValue.key(workspaceRootedFile);
FileValue value;
value = (FileValue) env.getValueOrThrow(workspaceFileKey, IOException.class);
if (value == null) {
return null;
}
if (value.isFile() && !value.isSpecialFile()) {
return workspaceRootedFile;
}
return RootedPath.toRootedPath(
directory.getRoot(),
directory.getRootRelativePath().getRelative(LabelConstants.WORKSPACE_FILE_NAME));
}
public static boolean doesWorkspaceFileExistUnder(Path directory) {
return directory.getRelative(LabelConstants.WORKSPACE_DOT_BAZEL_FILE_NAME).exists()
|| directory.getRelative(LabelConstants.WORKSPACE_FILE_NAME).exists();
}
public static boolean matchWorkspaceFileName(String name) {
return matchWorkspaceFileName(PathFragment.create(name));
}
public static boolean matchWorkspaceFileName(PathFragment name) {
return name.equals(LabelConstants.WORKSPACE_DOT_BAZEL_FILE_NAME)
|| name.equals(LabelConstants.WORKSPACE_FILE_NAME);
}
public static boolean endsWithWorkspaceFileName(PathFragment pathFragment) {
return pathFragment.endsWith(LabelConstants.WORKSPACE_DOT_BAZEL_FILE_NAME)
|| pathFragment.endsWith(LabelConstants.WORKSPACE_FILE_NAME);
}
private WorkspaceFileHelper() {}
}