diff options
author | 2015-06-03 12:21:27 +0000 | |
---|---|---|
committer | 2015-06-03 13:49:13 +0000 | |
commit | ed688486f42833d2ac0779c52a132b8f0c0cea2e (patch) | |
tree | d631b5031a6da3b0bb06e24a3f34201c41e1f6a1 /src | |
parent | e8a94ba5830b131255ff0c6b7bc0309e1b792b06 (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.java | 69 | ||||
-rw-r--r-- | src/test/java/com/google/devtools/build/lib/vfs/SearchPathTest.java | 52 |
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); + } +} |