Skip to content

Commit

Permalink
Merge pull request #17583
Browse files Browse the repository at this point in the history
Fix tooling model caching when tooling API build action may run tasks
  • Loading branch information
bot-gradle committed Jul 1, 2021
2 parents b5cd669 + defe046 commit e277d9f
Show file tree
Hide file tree
Showing 20 changed files with 340 additions and 108 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,11 @@ public DefaultIncludedBuild(
this.model = instantiator.newInstance(IncludedBuildImpl.class, this);
}

@Override
protected BuildLifecycleController getBuildController() {
return buildLifecycleController;
}

@Override
protected ProjectStateRegistry getProjectStateRegistry() {
return projectStateRegistry;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,11 @@ class DefaultNestedBuild extends AbstractBuildState implements StandAloneNestedB
buildTreeLifecycleController = buildTreeLifecycleControllerFactory.createController(buildLifecycleController, workExecutor, finishExecutor);
}

@Override
protected BuildLifecycleController getBuildController() {
return buildLifecycleController;
}

@Override
protected ProjectStateRegistry getProjectStateRegistry() {
return projectStateRegistry;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,11 @@ class DefaultRootBuildState extends AbstractCompositeParticipantBuildState imple
this.buildTreeLifecycleController = buildTreeLifecycleControllerFactory.createController(buildLifecycleController, workExecutor, finishExecutor);
}

@Override
protected BuildLifecycleController getBuildController() {
return buildLifecycleController;
}

@Override
protected ProjectStateRegistry getProjectStateRegistry() {
return projectStateRegistry;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,11 @@ public void attach() {
buildServices.get(BuildStateRegistry.class).attachRootBuild(this);
}

@Override
protected BuildLifecycleController getBuildController() {
return buildLifecycleController;
}

@Override
protected ProjectStateRegistry getProjectStateRegistry() {
return buildServices.get(ProjectStateRegistry.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,14 +156,14 @@ class ConfigurationCacheToolingApiInvocationIntegrationTest extends AbstractConf
def model = fetchModel()

then:
model.message == "It works!"
model.message == "It works from project :"
outputContains("script log statement")

when:
def model2 = fetchModel()

then:
model2.message == "It works!"
model2.message == "It works from project :"
outputContains("script log statement")
}

Expand All @@ -176,14 +176,14 @@ class ConfigurationCacheToolingApiInvocationIntegrationTest extends AbstractConf
def model = runBuildAction(new SomeToolingModelBuildAction())

then:
model.message == "It works!"
model.message == "It works from project :"
outputContains("script log statement")

when:
def model2 = runBuildAction(new SomeToolingModelBuildAction())

then:
model2.message == "It works!"
model2.message == "It works from project :"
outputContains("script log statement")
}

Expand All @@ -196,16 +196,16 @@ class ConfigurationCacheToolingApiInvocationIntegrationTest extends AbstractConf
def model = runPhasedBuildAction(new SomeToolingModelBuildAction(), new SomeToolingModelBuildAction())

then:
model.left.message == "It works!"
model.right.message == "It works!"
model.left.message == "It works from project :"
model.right.message == "It works from project :"
outputContains("script log statement")

when:
def model2 = runPhasedBuildAction(new SomeToolingModelBuildAction(), new SomeToolingModelBuildAction())

then:
model2.left.message == "It works!"
model2.right.message == "It works!"
model2.left.message == "It works from project :"
model2.right.message == "It works from project :"
outputContains("script log statement")
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import org.gradle.integtests.fixtures.executer.OutputScrapingExecutionResult
import org.gradle.internal.Pair
import org.gradle.test.fixtures.file.TestFile
import org.gradle.tooling.BuildAction
import org.gradle.tooling.BuildActionExecuter
import org.gradle.tooling.provider.model.ToolingModelBuilder
import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry

Expand Down Expand Up @@ -71,7 +72,7 @@ trait ToolingApiSpec {
Object buildAll(String modelName, Project project) {
println("creating model for \$project")
$content
return new MyModel("It works!")
return new MyModel("It works from project \${project.path}")
}
}
""".stripIndent()
Expand Down Expand Up @@ -155,7 +156,7 @@ trait ToolingApiSpec {
return model
}

def <T, S> Pair<T, S> runPhasedBuildAction(BuildAction<T> projectsLoadedAction, BuildAction<S> modelAction) {
def <T, S> Pair<T, S> runPhasedBuildAction(BuildAction<T> projectsLoadedAction, BuildAction<S> modelAction, @DelegatesTo(BuildActionExecuter) Closure config = {}) {
def output = new ByteArrayOutputStream()
def error = new ByteArrayOutputStream()
def args = executer.allArgs
Expand All @@ -164,14 +165,17 @@ trait ToolingApiSpec {
T projectsLoadedModel = null
S buildModel = null
toolingApiExecutor.usingToolingConnection(testDirectory) { connection ->
connection.action()
def builder = connection.action()
.projectsLoaded(projectsLoadedAction, { Object model ->
projectsLoadedModel = model
})
.buildFinished(modelAction, { Object model ->
buildModel = model
})
.build()
config.delegate = builder
config.call()
builder
.addJvmArguments(executer.jvmArgs)
.withArguments(args)
.setStandardOutput(new TeeOutputStream(output, System.out))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,18 +22,18 @@
import org.gradle.tooling.model.gradle.BasicGradleProject;
import org.gradle.tooling.model.gradle.GradleBuild;

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.ArrayList;
import java.util.List;

public class FetchCustomModelForEachProject implements BuildAction<Map<String, SomeToolingModel>> {
public class FetchCustomModelForEachProject implements BuildAction<List<SomeToolingModel>> {
@Override
public Map<String, SomeToolingModel> execute(BuildController controller) {
Map<String, SomeToolingModel> result = new LinkedHashMap<>();
public List<SomeToolingModel> execute(BuildController controller) {
List<SomeToolingModel> result = new ArrayList<>();
GradleBuild buildModel = controller.getBuildModel();
for (BasicGradleProject project : buildModel.getProjects()) {
SomeToolingModel model = controller.findModel(project, SomeToolingModel.class);
if (model != null) {
result.put(project.getPath(), model);
result.add(model);
}
}
return result;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
/*
* Copyright 2021 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.gradle.configurationcache.isolated;

import org.gradle.configurationcache.fixtures.SomeToolingModel;
import org.gradle.tooling.BuildAction;
import org.gradle.tooling.BuildController;
import org.gradle.tooling.model.gradle.BasicGradleProject;
import org.gradle.tooling.model.gradle.GradleBuild;

import java.util.ArrayList;
import java.util.List;

public class FetchPartialCustomModelForEachProject implements BuildAction<List<String>> {
@Override
public List<String> execute(BuildController controller) {
List<String> result = new ArrayList<>();
GradleBuild buildModel = controller.getBuildModel();
for (BasicGradleProject project : buildModel.getProjects()) {
SomeToolingModel model = controller.findModel(project, SomeToolingModel.class);
if (model != null) {
result.add(model.getMessage());
}
}
return result;
}
}

0 comments on commit e277d9f

Please sign in to comment.