From e6f7fcff8f1ebcaa4741893f9cb5b3ab00bdd20e Mon Sep 17 00:00:00 2001 From: Bradley Smith Date: Wed, 26 Jun 2019 16:59:44 +0300 Subject: [PATCH] Don't ignore exceptions that occur after models are fetched. This change fixes an issue where exceptions that occured after the models have been fetched (during task running) were not handed back to the GradleProjectResolverExtensions. In this change we pass all GradleConnectionExceptions that occurs during the Gradle build to the resolvers via the buildFinished(Exception) callback. This will be a super set of the exceptions that can be thrown during fetching the modesl (as exceptions from tasks are not included there). Note: For Gradle versions <1.8 we don't pass the exception to the buildFinished callback, since there it is not possible to run tasks via the tooling API in these versions this is safe. Signed-off-by: Nikita Skvortsov GitOrigin-RevId: ae7c6db0a985e438093ac860bd32b8c3c546e3e8 --- .../gradle/service/project/BuildActionRunner.kt | 16 +++++++--------- .../service/project/GradleProjectResolver.java | 4 ++-- .../project/GradleProjectResolverExtension.java | 5 ++++- .../importing/GradleActionWithImportTest.kt | 3 ++- 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/BuildActionRunner.kt b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/BuildActionRunner.kt index e65bc0654bba..35ee267c0792 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/BuildActionRunner.kt +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/BuildActionRunner.kt @@ -1,11 +1,7 @@ // Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package org.jetbrains.plugins.gradle.service.project -import org.gradle.tooling.BuildActionExecuter -import org.gradle.tooling.GradleConnectionException -import org.gradle.tooling.IntermediateResultHandler -import org.gradle.tooling.ResultHandler -import org.gradle.tooling.UnsupportedVersionException +import org.gradle.tooling.* import org.gradle.tooling.model.idea.BasicIdeaProject import org.gradle.tooling.model.idea.IdeaProject import org.jetbrains.plugins.gradle.model.ProjectImportAction @@ -14,6 +10,7 @@ import org.jetbrains.plugins.gradle.service.execution.GradleExecutionHelper import org.jetbrains.plugins.gradle.settings.GradleExecutionSettings import java.util.concurrent.ArrayBlockingQueue import java.util.concurrent.TimeUnit +import java.util.function.Consumer /** * This class handles setting up and running the [BuildActionExecuter] it deals with calling the correct APIs based on the version of @@ -63,7 +60,7 @@ class BuildActionRunner( * [settings]. */ fun fetchModels( - buildFinishedCallBack: Runnable + buildFinishedCallBack: Consumer ): AllModels { // First try with the phased build executor createPhasedExecuter().run(BuildActionResultHandler(buildFinishedCallBack)) @@ -99,7 +96,7 @@ class BuildActionRunner( resolverCtx.connection, resolverCtx.listener) - buildFinishedCallBack.run() + buildFinishedCallBack.accept(null) return ProjectImportAction.AllModels(modelBuilder.get()) } @@ -138,10 +135,11 @@ class BuildActionRunner( resolverCtx.listener, resolverCtx.connection) private inner class BuildActionResultHandler( - val buildFinishedCallBack: Runnable + val buildFinishedCallBack: Consumer ): ResultHandler { override fun onFailure(connectionException: GradleConnectionException?) { resultQueue.add(connectionException) + buildFinishedCallBack.accept(connectionException) } /** @@ -153,7 +151,7 @@ class BuildActionRunner( if (allModels != null) { resultQueue.add(allModels) } - buildFinishedCallBack.run() + buildFinishedCallBack.accept(null) } } } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolver.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolver.java index 7001e9b8bde9..f6efa44e5f14 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolver.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolver.java @@ -260,9 +260,9 @@ public class GradleProjectResolver implements ExternalSystemProjectResolver { + allModels = buildActionRunner.fetchModels((exception) -> { for (GradleProjectResolverExtension resolver = tracedResolverChain; resolver != null; resolver = resolver.getNext()) { - resolver.buildFinished(); + resolver.buildFinished(exception); } }); performanceTrace.addTrace(allModels.getPerformanceTrace()); diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolverExtension.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolverExtension.java index 74c8bff05e9e..a96267f59cfc 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolverExtension.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolverExtension.java @@ -25,6 +25,7 @@ import com.intellij.openapi.externalSystem.model.task.TaskData; import com.intellij.openapi.externalSystem.service.ParametersEnhancer; import com.intellij.openapi.util.Pair; import com.intellij.util.Consumer; +import org.gradle.tooling.GradleConnectionException; import org.gradle.tooling.model.build.BuildEnvironment; import org.gradle.tooling.model.idea.IdeaModule; import org.gradle.tooling.model.idea.IdeaProject; @@ -150,10 +151,12 @@ public interface GradleProjectResolverExtension extends ParametersEnhancer { * Called once Gradle has finished executing everything, including any tasks that might need to be run. The models are obtained * separately and in some cases before this method is called. * + * @param exception the exception thrown by Gradle, if everything completes successfully then this will be null. + * * Note: This method is called from a Gradle connection thread, within the {@link org.gradle.tooling.ResultHandler} passed to the * tooling api. */ - default void buildFinished() { } + default void buildFinished(@Nullable GradleConnectionException exception) { } /** * Allows extension to contribute to init script diff --git a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleActionWithImportTest.kt b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleActionWithImportTest.kt index 63bef9acdd31..77fdfdcd7799 100644 --- a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleActionWithImportTest.kt +++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleActionWithImportTest.kt @@ -4,6 +4,7 @@ package org.jetbrains.plugins.gradle.importing import com.intellij.openapi.extensions.Extensions import org.assertj.core.api.Assertions.assertThat import org.gradle.tooling.BuildController +import org.gradle.tooling.GradleConnectionException import org.gradle.tooling.model.idea.IdeaModule import org.gradle.tooling.model.idea.IdeaProject import org.jetbrains.plugins.gradle.model.ProjectImportExtraModelProvider @@ -102,7 +103,7 @@ class TestProjectResolverExtension : AbstractProjectResolverExtension() { } - override fun buildFinished() { + override fun buildFinished(exception: GradleConnectionException?) { lastBuildFinished.complete(true) }