blob: 87df20d7f1ae7808bdf60263c8b1934342603fe6 [file] [log] [blame]
/*
* Copyright 2012-present Facebook, Inc.
*
* 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.facebook.buck.util;
import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
import com.google.common.collect.Iterables;
import java.io.File;
import javax.annotation.Nullable;
public class Paths {
private Paths() {}
/**
* @param from must always refer to a directory (it should either be the empty string or end with
* a slash).
* @param to may refer to either a file or a directory
*/
public static String computeRelativePath(String from, String to) {
Preconditions.checkNotNull(from);
Preconditions.checkArgument(from.isEmpty() || from.endsWith("/"),
"Directory path must either be the empty string or end with a slash");
Preconditions.checkNotNull(to);
if (from.isEmpty()) {
return to;
}
// Both from and to have the same string prefix through this character index.
int samePrefixIndex = 0;
while (true) {
int slashIndex = from.indexOf('/', samePrefixIndex);
if (slashIndex < 0) {
break;
}
int indexIncludingSlash = slashIndex + 1;
if (indexIncludingSlash > to.length()) {
break;
}
String fromPathElement = from.substring(samePrefixIndex, indexIncludingSlash);
String toPathElement = to.substring(samePrefixIndex, indexIncludingSlash);
if (fromPathElement.equals(toPathElement)) {
samePrefixIndex = indexIncludingSlash;
} else {
break;
}
}
int directoryDepth = 0;
for (int charIndex = samePrefixIndex + 1; charIndex < from.length(); charIndex++) {
if (from.charAt(charIndex) == '/') {
directoryDepth++;
}
}
return Strings.repeat("../", directoryDepth) + to.substring(samePrefixIndex);
}
/**
* @return the path to the parent
*/
public static String getParentPath(String pathToFile) {
Preconditions.checkNotNull(pathToFile);
Preconditions.checkArgument(!pathToFile.isEmpty(), "path cannot be the empty string");
if (pathToFile.endsWith("/")) {
pathToFile = pathToFile.substring(0, pathToFile.length() - 1);
}
int lastSlashIndex = pathToFile.lastIndexOf('/');
if (lastSlashIndex < 0) {
return "";
} else {
return pathToFile.substring(0, lastSlashIndex + 1);
}
}
/**
* Mimic the UNIX command basename.
* @param path Filesystem path
* @param suffix Optional suffix (use null to exclude) that will be stripped from the basename if
* it is found.
* @return The file's name, with suffix removed if provided.
*/
public static String getBasename(String path, @Nullable String suffix) {
Preconditions.checkNotNull(path);
String name = new File(path).getName();
if (suffix != null && name.endsWith(suffix)) {
return name.substring(0, name.length() - suffix.length());
} else {
return name;
}
}
public static Iterable<File> transformPathToFile(Iterable<String> paths) {
return Iterables.transform(paths, Functions.PATH_TO_FILE);
}
public static Iterable<String> transformFileToAbsolutePath(Iterable<File> files) {
return Iterables.transform(files, Functions.FILE_TO_ABSOLUTE_PATH);
}
/**
* Returns normalized path. On Windows \ will be replaced with /.
* @return Normalized path
*/
public static String normalizePathSeparator(String path) {
return path.replace("\\", "/");
}
/** @return true if the specified path contains a backslash character. */
public static boolean containsBackslash(String path) {
return path.indexOf('\\') >= 0;
}
}