package jetbrains.mps.internal.make.runtime.util;
/*Generated by MPS */
import java.util.regex.Pattern;
import jetbrains.mps.internal.collections.runtime.Sequence;
import jetbrains.mps.internal.collections.runtime.ISelector;
import java.util.Arrays;
import java.util.regex.Matcher;
import java.io.File;
import org.jetbrains.annotations.NotNull;
import jetbrains.mps.baseLanguage.tuples.runtime.Tuples;
import jetbrains.mps.baseLanguage.tuples.runtime.MultiTuple;
public class DirUtil {
private static Pattern URL = Pattern.compile("[a-zA-Z]://(.*)");
private static final char SLASH_CHAR = '/';
private static final String SLASH = "/";
public static String[] sortDirs(Iterable<String> dirPaths) {
return Sequence.fromIterable(dirPaths).select(new ISelector<String, String>() {
public String select(String p) {
return asDir(straighten(urlToPath(p)));
}
}).sort(new ISelector<String, String>() {
public String select(String p) {
return p;
}
}, true).toGenericArray(String.class);
}
public static int findPrefixAsDir(String dirPath, String[] sortedPaths) {
String dir = asDir(straighten(urlToPath(dirPath)));
int idx = Arrays.binarySearch(sortedPaths, dir);
int absIdx = (idx < 0 ? -2 - idx : idx);
if (absIdx >= 0 && absIdx < sortedPaths.length && startsWith(dir, sortedPaths[absIdx])) {
return absIdx;
}
return idx;
}
public static String normalize(String path) {
return straighten(urlToPath(path));
}
public static String normalizeAsDir(String dirPath) {
return asDir(straighten(urlToPath(dirPath)));
}
public static String asDir(String path) {
return (path.endsWith(SLASH) ? path : path + SLASH);
}
public static String urlToPath(String maybeUrl) {
Matcher m = URL.matcher(maybeUrl);
return (m.matches() ? m.group(1) : maybeUrl);
}
public static String straighten(String syspath) {
return syspath.replace(File.separatorChar, SLASH_CHAR);
}
public static boolean startsWith(String path, String prefix) {
return path.startsWith(prefix) && (path.length() == prefix.length() || prefix.endsWith(SLASH) || path.charAt(prefix.length()) == SLASH_CHAR);
}
/**
* Deduce common parent directory given two normalized/straighten paths
*
* @param path1 first path
* @param path2 second path
* @return empty text if directory paths don't share common prefix, common prefix including trailing slash otherwise
*/
@NotNull
/*package*/ static String commonDirPrefix(@NotNull String path1, @NotNull String path2) {
int lastMatchedSlash = -1;
for (int i = 0, x = Math.min(path1.length(), path2.length()); i < x; i++) {
char c = path1.charAt(i);
if (c != path2.charAt(i)) {
break;
}
if (c == SLASH_CHAR) {
lastMatchedSlash = i;
}
}
return (lastMatchedSlash == -1 ? "" : path1.substring(0, lastMatchedSlash + 1));
}
public static String withoutPrefix(String path, String prefix) {
if (!(startsWith(path, prefix))) {
throw new IllegalArgumentException("invalid prefix");
}
if (path.length() == prefix.length()) {
return "";
}
int prefixLength = prefix.length();
if (path.charAt(prefix.length()) == SLASH_CHAR) {
prefixLength++;
}
return path.substring(prefixLength);
}
public static boolean same(String path1, String path2) {
if (path1.equals(path2)) {
return true;
}
if (path1.length() == path2.length()) {
return false;
}
if (path1.length() > path2.length()) {
{
Tuples._2<String, String> _tmp_rkp2iv_a0c0n = MultiTuple.<String,String>from(path2, path1);
path1 = _tmp_rkp2iv_a0c0n._0();
path2 = _tmp_rkp2iv_a0c0n._1();
}
}
return path2.startsWith(path1) && path2.charAt(path1.length()) == SLASH_CHAR && (path2.length() - path1.length() == 1);
}
}