From ed688486f42833d2ac0779c52a132b8f0c0cea2e Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Wed, 3 Jun 2015 12:21:27 +0000 Subject: Add vfs.SearchPath for searching binaries. -- MOS_MIGRATED_REVID=95097699 --- .../google/devtools/build/lib/vfs/SearchPath.java | 69 ++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 src/main/java/com/google/devtools/build/lib/vfs/SearchPath.java (limited to 'src/main/java/com/google/devtools/build/lib/vfs/SearchPath.java') 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 parse(FileSystem fs, @Nullable String searchPath) { + List 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 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; + } +} -- cgit v1.2.3