From da1ba3f905f0b05206e45976aa875f608ef4f7f1 Mon Sep 17 00:00:00 2001 From: Reinhold Degenfellner Date: Tue, 9 Apr 2024 13:31:18 +0200 Subject: [PATCH] Add problem collection to org.gradle.internal.enterprise.GradleEnterprisePluginEndOfBuildListener.BuildResult --- gradle.properties | 3 +- .../enterprise/enterprise/build.gradle.kts | 1 + .../BaseBuildScanPluginCheckInFixture.groovy | 1 + ...inEndOfBuildCallbackIntegrationTest.groovy | 29 +++++++++++++------ ...dleEnterprisePluginEndOfBuildListener.java | 5 ++++ .../DefaultGradleEnterprisePluginAdapter.java | 26 +++++++++++++++-- ...tGradleEnterprisePluginAdapterFactory.java | 11 +++++-- .../ValidationProblemSerializationTest.groovy | 3 +- platforms/ide/problems-api/build.gradle.kts | 1 + .../internal/DefaultProblemReporter.java | 11 ++++++- .../problems/internal/DefaultProblems.java | 23 +++++++++++---- .../problems/internal/InternalProblems.java | 3 ++ .../internal/DefaultProblemTest.groovy | 3 +- .../api/problems/ReportingScript.groovy | 4 ++- subprojects/core-api/build.gradle.kts | 1 + .../DefaultBuildLifecycleController.java | 9 ++++-- ...efaultBuildLifecycleControllerFactory.java | 5 +++- ...DefaultBuildLifecycleControllerTest.groovy | 3 +- .../test/fixtures/plugin/PluginBuilder.groovy | 3 +- 19 files changed, 115 insertions(+), 30 deletions(-) diff --git a/gradle.properties b/gradle.properties index be349a6fada2..be48cddbc232 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,3 @@ -# Reduce Xmx after https://github.com/gradle/gradle-private/issues/4168 is resolved org.gradle.jvmargs=-Xmx3000m -XX:MaxMetaspaceSize=768m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 org.gradle.parallel=true org.gradle.caching=true @@ -29,5 +28,5 @@ systemProp.dependency.analysis.test.analysis=false unmigratedProjects=\ enterprise,enterprise-logging,enterprise-plugin-performance,ide,ide-native,installation-beacon,internal-integ-testing,internal-performance-testing,internal-testing,kotlin-dsl,kotlin-dsl-plugins,\ kotlin-dsl-provider-plugins,kotlin-dsl-tooling-models,language-native,launcher,performance,platform-native,plugin-development,\ - plugin-use,problems,problems-api,\ + plugin-use,problems,\ testing-native,test-kit,tooling-api,tooling-api-builders,tooling-native,worker-services,workers,wrapper,smoke-ide-test diff --git a/platforms/enterprise/enterprise/build.gradle.kts b/platforms/enterprise/enterprise/build.gradle.kts index 78321cca3ef2..d3e0100ff952 100644 --- a/platforms/enterprise/enterprise/build.gradle.kts +++ b/platforms/enterprise/enterprise/build.gradle.kts @@ -51,6 +51,7 @@ dependencies { integTestImplementation(project(":messaging")) integTestImplementation(project(":persistent-cache")) integTestImplementation(project(":native")) + integTestImplementation(testFixtures(project(":problems-api"))) integTestImplementation(libs.guava) integTestDistributionRuntimeOnly(project(":distributions-full")) diff --git a/platforms/enterprise/enterprise/src/integTest/groovy/org/gradle/internal/enterprise/BaseBuildScanPluginCheckInFixture.groovy b/platforms/enterprise/enterprise/src/integTest/groovy/org/gradle/internal/enterprise/BaseBuildScanPluginCheckInFixture.groovy index acc991dc586a..611866023dd6 100644 --- a/platforms/enterprise/enterprise/src/integTest/groovy/org/gradle/internal/enterprise/BaseBuildScanPluginCheckInFixture.groovy +++ b/platforms/enterprise/enterprise/src/integTest/groovy/org/gradle/internal/enterprise/BaseBuildScanPluginCheckInFixture.groovy @@ -164,6 +164,7 @@ abstract class BaseBuildScanPluginCheckInFixture { $GradleEnterprisePluginEndOfBuildListener.name getEndOfBuildListener() { return { $GradleEnterprisePluginEndOfBuildListener.BuildResult.name buildResult -> println "${propertyPrefix}.endOfBuild.buildResult.failure = \$buildResult.failure" + println "${propertyPrefix}.endOfBuild.buildResult.problems = \${buildResult.problems.size()}" if (System.getProperty("build-listener-failure") != null) { throw new RuntimeException("broken") } diff --git a/platforms/enterprise/enterprise/src/integTest/groovy/org/gradle/internal/enterprise/DevelocityPluginEndOfBuildCallbackIntegrationTest.groovy b/platforms/enterprise/enterprise/src/integTest/groovy/org/gradle/internal/enterprise/DevelocityPluginEndOfBuildCallbackIntegrationTest.groovy index 76dd01ab8544..a9eeae4fd75d 100644 --- a/platforms/enterprise/enterprise/src/integTest/groovy/org/gradle/internal/enterprise/DevelocityPluginEndOfBuildCallbackIntegrationTest.groovy +++ b/platforms/enterprise/enterprise/src/integTest/groovy/org/gradle/internal/enterprise/DevelocityPluginEndOfBuildCallbackIntegrationTest.groovy @@ -16,30 +16,41 @@ package org.gradle.internal.enterprise + import org.gradle.integtests.fixtures.AbstractIntegrationSpec +import static org.gradle.api.problems.ReportingScript.getProblemReportingScript + class DevelocityPluginEndOfBuildCallbackIntegrationTest extends AbstractIntegrationSpec { def plugin = new DevelocityPluginCheckInFixture(testDirectory, mavenRepo, createExecuter()) + def failingTaskName = "reportProblem" + def succeedingTaskName = "succeedingTask" def setup() { settingsFile << plugin.pluginManagement() << plugin.plugins() plugin.publishDummyPlugin(executer) - buildFile << """ - task t - task f { doLast { throw new RuntimeException("failed") } } + + buildFile """ + ${getProblemReportingScript """ + problems.forNamespace('org.example.plugin').throwing { + it.id('type', 'label') + .withException(new RuntimeException('failed')) + }"""} + + task $succeedingTaskName """ } def "end of build listener is notified on success"() { when: - succeeds "t" + succeeds succeedingTaskName then: plugin.assertEndOfBuildWithFailure(output, null) when: - succeeds "t" + succeeds succeedingTaskName then: plugin.assertEndOfBuildWithFailure(output, null) @@ -47,13 +58,13 @@ class DevelocityPluginEndOfBuildCallbackIntegrationTest extends AbstractIntegrat def "end of build listener is notified on failure"() { when: - fails "f" + fails failingTaskName then: plugin.assertEndOfBuildWithFailure(output, "org.gradle.internal.exceptions.LocationAwareException: Build file") when: - fails "f" + fails failingTaskName then: // Note: we test less of the exception here because it's different in a build where configuration came from cache @@ -63,14 +74,14 @@ class DevelocityPluginEndOfBuildCallbackIntegrationTest extends AbstractIntegrat def "end of build listener may fail with an exception"() { when: - fails "t", "-Dbuild-listener-failure" + fails succeedingTaskName, "-Dbuild-listener-failure" then: plugin.assertEndOfBuildWithFailure(output, null) failure.assertHasDescription("broken") when: - fails "t", "-Dbuild-listener-failure" + fails succeedingTaskName, "-Dbuild-listener-failure" then: plugin.assertEndOfBuildWithFailure(output, null) diff --git a/platforms/enterprise/enterprise/src/main/java/org/gradle/internal/enterprise/GradleEnterprisePluginEndOfBuildListener.java b/platforms/enterprise/enterprise/src/main/java/org/gradle/internal/enterprise/GradleEnterprisePluginEndOfBuildListener.java index a81394b02e02..c856a373f3cf 100644 --- a/platforms/enterprise/enterprise/src/main/java/org/gradle/internal/enterprise/GradleEnterprisePluginEndOfBuildListener.java +++ b/platforms/enterprise/enterprise/src/main/java/org/gradle/internal/enterprise/GradleEnterprisePluginEndOfBuildListener.java @@ -16,7 +16,10 @@ package org.gradle.internal.enterprise; +import org.gradle.api.problems.internal.Problem; + import javax.annotation.Nullable; +import java.util.Collection; /** * Used to signal the end of build to the plugin. @@ -31,6 +34,8 @@ public interface GradleEnterprisePluginEndOfBuildListener { interface BuildResult { @Nullable Throwable getFailure(); + + Collection getProblems(); } void buildFinished(BuildResult buildResult); diff --git a/platforms/enterprise/enterprise/src/main/java/org/gradle/internal/enterprise/impl/DefaultGradleEnterprisePluginAdapter.java b/platforms/enterprise/enterprise/src/main/java/org/gradle/internal/enterprise/impl/DefaultGradleEnterprisePluginAdapter.java index e5b2fdf56252..effb91b2f0b6 100644 --- a/platforms/enterprise/enterprise/src/main/java/org/gradle/internal/enterprise/impl/DefaultGradleEnterprisePluginAdapter.java +++ b/platforms/enterprise/enterprise/src/main/java/org/gradle/internal/enterprise/impl/DefaultGradleEnterprisePluginAdapter.java @@ -16,6 +16,9 @@ package org.gradle.internal.enterprise.impl; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Multimap; +import org.gradle.api.problems.internal.Problem; import org.gradle.internal.enterprise.GradleEnterprisePluginBuildState; import org.gradle.internal.enterprise.GradleEnterprisePluginConfig; import org.gradle.internal.enterprise.GradleEnterprisePluginEndOfBuildListener; @@ -25,7 +28,9 @@ import org.gradle.internal.enterprise.core.GradleEnterprisePluginAdapter; import org.gradle.internal.operations.notify.BuildOperationNotificationListenerRegistrar; +import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.util.Collection; /** * Captures the state to recreate the {@link GradleEnterprisePluginService} instance. @@ -48,6 +53,7 @@ public class DefaultGradleEnterprisePluginAdapter implements GradleEnterprisePlu private final DefaultGradleEnterprisePluginServiceRef pluginServiceRef; private final BuildOperationNotificationListenerRegistrar buildOperationNotificationListenerRegistrar; + private final Multimap problemsMapping; private transient GradleEnterprisePluginService pluginService; @@ -57,7 +63,8 @@ public DefaultGradleEnterprisePluginAdapter( DefaultGradleEnterprisePluginRequiredServices requiredServices, GradleEnterprisePluginBuildState buildState, DefaultGradleEnterprisePluginServiceRef pluginServiceRef, - BuildOperationNotificationListenerRegistrar buildOperationNotificationListenerRegistrar + BuildOperationNotificationListenerRegistrar buildOperationNotificationListenerRegistrar, + Multimap problemsMapping ) { this.pluginServiceFactory = pluginServiceFactory; this.config = config; @@ -65,6 +72,7 @@ public DefaultGradleEnterprisePluginAdapter( this.buildState = buildState; this.pluginServiceRef = pluginServiceRef; this.buildOperationNotificationListenerRegistrar = buildOperationNotificationListenerRegistrar; + this.problemsMapping = problemsMapping; createPluginService(); } @@ -95,14 +103,28 @@ public void buildFinished(@Nullable Throwable buildFailure) { public Throwable getFailure() { return buildFailure; } + + @Override + public Collection getProblems() { + return DefaultGradleEnterprisePluginAdapter.this.getProblems(buildFailure); + } }); } } + private @Nonnull Collection getProblems(@Nullable Throwable buildFailure) { + ImmutableList.Builder builder = ImmutableList.builder(); + while(buildFailure != null) { + Collection problems = problemsMapping.get(buildFailure); + builder.addAll(problems); + buildFailure = buildFailure.getCause(); + } + return builder.build(); + } + private void createPluginService() { pluginService = pluginServiceFactory.create(config, requiredServices, buildState); pluginServiceRef.set(pluginService); buildOperationNotificationListenerRegistrar.register(pluginService.getBuildOperationNotificationListener()); } - } diff --git a/platforms/enterprise/enterprise/src/main/java/org/gradle/internal/enterprise/impl/DefaultGradleEnterprisePluginAdapterFactory.java b/platforms/enterprise/enterprise/src/main/java/org/gradle/internal/enterprise/impl/DefaultGradleEnterprisePluginAdapterFactory.java index f1caa8f4c7eb..b844bcc7ea48 100644 --- a/platforms/enterprise/enterprise/src/main/java/org/gradle/internal/enterprise/impl/DefaultGradleEnterprisePluginAdapterFactory.java +++ b/platforms/enterprise/enterprise/src/main/java/org/gradle/internal/enterprise/impl/DefaultGradleEnterprisePluginAdapterFactory.java @@ -16,6 +16,9 @@ package org.gradle.internal.enterprise.impl; +import com.google.common.collect.Multimap; +import org.gradle.api.problems.internal.InternalProblems; +import org.gradle.api.problems.internal.Problem; import org.gradle.internal.enterprise.GradleEnterprisePluginBuildState; import org.gradle.internal.enterprise.GradleEnterprisePluginConfig; import org.gradle.internal.enterprise.GradleEnterprisePluginServiceFactory; @@ -31,19 +34,22 @@ public class DefaultGradleEnterprisePluginAdapterFactory { private final GradleEnterprisePluginBuildState buildState; private final DefaultGradleEnterprisePluginServiceRef pluginServiceRef; private final BuildOperationNotificationListenerRegistrar buildOperationNotificationListenerRegistrar; + private final Multimap problemsMapping; public DefaultGradleEnterprisePluginAdapterFactory( GradleEnterprisePluginConfig config, DefaultGradleEnterprisePluginRequiredServices requiredServices, GradleEnterprisePluginBuildState buildState, DefaultGradleEnterprisePluginServiceRef pluginServiceRef, - BuildOperationNotificationListenerRegistrar buildOperationNotificationListenerRegistrar + BuildOperationNotificationListenerRegistrar buildOperationNotificationListenerRegistrar, + InternalProblems problems ) { this.config = config; this.requiredServices = requiredServices; this.buildState = buildState; this.pluginServiceRef = pluginServiceRef; this.buildOperationNotificationListenerRegistrar = buildOperationNotificationListenerRegistrar; + this.problemsMapping = problems.getProblems(); } public DefaultGradleEnterprisePluginAdapter create(GradleEnterprisePluginServiceFactory pluginServiceFactory) { @@ -53,7 +59,8 @@ public DefaultGradleEnterprisePluginAdapter create(GradleEnterprisePluginService requiredServices, buildState, pluginServiceRef, - buildOperationNotificationListenerRegistrar + buildOperationNotificationListenerRegistrar, + problemsMapping ); } } diff --git a/platforms/extensibility/plugin-development/src/test/groovy/org/gradle/plugin/devel/tasks/internal/ValidationProblemSerializationTest.groovy b/platforms/extensibility/plugin-development/src/test/groovy/org/gradle/plugin/devel/tasks/internal/ValidationProblemSerializationTest.groovy index 8b06c4dd4db7..0c0162b5cd24 100644 --- a/platforms/extensibility/plugin-development/src/test/groovy/org/gradle/plugin/devel/tasks/internal/ValidationProblemSerializationTest.groovy +++ b/platforms/extensibility/plugin-development/src/test/groovy/org/gradle/plugin/devel/tasks/internal/ValidationProblemSerializationTest.groovy @@ -16,6 +16,7 @@ package org.gradle.plugin.devel.tasks.internal +import com.google.common.collect.HashMultimap import com.google.gson.Gson import org.gradle.api.problems.Severity import org.gradle.api.problems.internal.DefaultProblemReporter @@ -28,7 +29,7 @@ import spock.lang.Specification class ValidationProblemSerializationTest extends Specification { Gson gson = ValidationProblemSerialization.createGsonBuilder().create() - InternalProblemReporter problemReporter = new DefaultProblemReporter(Stub(ProblemEmitter), [], org.gradle.internal.operations.CurrentBuildOperationRef.instance()) + InternalProblemReporter problemReporter = new DefaultProblemReporter(Stub(ProblemEmitter), [], org.gradle.internal.operations.CurrentBuildOperationRef.instance(), HashMultimap.create()) def "can serialize and deserialize a validation problem"() { given: diff --git a/platforms/ide/problems-api/build.gradle.kts b/platforms/ide/problems-api/build.gradle.kts index 7eb2ad3a4566..b0276534156d 100644 --- a/platforms/ide/problems-api/build.gradle.kts +++ b/platforms/ide/problems-api/build.gradle.kts @@ -45,4 +45,5 @@ dependencies { testFixturesImplementation(project(":enterprise-operations")) testFixturesImplementation(project(":base-services")) + testFixturesImplementation(project(":internal-integ-testing")) } diff --git a/platforms/ide/problems-api/src/main/java/org/gradle/api/problems/internal/DefaultProblemReporter.java b/platforms/ide/problems-api/src/main/java/org/gradle/api/problems/internal/DefaultProblemReporter.java index 1285f0c5c561..61b577352ca3 100644 --- a/platforms/ide/problems-api/src/main/java/org/gradle/api/problems/internal/DefaultProblemReporter.java +++ b/platforms/ide/problems-api/src/main/java/org/gradle/api/problems/internal/DefaultProblemReporter.java @@ -16,6 +16,7 @@ package org.gradle.api.problems.internal; +import com.google.common.collect.Multimap; import org.gradle.api.Action; import org.gradle.api.problems.ProblemSpec; import org.gradle.internal.operations.CurrentBuildOperationRef; @@ -28,11 +29,18 @@ public class DefaultProblemReporter implements InternalProblemReporter { private final ProblemEmitter emitter; private final List transformers; private final CurrentBuildOperationRef currentBuildOperationRef; + private final Multimap problems; - public DefaultProblemReporter(ProblemEmitter emitter, List transformers, CurrentBuildOperationRef currentBuildOperationRef) { + public DefaultProblemReporter( + ProblemEmitter emitter, + List transformers, + CurrentBuildOperationRef currentBuildOperationRef, + Multimap problems + ) { this.emitter = emitter; this.transformers = transformers; this.currentBuildOperationRef = currentBuildOperationRef; + this.problems = problems; } @Override @@ -57,6 +65,7 @@ public RuntimeException throwing(Action spec) { public RuntimeException throwError(RuntimeException exception, Problem problem) { report(problem); + problems.put(exception, problem); throw exception; } diff --git a/platforms/ide/problems-api/src/main/java/org/gradle/api/problems/internal/DefaultProblems.java b/platforms/ide/problems-api/src/main/java/org/gradle/api/problems/internal/DefaultProblems.java index 23969d1c0e15..0fac4cb9e2b2 100644 --- a/platforms/ide/problems-api/src/main/java/org/gradle/api/problems/internal/DefaultProblems.java +++ b/platforms/ide/problems-api/src/main/java/org/gradle/api/problems/internal/DefaultProblems.java @@ -16,6 +16,9 @@ package org.gradle.api.problems.internal; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; +import com.google.common.collect.Multimaps; import org.gradle.api.problems.ProblemReporter; import org.gradle.internal.operations.CurrentBuildOperationRef; import org.gradle.internal.service.scopes.Scope; @@ -24,6 +27,8 @@ import java.util.Collections; import java.util.List; +import static org.gradle.api.problems.internal.DefaultProblemCategory.GRADLE_CORE_NAMESPACE; + @ServiceScope(Scope.BuildTree.class) public class DefaultProblems implements InternalProblems { @@ -31,6 +36,7 @@ public class DefaultProblems implements InternalProblems { private final ProblemEmitter emitter; private final List transformers; private final InternalProblemReporter internalReporter; + private final Multimap problems = Multimaps.synchronizedMultimap(HashMultimap.create()); public DefaultProblems(ProblemEmitter emitter, CurrentBuildOperationRef currentBuildOperationRef) { this(emitter, Collections.emptyList(), currentBuildOperationRef); @@ -43,23 +49,28 @@ public DefaultProblems(ProblemEmitter emitter, List transfor this.emitter = emitter; this.transformers = transformers; this.currentBuildOperationRef = currentBuildOperationRef; - internalReporter = createReporter(emitter, transformers); + internalReporter = createReporter(emitter, transformers, problems); } @Override public ProblemReporter forNamespace(String namespace) { - if (DefaultProblemCategory.GRADLE_CORE_NAMESPACE.equals(namespace)) { - throw new IllegalStateException("Cannot use " + DefaultProblemCategory.GRADLE_CORE_NAMESPACE + " namespace."); + if (GRADLE_CORE_NAMESPACE.equals(namespace)) { + throw new IllegalStateException("Cannot use " + GRADLE_CORE_NAMESPACE + " namespace. Reserved for internal use."); } - return createReporter(emitter, transformers); + return createReporter(emitter, transformers, problems); } - private DefaultProblemReporter createReporter(ProblemEmitter emitter, List transformers) { - return new DefaultProblemReporter(emitter, transformers, currentBuildOperationRef); + private DefaultProblemReporter createReporter(ProblemEmitter emitter, List transformers, Multimap problems) { + return new DefaultProblemReporter(emitter, transformers, currentBuildOperationRef, problems); } @Override public InternalProblemReporter getInternalReporter() { return internalReporter; } + + @Override + public Multimap getProblems() { + return problems; + } } diff --git a/platforms/ide/problems-api/src/main/java/org/gradle/api/problems/internal/InternalProblems.java b/platforms/ide/problems-api/src/main/java/org/gradle/api/problems/internal/InternalProblems.java index 4f1d1d5c4bce..159fd8868c3f 100644 --- a/platforms/ide/problems-api/src/main/java/org/gradle/api/problems/internal/InternalProblems.java +++ b/platforms/ide/problems-api/src/main/java/org/gradle/api/problems/internal/InternalProblems.java @@ -16,6 +16,7 @@ package org.gradle.api.problems.internal; +import com.google.common.collect.Multimap; import org.gradle.api.problems.Problems; public interface InternalProblems extends Problems { @@ -27,4 +28,6 @@ public interface InternalProblems extends Problems { * @return The reporter. */ InternalProblemReporter getInternalReporter(); + + Multimap getProblems(); } diff --git a/platforms/ide/problems-api/src/test/groovy/org/gradle/api/problems/internal/DefaultProblemTest.groovy b/platforms/ide/problems-api/src/test/groovy/org/gradle/api/problems/internal/DefaultProblemTest.groovy index 528669693159..098c4e661c88 100644 --- a/platforms/ide/problems-api/src/test/groovy/org/gradle/api/problems/internal/DefaultProblemTest.groovy +++ b/platforms/ide/problems-api/src/test/groovy/org/gradle/api/problems/internal/DefaultProblemTest.groovy @@ -16,6 +16,7 @@ package org.gradle.api.problems.internal +import com.google.common.collect.HashMultimap import org.gradle.api.problems.Severity import org.gradle.api.problems.SharedProblemGroup import org.gradle.internal.deprecation.Documentation @@ -70,7 +71,7 @@ class DefaultProblemTest extends Specification { def "unbound builder result with a change and check report"() { given: def emitter = Mock(ProblemEmitter) - def problemReporter = new DefaultProblemReporter(emitter, [], org.gradle.internal.operations.CurrentBuildOperationRef.instance()) + def problemReporter = new DefaultProblemReporter(emitter, [], org.gradle.internal.operations.CurrentBuildOperationRef.instance(), HashMultimap.create()) def problem = createTestProblem(Severity.WARNING, [:]) def builder = problem.toBuilder() def newProblem = builder diff --git a/platforms/ide/problems-api/src/testFixtures/groovy/org/gradle/api/problems/ReportingScript.groovy b/platforms/ide/problems-api/src/testFixtures/groovy/org/gradle/api/problems/ReportingScript.groovy index 4d1aa0f67a29..c31e64892d67 100644 --- a/platforms/ide/problems-api/src/testFixtures/groovy/org/gradle/api/problems/ReportingScript.groovy +++ b/platforms/ide/problems-api/src/testFixtures/groovy/org/gradle/api/problems/ReportingScript.groovy @@ -16,9 +16,11 @@ package org.gradle.api.problems +import org.gradle.integtests.fixtures.GroovyBuildScriptLanguage + class ReportingScript { - static String getProblemReportingScript(String taskActionMethodBody) { + static String getProblemReportingScript(@GroovyBuildScriptLanguage String taskActionMethodBody) { return """ import org.gradle.api.problems.Severity diff --git a/subprojects/core-api/build.gradle.kts b/subprojects/core-api/build.gradle.kts index 3da968b1e391..aca35a00ec01 100644 --- a/subprojects/core-api/build.gradle.kts +++ b/subprojects/core-api/build.gradle.kts @@ -31,6 +31,7 @@ dependencies { api(project(":resources")) api(project(":persistent-cache")) api(project(":declarative-dsl-api")) +// api(project(":problems-api")) api(libs.jsr305) api(libs.groovy) api(libs.groovyAnt) diff --git a/subprojects/core/src/main/java/org/gradle/internal/build/DefaultBuildLifecycleController.java b/subprojects/core/src/main/java/org/gradle/internal/build/DefaultBuildLifecycleController.java index b59f1910dd2e..8a8becd7d36a 100644 --- a/subprojects/core/src/main/java/org/gradle/internal/build/DefaultBuildLifecycleController.java +++ b/subprojects/core/src/main/java/org/gradle/internal/build/DefaultBuildLifecycleController.java @@ -16,6 +16,7 @@ package org.gradle.internal.build; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Multimap; import org.gradle.BuildListener; import org.gradle.BuildResult; import org.gradle.api.NonNullApi; @@ -26,6 +27,7 @@ import org.gradle.api.internal.project.HoldsProjectState; import org.gradle.api.internal.project.ProjectInternal; import org.gradle.api.internal.project.ProjectState; +import org.gradle.api.problems.internal.Problem; import org.gradle.api.specs.Spec; import org.gradle.execution.BuildWorkExecutor; import org.gradle.execution.EntryTaskSelector; @@ -66,7 +68,7 @@ private enum State implements StateTransitionController.State { Finished } - public static final ImmutableList CONFIGURATION_STATES = ImmutableList.of(State.Configure, State.TaskSchedule, State.ReadyToRun); + private static final ImmutableList CONFIGURATION_STATES = ImmutableList.of(State.Configure, State.TaskSchedule, State.ReadyToRun); private final ExceptionAnalyser exceptionAnalyser; private final BuildListener buildListener; @@ -76,6 +78,7 @@ private enum State implements StateTransitionController.State { private final BuildToolingModelControllerFactory toolingModelControllerFactory; private final BuildModelController modelController; private final StateTransitionController state; + private final Multimap problems; private final GradleInternal gradle; private boolean hasTasks; private boolean hasFiredBeforeModelDiscarded; @@ -89,7 +92,8 @@ public DefaultBuildLifecycleController( BuildWorkPreparer workPreparer, BuildWorkExecutor workExecutor, BuildToolingModelControllerFactory toolingModelControllerFactory, - StateTransitionControllerFactory controllerFactory + StateTransitionControllerFactory controllerFactory, + Multimap problems ) { this.gradle = gradle; this.modelController = buildModelController; @@ -100,6 +104,7 @@ public DefaultBuildLifecycleController( this.buildModelLifecycleListener = buildModelLifecycleListener; this.toolingModelControllerFactory = toolingModelControllerFactory; this.state = controllerFactory.newController(Describables.of("state of", targetBuild().getDisplayName()), State.Configure); + this.problems = problems; } @Override diff --git a/subprojects/core/src/main/java/org/gradle/internal/build/DefaultBuildLifecycleControllerFactory.java b/subprojects/core/src/main/java/org/gradle/internal/build/DefaultBuildLifecycleControllerFactory.java index 7cd93524d24b..dc0110e59d23 100644 --- a/subprojects/core/src/main/java/org/gradle/internal/build/DefaultBuildLifecycleControllerFactory.java +++ b/subprojects/core/src/main/java/org/gradle/internal/build/DefaultBuildLifecycleControllerFactory.java @@ -19,6 +19,7 @@ import org.gradle.StartParameter; import org.gradle.api.internal.BuildDefinition; import org.gradle.api.internal.GradleInternal; +import org.gradle.api.problems.internal.InternalProblems; import org.gradle.execution.BuildWorkExecutor; import org.gradle.initialization.exception.ExceptionAnalyser; import org.gradle.internal.deprecation.DeprecationLogger; @@ -63,6 +64,7 @@ public BuildLifecycleController newInstance(BuildDefinition buildDefinition, Bui ListenerManager listenerManager = buildScopeServices.get(ListenerManager.class); BuildModelController buildModelController = buildScopeServices.get(BuildModelController.class); + InternalProblems problems = buildScopeServices.get(InternalProblems.class); return new DefaultBuildLifecycleController( gradle, @@ -73,7 +75,8 @@ public BuildLifecycleController newInstance(BuildDefinition buildDefinition, Bui gradle.getServices().get(BuildWorkPreparer.class), gradle.getServices().get(BuildWorkExecutor.class), buildToolingModelControllerFactory, - stateTransitionControllerFactory + stateTransitionControllerFactory, + problems.getProblems() ); } diff --git a/subprojects/core/src/test/groovy/org/gradle/internal/build/DefaultBuildLifecycleControllerTest.groovy b/subprojects/core/src/test/groovy/org/gradle/internal/build/DefaultBuildLifecycleControllerTest.groovy index 4738873b5ee3..0e920a3d36cd 100644 --- a/subprojects/core/src/test/groovy/org/gradle/internal/build/DefaultBuildLifecycleControllerTest.groovy +++ b/subprojects/core/src/test/groovy/org/gradle/internal/build/DefaultBuildLifecycleControllerTest.groovy @@ -16,6 +16,7 @@ package org.gradle.internal.build +import com.google.common.collect.HashMultimap import org.gradle.BuildListener import org.gradle.api.internal.GradleInternal import org.gradle.api.internal.SettingsInternal @@ -64,7 +65,7 @@ class DefaultBuildLifecycleControllerTest extends Specification { DefaultBuildLifecycleController controller() { return new DefaultBuildLifecycleController(gradleMock, buildModelController, exceptionAnalyser, buildListener, - buildModelLifecycleListener, workPreparer, workExecutor, toolingControllerFactory, TestUtil.stateTransitionControllerFactory()) + buildModelLifecycleListener, workPreparer, workExecutor, toolingControllerFactory, TestUtil.stateTransitionControllerFactory(), HashMultimap.create()) } void testCanFinishBuildWhenNothingHasBeenDone() { diff --git a/testing/internal-integ-testing/src/main/groovy/org/gradle/test/fixtures/plugin/PluginBuilder.groovy b/testing/internal-integ-testing/src/main/groovy/org/gradle/test/fixtures/plugin/PluginBuilder.groovy index 6ebf6dab80e6..2859e7dbe897 100644 --- a/testing/internal-integ-testing/src/main/groovy/org/gradle/test/fixtures/plugin/PluginBuilder.groovy +++ b/testing/internal-integ-testing/src/main/groovy/org/gradle/test/fixtures/plugin/PluginBuilder.groovy @@ -21,6 +21,7 @@ import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.Task import org.gradle.api.initialization.Settings +import org.gradle.integtests.fixtures.GroovyBuildScriptLanguage import org.gradle.integtests.fixtures.executer.GradleExecuter import org.gradle.model.ModelMap import org.gradle.model.Mutate @@ -166,7 +167,7 @@ class PluginBuilder { """ } - PluginBuilder addPluginSource(String id, String className, String impl) { + PluginBuilder addPluginSource(String id, String className, @GroovyBuildScriptLanguage String impl) { addPluginId(id, className) groovy("${className}.groovy") << impl this