in src/main/java/build/buildfarm/instance/server/AbstractServerInstance.java [736:859]
public static void validateActionInputDirectory(
String directoryPath,
Directory directory,
Stack<Digest> pathDigests,
Set<Digest> visited,
Map<Digest, Directory> directoriesIndex,
Consumer<String> onInputFile,
Consumer<String> onInputDirectory,
Consumer<Digest> onInputDigest,
PreconditionFailure.Builder preconditionFailure) {
Set<String> entryNames = new HashSet<>();
String lastFileName = "";
for (FileNode fileNode : directory.getFilesList()) {
String fileName = fileNode.getName();
if (entryNames.contains(fileName)) {
preconditionFailure
.addViolationsBuilder()
.setType(VIOLATION_TYPE_INVALID)
.setSubject("/" + directoryPath + ": " + fileName)
.setDescription(DUPLICATE_DIRENT);
} else if (lastFileName.compareTo(fileName) > 0) {
preconditionFailure
.addViolationsBuilder()
.setType(VIOLATION_TYPE_INVALID)
.setSubject("/" + directoryPath + ": " + lastFileName + " > " + fileName)
.setDescription(DIRECTORY_NOT_SORTED);
}
// FIXME serverside validity check? regex?
Preconditions.checkState(isValidFilename(), INVALID_FILE_NAME);
lastFileName = fileName;
entryNames.add(fileName);
onInputDigest.accept(fileNode.getDigest());
String filePath = directoryPath.isEmpty() ? fileName : (directoryPath + "/" + fileName);
onInputFile.accept(filePath);
}
String lastSymlinkName = "";
for (SymlinkNode symlinkNode : directory.getSymlinksList()) {
String symlinkName = symlinkNode.getName();
if (entryNames.contains(symlinkName)) {
preconditionFailure
.addViolationsBuilder()
.setType(VIOLATION_TYPE_INVALID)
.setSubject("/" + directoryPath + ": " + symlinkName)
.setDescription(DUPLICATE_DIRENT);
} else if (lastSymlinkName.compareTo(symlinkName) > 0) {
preconditionFailure
.addViolationsBuilder()
.setType(VIOLATION_TYPE_INVALID)
.setSubject("/" + directoryPath + ": " + lastSymlinkName + " > " + symlinkName)
.setDescription(DIRECTORY_NOT_SORTED);
}
/* FIXME serverside validity check? regex?
Preconditions.checkState(
isValidFilename(symlinkName),
INVALID_FILE_NAME);
Preconditions.checkState(
isValidFilename(symlinkNode.getTarget()),
INVALID_FILE_NAME);
// FIXME verify that any relative pathing for the target is within the input root
*/
lastSymlinkName = symlinkName;
entryNames.add(symlinkName);
}
String lastDirectoryName = "";
for (DirectoryNode directoryNode : directory.getDirectoriesList()) {
String directoryName = directoryNode.getName();
if (entryNames.contains(directoryName)) {
preconditionFailure
.addViolationsBuilder()
.setType(VIOLATION_TYPE_INVALID)
.setSubject("/" + directoryPath + ": " + directoryName)
.setDescription(DUPLICATE_DIRENT);
} else if (lastDirectoryName.compareTo(directoryName) > 0) {
preconditionFailure
.addViolationsBuilder()
.setType(VIOLATION_TYPE_INVALID)
.setSubject("/" + directoryPath + ": " + lastDirectoryName + " > " + directoryName)
.setDescription(DIRECTORY_NOT_SORTED);
}
/* FIXME serverside validity check? regex?
Preconditions.checkState(
isValidFilename(directoryName),
INVALID_FILE_NAME);
*/
lastDirectoryName = directoryName;
entryNames.add(directoryName);
Digest directoryDigest = directoryNode.getDigest();
if (pathDigests.contains(directoryDigest)) {
preconditionFailure
.addViolationsBuilder()
.setType(VIOLATION_TYPE_INVALID)
.setSubject(DIRECTORY_CYCLE_DETECTED)
.setDescription("/" + directoryPath + ": " + directoryName);
} else {
String subDirectoryPath =
directoryPath.isEmpty() ? directoryName : (directoryPath + "/" + directoryName);
onInputDirectory.accept(subDirectoryPath);
if (!visited.contains(directoryDigest)) {
validateActionInputDirectoryDigest(
subDirectoryPath,
directoryDigest,
pathDigests,
visited,
directoriesIndex,
onInputFile,
onInputDirectory,
onInputDigest,
preconditionFailure);
} else {
enumerateActionInputDirectory(
subDirectoryPath,
directoriesIndex.get(directoryDigest),
directoriesIndex,
onInputFile,
onInputDirectory);
}
}
}
}