in java/com/googlesource/gerrit/plugins/supermanifest/JiriManifestParser.java [78:171]
public static JiriProjects getProjects(
GerritRemoteReader reader, String repoKey, String ref, String manifest)
throws ConfigInvalidException, IOException {
try (RepoMap<String, Repository> repoMap = new RepoMap<>()) {
repoMap.put(repoKey, reader.openRepository(repoKey));
Queue<ManifestItem> q = new LinkedList<>();
q.add(new ManifestItem(repoKey, manifest, ref, "", false));
HashMap<String, HashSet<String>> processedRepoFiles = new HashMap<>();
HashMap<String, JiriProjects.Project> projectMap = new HashMap<>();
while (q.size() != 0) {
ManifestItem mi = q.remove();
Repository repo = repoMap.get(mi.repoKey);
if (repo == null) {
repo = reader.openRepository(mi.repoKey);
repoMap.put(mi.repoKey, repo);
}
HashSet<String> processedFiles = processedRepoFiles.get(mi.repoKey);
if (processedFiles == null) {
processedFiles = new HashSet<>();
processedRepoFiles.put(mi.repoKey, processedFiles);
}
if (processedFiles.contains(mi.manifest)) {
continue;
}
processedFiles.add(mi.manifest);
JiriManifest m;
try {
m = parseManifest(repo, mi.ref, mi.manifest);
} catch (JAXBException | XMLStreamException e) {
throw new ConfigInvalidException("XML parse error", e);
}
for (JiriProjects.Project project : m.projects.getProjects()) {
project.fillDefault();
if (mi.revisionPinned && project.Key().equals(mi.projectKey)) {
project.setRevision(mi.ref);
}
if (projectMap.containsKey(project.Key())) {
if (!projectMap.get(project.Key()).equals(project))
throw new ConfigInvalidException(
String.format(
"Duplicate conflicting project %s in manifest %s\n%s\n%s",
project.Key(),
mi.manifest,
project.toString(),
projectMap.get(project.Key()).toString()));
} else {
projectMap.put(project.Key(), project);
}
}
URI parentURI;
try {
parentURI = new URI(mi.manifest);
} catch (URISyntaxException e) {
throw new ConfigInvalidException("Invalid parent URI", e);
}
for (JiriManifest.LocalImport l : m.imports.getLocalImports()) {
ManifestItem tw =
new ManifestItem(
mi.repoKey,
parentURI.resolve(l.getFile()).getPath(),
mi.ref,
mi.projectKey,
mi.revisionPinned);
q.add(tw);
}
for (JiriManifest.Import i : m.imports.getImports()) {
i.fillDefault();
URI uri;
try {
uri = new URI(i.getRemote());
} catch (URISyntaxException e) {
throw new ConfigInvalidException("Invalid URI", e);
}
String iRepoKey = Project.nameKey(StringUtils.strip(uri.getPath(), "/")).toString();
String iRef = i.getRevision();
boolean revisionPinned = true;
if (iRef.isEmpty()) {
iRef = REFS_HEADS + i.getRemotebranch();
revisionPinned = false;
}
ManifestItem tmi =
new ManifestItem(iRepoKey, i.getManifest(), iRef, i.Key(), revisionPinned);
q.add(tmi);
}
}
return new JiriProjects(projectMap.values().toArray(new JiriProjects.Project[0]));
}
}