Skip to content

Commit

Permalink
Bridge tasks into software mode lazily
Browse files Browse the repository at this point in the history
Only initialize the software model bridging if the user
either uses the `model {}` block or explicitly applies
a rule-based plugin.

Placeholder tasks are now implemented in the task container
directly instead of using the software model. They are also
deprecated as they add a lot of complexity for no gain beyond
what `createLater {}` already offers.
  • Loading branch information
oehme committed May 2, 2018
1 parent 42ab523 commit 321056f
Show file tree
Hide file tree
Showing 30 changed files with 268 additions and 185 deletions.
Expand Up @@ -83,7 +83,7 @@ class WrapperPluginAutoApplyActionIntegTest extends AbstractIntegrationSpec {
wrapper.generated()
}

def "manually declared wrapper task is preferred"() {
def "manually declared wrapper task is preferred, but deprecated"() {
when:
buildFile << """
Expand All @@ -93,9 +93,12 @@ class WrapperPluginAutoApplyActionIntegTest extends AbstractIntegrationSpec {
}
}
"""
executer.expectDeprecationWarning()
run 'wrapper'
then:
output.contains("running custom wrapper task")

outputContains("running custom wrapper task")
outputContains("Creating a custom task named 'wrapper' has been deprecated and is scheduled to be removed in Gradle 5.0. You can configure the existing task using the 'wrapper { }' syntax or create your custom task under a different name.'")
wrapper.notGenerated()
}
}
Expand Up @@ -18,13 +18,14 @@

import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.internal.project.ProjectInternal;
import org.gradle.buildinit.tasks.internal.TaskConfiguration;

/**
* The build init plugin.
*/
public class BuildInitPlugin implements Plugin<Project> {
public void apply(final Project project) {
TaskConfiguration.createInitTask(project);
TaskConfiguration.addInitPlaceholder((ProjectInternal) project);
}
}
Expand Up @@ -18,13 +18,14 @@

import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.internal.project.ProjectInternal;
import org.gradle.buildinit.tasks.internal.TaskConfiguration;

/**
* The wrapper plugin.
*/
public class WrapperPlugin implements Plugin<Project> {
public void apply(Project project) {
TaskConfiguration.createWrapperTask(project);
TaskConfiguration.addWrapperPlaceholder((ProjectInternal) project);
}
}
Expand Up @@ -92,17 +92,9 @@ public static void configureWrapper(Wrapper wrapper) {
wrapper.setDescription("Generates Gradle wrapper files.");
}

public static void createInitTask(Project project) {
configureInit(project.getTasks().create(INIT_BUILD_TASK_NAME, InitBuild.class));
}

public static void createWrapperTask(Project project) {
configureWrapper(project.getTasks().create("wrapper", Wrapper.class));
}

public static void addInitPlaceholder(final ProjectInternal projectInternal) {
if (projectInternal.getParent() == null) {
projectInternal.getTasks().addPlaceholderAction("init", InitBuild.class, new InitBuildAction());
projectInternal.getTasks().addPlaceholderAction(INIT_BUILD_TASK_NAME, InitBuild.class, new InitBuildAction());
}
}

Expand Down
Expand Up @@ -68,4 +68,4 @@ class BuildInitAutoApplyActionSpec extends Specification {
void noChildprojects() {
projectInternal.subprojects >> []
}
}
}
Expand Up @@ -120,14 +120,14 @@ public Iterator<T> iterator() {
return iteratorNoFlush();
}

protected Iterator<T> iteratorNoFlush() {
Iterator<T> iteratorNoFlush() {
if (store.constantTimeIsEmpty()) {
return Iterators.emptyIterator();
}
return new IteratorImpl(store.iterator());
}

protected void flushPending() {
private void flushPending() {
if (pending != null) {
for (ProviderInternal<? extends T> provider : pending) {
doAdd(provider.get());
Expand Down
Expand Up @@ -137,7 +137,7 @@ public void addLater(final Provider<? extends T> provider) {
}
final Named named = (Named) provider;
pending.put(named.getName(), provider);
whenKnown.execute(new ProviderBackedElementInfo<T>(named.getName(), provider));
deferredElementKnown(named.getName(), provider);
}
}

Expand All @@ -150,11 +150,15 @@ public void whenElementKnown(Action<? super ElementInfo<T>> action) {
}
if (pending != null) {
for (Map.Entry<String, Provider<? extends T>> entry : pending.entrySet()) {
whenKnown.execute(new ProviderBackedElementInfo<T>(entry.getKey(), entry.getValue()));
deferredElementKnown(entry.getKey(), entry.getValue());
}
}
}

protected final void deferredElementKnown(String name, Provider<? extends T> provider) {
whenKnown.execute(new ProviderBackedElementInfo<T>(name, provider));
}

@Override
protected void didAdd(T toAdd) {
index.put(namer.determineName(toAdd), toAdd);
Expand Down
Expand Up @@ -17,12 +17,12 @@

import org.gradle.BuildListener;
import org.gradle.api.ProjectEvaluationListener;
import org.gradle.api.initialization.IncludedBuild;
import org.gradle.api.internal.initialization.ClassLoaderScope;
import org.gradle.api.internal.plugins.PluginAwareInternal;
import org.gradle.api.internal.project.ProjectInternal;
import org.gradle.api.invocation.Gradle;
import org.gradle.execution.TaskGraphExecuter;
import org.gradle.api.initialization.IncludedBuild;
import org.gradle.internal.operations.BuildOperationRef;
import org.gradle.internal.scan.UsedByScanPlugin;
import org.gradle.internal.service.ServiceRegistry;
Expand Down
Expand Up @@ -17,28 +17,28 @@
package org.gradle.api.internal.plugins;

import org.gradle.api.Plugin;
import org.gradle.api.internal.project.ProjectInternal;
import org.gradle.configuration.ConfigurationTargetIdentifier;
import org.gradle.model.RuleSource;
import org.gradle.model.internal.inspect.ExtractedRuleSource;
import org.gradle.model.internal.inspect.ModelRuleExtractor;
import org.gradle.model.internal.inspect.ModelRuleSourceDetector;
import org.gradle.model.internal.registry.ModelRegistry;
import org.gradle.model.internal.registry.ModelRegistryScope;

import javax.annotation.Nullable;

public class RuleBasedPluginTarget<T extends ModelRegistryScope & PluginAwareInternal> implements PluginTarget {
public class RuleBasedPluginTarget implements PluginTarget {

private final T target;
private final ProjectInternal target;
private final PluginTarget imperativeTarget;
private final ModelRuleExtractor ruleInspector;
private final ModelRuleSourceDetector ruleDetector;

public RuleBasedPluginTarget(T target, ModelRuleExtractor ruleInspector, ModelRuleSourceDetector ruleDetector) {
public RuleBasedPluginTarget(ProjectInternal target, ModelRuleExtractor ruleInspector, ModelRuleSourceDetector ruleDetector) {
this.target = target;
this.ruleInspector = ruleInspector;
this.ruleDetector = ruleDetector;
this.imperativeTarget = new ImperativeOnlyPluginTarget<T>(target);
this.imperativeTarget = new ImperativeOnlyPluginTarget<ProjectInternal>(target);
}

@Override
Expand All @@ -51,6 +51,7 @@ public void applyImperative(@Nullable String pluginId, Plugin<?> plugin) {
}

public void applyRules(@Nullable String pluginId, Class<?> clazz) {
target.prepareForRuleBasedPlugins();
ModelRegistry modelRegistry = target.getModelRegistry();
Iterable<Class<? extends RuleSource>> declaredSources = ruleDetector.getDeclaredSources(clazz);
for (Class<? extends RuleSource> ruleSource : declaredSources) {
Expand Down
Expand Up @@ -87,6 +87,7 @@
import org.gradle.internal.logging.StandardOutputCapture;
import org.gradle.internal.metaobject.BeanDynamicObject;
import org.gradle.internal.metaobject.DynamicObject;
import org.gradle.internal.model.RuleBasedPluginListener;
import org.gradle.internal.reflect.Instantiator;
import org.gradle.internal.resource.TextResourceLoader;
import org.gradle.internal.service.ServiceRegistry;
Expand Down Expand Up @@ -192,12 +193,15 @@ public class DefaultProject extends AbstractPluginAware implements ProjectIntern

private ListenerBroadcast<ProjectEvaluationListener> evaluationListener = new ListenerBroadcast<ProjectEvaluationListener>(ProjectEvaluationListener.class);

private final ListenerBroadcast<RuleBasedPluginListener> ruleBasedPluginListenerBroadcast = new ListenerBroadcast<RuleBasedPluginListener>(RuleBasedPluginListener.class);

private ExtensibleDynamicObject extensibleDynamicObject;

private String description;

private final Path path;
private Path identityPath;
private boolean preparedForRuleBasedPlugins;

public DefaultProject(String name,
@Nullable ProjectInternal parent,
Expand Down Expand Up @@ -1305,6 +1309,7 @@ public ExtensionContainerInternal getExtensions() {

// Not part of the public API
public void model(Closure<?> modelRules) {
prepareForRuleBasedPlugins();
ModelRegistry modelRegistry = getModelRegistry();
if (TransformedModelDslBacking.isTransformedBlock(modelRules)) {
ClosureBackedAction.execute(new TransformedModelDslBacking(modelRegistry, this.getRootProject().getFileResolver()), modelRules);
Expand Down Expand Up @@ -1334,6 +1339,24 @@ public void fireDeferredConfiguration() {
getDeferredProjectConfiguration().fire();
}


@Override
public void addRuleBasedPluginListener(RuleBasedPluginListener listener) {
if (preparedForRuleBasedPlugins) {
listener.prepareForRuleBasedPlugins(this);
} else {
ruleBasedPluginListenerBroadcast.add(listener);
}
}

@Override
public void prepareForRuleBasedPlugins() {
if (!preparedForRuleBasedPlugins) {
preparedForRuleBasedPlugins = true;
ruleBasedPluginListenerBroadcast.getSource().prepareForRuleBasedPlugins(this);
}
}

@Inject
@Override
public InputNormalizationHandler getNormalization() {
Expand Down
Expand Up @@ -34,6 +34,7 @@
import org.gradle.groovy.scripts.ScriptSource;
import org.gradle.internal.logging.StandardOutputCapture;
import org.gradle.internal.metaobject.DynamicObject;
import org.gradle.internal.model.RuleBasedPluginListener;
import org.gradle.internal.scan.UsedByScanPlugin;
import org.gradle.internal.service.ServiceRegistry;
import org.gradle.internal.service.scopes.ServiceRegistryFactory;
Expand Down Expand Up @@ -78,6 +79,10 @@ public interface ProjectInternal extends Project, ProjectIdentifier, FileOperati

ProjectEvaluationListener getProjectEvaluationBroadcaster();

void addRuleBasedPluginListener(RuleBasedPluginListener listener);

void prepareForRuleBasedPlugins();

FileResolver getFileResolver();

@UsedByScanPlugin
Expand Down

0 comments on commit 321056f

Please sign in to comment.