Skip to content

Commit b072ac9

Browse files
committed
Include rootProjectName in build-scans.csv for Maven
1 parent 72c2fbc commit b072ac9

File tree

2 files changed

+81
-4
lines changed

2 files changed

+81
-4
lines changed

components/configure-gradle-enterprise-maven-extension/src/main/java/com/gradle/ConfigureGradleEnterprise.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,12 @@ public class ConfigureGradleEnterprise implements GradleEnterpriseListener {
2323

2424
private static final String EXPERIMENT_DIR = System.getProperty("com.gradle.enterprise.build-validation.expDir");
2525

26+
private final RootProjectExtractor rootProjectExtractor;
2627
private final Logger logger;
2728

2829
@Inject
29-
public ConfigureGradleEnterprise(Logger logger) {
30+
public ConfigureGradleEnterprise(RootProjectExtractor rootProjectExtractor, Logger logger) {
31+
this.rootProjectExtractor = rootProjectExtractor;
3032
this.logger = logger;
3133
}
3234

@@ -46,11 +48,13 @@ public void configure(GradleEnterpriseApi api, MavenSession session) {
4648
buildScan.setAllowUntrustedServer(Boolean.parseBoolean(geAllowUntrustedServer));
4749
}
4850

49-
registerBuildScanActions(buildScan);
51+
String rootProjectName = rootProjectExtractor.extractRootProject(session).getName();
52+
53+
registerBuildScanActions(buildScan, rootProjectName);
5054
configureBuildScanPublishing(buildScan);
5155
}
5256

53-
private static void registerBuildScanActions(BuildScanApi buildScan) {
57+
private static void registerBuildScanActions(BuildScanApi buildScan, String rootProjectName) {
5458
buildScan.buildFinished(buildResult -> {
5559
// communicate via error file that no GE server is set
5660
boolean omitServerUrlValidation = parseBoolean(System.getProperty("com.gradle.enterprise.build-validation.omitServerUrlValidation"));
@@ -81,7 +85,7 @@ private static void registerBuildScanActions(BuildScanApi buildScan) {
8185
String baseUrl = String.format("%s://%s%s", buildScanUri.getScheme(), buildScanUri.getHost(), port);
8286

8387
File scanFile = new File(EXPERIMENT_DIR, "build-scans.csv");
84-
append(scanFile, String.format("%s,%s,%s,%s\n", runNum, baseUrl, buildScanUri, buildScanId));
88+
append(scanFile, String.format("%s,%s,%s,%s,%s\n", runNum, baseUrl, buildScanUri, buildScanId, rootProjectName));
8589
});
8690
}
8791

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package com.gradle;
2+
3+
import org.apache.maven.execution.ExecutionEvent;
4+
import org.apache.maven.execution.MavenExecutionRequest;
5+
import org.apache.maven.execution.MavenSession;
6+
import org.apache.maven.model.building.ModelProcessor;
7+
import org.apache.maven.project.MavenProject;
8+
import org.apache.maven.project.ProjectBuilder;
9+
import org.apache.maven.project.ProjectBuildingException;
10+
import org.codehaus.plexus.logging.Logger;
11+
12+
import javax.inject.Inject;
13+
import java.io.File;
14+
import java.util.*;
15+
16+
import static java.util.Collections.emptyList;
17+
18+
public class RootProjectExtractor {
19+
private final ProjectBuilder projectBuilder;
20+
private final ModelProcessor modelProcessor;
21+
private final Logger logger;
22+
23+
@Inject
24+
public RootProjectExtractor(ProjectBuilder projectBuilder, ModelProcessor modelProcessor, Logger logger) {
25+
this.projectBuilder = projectBuilder;
26+
this.modelProcessor = modelProcessor;
27+
this.logger = logger;
28+
}
29+
30+
public MavenProject extractRootProject(ExecutionEvent event) {
31+
return extractRootProject(event.getSession());
32+
}
33+
34+
public MavenProject extractRootProject(MavenSession session) {
35+
List<MavenProject> allProjects = discoverAllProjects(session.getAllProjects());
36+
File workspaceDirectory = getWorkspaceDirectory(session);
37+
38+
if (workspaceDirectory.equals(allProjects.get(0).getBasedir())) {
39+
return allProjects.get(0);
40+
}
41+
42+
File workspaceDirectoryPom = modelProcessor.locatePom(workspaceDirectory);
43+
if (workspaceDirectoryPom.exists()) {
44+
try {
45+
return projectBuilder.build(workspaceDirectoryPom, session.getProjectBuildingRequest()).getProject();
46+
} catch (ProjectBuildingException e) {
47+
logger.error("Exception locating the top level project", e);
48+
}
49+
}
50+
51+
// We didn't successfully identify the root project, so just return the first project.
52+
return allProjects.get(0);
53+
}
54+
55+
private File getWorkspaceDirectory(MavenSession session) {
56+
MavenExecutionRequest request = session.getRequest();
57+
try {
58+
return request.getMultiModuleProjectDirectory();
59+
} catch (NoSuchMethodError ignored) {
60+
return new File(session.getExecutionRootDirectory());
61+
}
62+
}
63+
64+
/**
65+
* Older Maven versions under-reported the list of discovered projects.
66+
* This method discovers all their submodules. For newer Maven versions it is a no-op.
67+
*/
68+
private List<MavenProject> discoverAllProjects(Collection<MavenProject> sessionProjects) {
69+
Set<MavenProject> allProjects = new LinkedHashSet<>(sessionProjects);
70+
sessionProjects.stream().flatMap(p -> Optional.ofNullable(p.getCollectedProjects()).orElse(emptyList()).stream()).forEach(allProjects::add);
71+
return new ArrayList<MavenProject>(allProjects);
72+
}
73+
}

0 commit comments

Comments
 (0)