aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/vfs/SearchPath.java
diff options
context:
space:
mode:
authorGravatar Han-Wen Nienhuys <hanwen@google.com>2015-06-03 12:21:27 +0000
committerGravatar Kristina Chodorow <kchodorow@google.com>2015-06-03 13:49:13 +0000
commited688486f42833d2ac0779c52a132b8f0c0cea2e (patch)
treed631b5031a6da3b0bb06e24a3f34201c41e1f6a1 /src/main/java/com/google/devtools/build/lib/vfs/SearchPath.java
parente8a94ba5830b131255ff0c6b7bc0309e1b792b06 (diff)
Add vfs.SearchPath for searching binaries.
-- MOS_MIGRATED_REVID=95097699
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/vfs/SearchPath.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/vfs/SearchPath.java69
1 files changed, 69 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/SearchPath.java b/src/main/java/com/google/devtools/build/lib/vfs/SearchPath.java
new file mode 100644
index 0000000000..8bb59b98ff
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/vfs/SearchPath.java
@@ -0,0 +1,69 @@
+// Copyright 2015 Google Inc. 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.vfs;
+
+import com.google.common.base.Splitter;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.annotation.Nullable;
+
+/**
+ * Parse and search $PATH, the binary search path for executables.
+ */
+public class SearchPath {
+ private static final Splitter SEPARATOR = Splitter.on(':');
+
+ /**
+ * Parses a $PATH value into a list of paths. A Null search path is treated as an empty one.
+ */
+ public static List<Path> parse(FileSystem fs, @Nullable String searchPath) {
+ List<Path> paths = new ArrayList<>();
+ if (searchPath == null) {
+ return paths;
+ }
+ for (String p : SEPARATOR.split(searchPath)) {
+ paths.add(fs.getPath(p));
+ }
+ return paths;
+ }
+
+ /**
+ * Finds the first executable called {@code exe} in the searchPath.
+ * If {@code exe} is not a basename, it will always return null. This should be equivalent to
+ * running which(1).
+ */
+ @Nullable
+ public static Path which(List<Path> searchPath, String exe) {
+ PathFragment fragment = new PathFragment(exe);
+ if (fragment.segmentCount() != 1 || fragment.isAbsolute()) {
+ return null;
+ }
+
+ for (Path p : searchPath) {
+ Path ch = p.getChild(exe);
+
+ try {
+ if (ch.exists() && ch.isExecutable()) {
+ return ch;
+ }
+ } catch (IOException e) {
+ // Like which(1), we ignore any IO exception (disk on fire, permission denied etc.)
+ }
+ }
+ return null;
+ }
+}