in base/src/com/google/idea/blaze/base/model/primitives/TargetName.java [60:129]
public static String validate(String targetName) {
if (targetName.isEmpty()) {
return "target names cannot be empty";
}
// Forbidden start chars:
if (targetName.charAt(0) == '/') {
return "Invalid target name: " + targetName + "\n" + "target names may not start with \"/\"";
}
if (targetName.charAt(0) == '.') {
if (targetName.equals(".")) {
return null;
}
if (targetName.startsWith("../") || targetName.equals("..")) {
return "Invalid target name: "
+ targetName
+ "\n"
+ "target names may not contain up-level references \"..\"";
}
if (targetName.startsWith("./")) {
return "Invalid target name: "
+ targetName
+ "\n"
+ "target names may not contain \".\" as a path segment";
}
}
for (int i = 0; i < targetName.length(); ++i) {
char c = targetName.charAt(i);
if (ALLOWED_META.contains(c)) {
continue;
}
if (c == '/') {
// Forbidden substrings: "/../", "/./", "//"
if (targetName.contains("/../")) {
return "Invalid target name: "
+ targetName
+ "\n"
+ "target names may not contain up-level references \"..\"";
} else if (targetName.contains("/./")) {
return "Invalid target name: "
+ targetName
+ "\n"
+ "target names may not contain \".\" as a path segment";
} else if (targetName.contains("//")) {
return "Invalid target name: "
+ targetName
+ "\n"
+ "target names may not contain \"//\" path separators";
}
continue;
}
boolean isAlnum = ALNUM_REGEX.matcher(String.valueOf(c)).matches();
if (!isAlnum) {
return "Invalid target name: " + targetName + "\n" + "target names may not contain " + c;
}
}
// Forbidden end chars:
if (targetName.endsWith("/..")) {
return "Invalid target name: "
+ targetName
+ "\n"
+ "target names may not contain up-level references \"..\"";
} else if (targetName.endsWith("/.")) {
return null;
} else if (targetName.endsWith("/")) {
return "Invalid target name: " + targetName + "\n" + "target names may not end with \"/\"";
}
return null;
}