in src/main/java/com/googlesource/gerrit/plugins/findowners/Parser.java [391:433]
private void includeFile(Result result, String dir, int num, String[] parsedKPF, boolean addAll) {
String keyword = parsedKPF[0];
String project = parsedKPF[1];
String file = parsedKPF[2];
String includeKPF = keyword + ":" + getFileKey(project, file);
// Like C/C++ #include, when f1 includes f2 with a relative file path,
// use f1's directory, not 'dir', as the base for relative path.
// 'dir' is the directory of OWNERS file, which might include f1 indirectly.
String repoFile = normalizedRepoDirFilePath(Util.getParentDir(stack.currentFile()), file);
if (stack.contains(project, repoFile)) {
logs.add("parseLine:errorRecursion:" + includeKPF);
result.errors.add(errorMsg(stack.currentFile(), num, "recursive include", includeKPF));
return;
}
String savedResultKey = getFileKey(project, repoFile);
Result includedFileResult = savedResults.get(savedResultKey);
if (null != includedFileResult) {
logs.add("parseLine:useSaved:" + includeKPF);
} else {
stack.push(project, repoFile);
logs.add("parseLine:" + includeKPF);
String content =
OwnersDb.getRepoFile(
permissionBackend,
readFiles,
repoManager,
null,
null,
project,
branch,
repoFile,
logs);
if (content != null && !content.isEmpty()) {
includedFileResult = parseFile("", content);
} else {
logs.add("parseLine:" + keyword + ":()");
includedFileResult = new Result();
}
stack.pop();
savedResults.put(savedResultKey, includedFileResult);
}
result.append(includedFileResult, dir, addAll);
}