aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
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
parente8a94ba5830b131255ff0c6b7bc0309e1b792b06 (diff)
Add vfs.SearchPath for searching binaries.
-- MOS_MIGRATED_REVID=95097699
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/vfs/SearchPath.java69
-rw-r--r--src/test/java/com/google/devtools/build/lib/vfs/SearchPathTest.java52
2 files changed, 121 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;
+ }
+}
diff --git a/src/test/java/com/google/devtools/build/lib/vfs/SearchPathTest.java b/src/test/java/com/google/devtools/build/lib/vfs/SearchPathTest.java
new file mode 100644
index 0000000000..3078204b12
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/vfs/SearchPathTest.java
@@ -0,0 +1,52 @@
+// 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 static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.ImmutableList;
+import com.google.devtools.build.lib.vfs.inmemoryfs.InMemoryFileSystem;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+import java.util.List;
+
+@RunWith(JUnit4.class)
+public class SearchPathTest {
+ private FileSystem fs = new InMemoryFileSystem();
+
+ @Test
+ public void testNull() throws Exception {
+ assertThat(SearchPath.parse(fs, null)).isEqualTo(ImmutableList.of());
+ }
+
+ @Test
+ public void testBasic() throws Exception {
+ fs.getPath("/bin").createDirectory();
+ List<Path> searchPath = ImmutableList.of(fs.getPath("/"), fs.getPath("/bin"));
+ assertThat(SearchPath.parse(fs, "/:/bin")).isEqualTo(searchPath);
+
+ fs.getOutputStream(fs.getPath("/bin/exe")).write(new byte[5]);
+
+ assertThat(SearchPath.which(searchPath, "exe")).isEqualTo(null);
+
+ fs.getPath("/bin/exe").setExecutable(true);
+ assertThat(SearchPath.which(searchPath, "exe")).isEqualTo(fs.getPath("/bin/exe"));
+
+ assertThat(SearchPath.which(searchPath, "bin/exe")).isEqualTo(null);
+ assertThat(SearchPath.which(searchPath, "/bin/exe")).isEqualTo(null);
+ }
+}