Skip to content

Commit

Permalink
Fix #23096 on release7x
Browse files Browse the repository at this point in the history
  • Loading branch information
jvandort committed Dec 19, 2022
1 parent d1a0b6e commit 85314da
Show file tree
Hide file tree
Showing 13 changed files with 236 additions and 64 deletions.
1 change: 1 addition & 0 deletions subprojects/base-services/build.gradle.kts
Expand Up @@ -24,6 +24,7 @@ tasks.named<JavaCompile>("jmhCompileGeneratedClasses") {
moduleIdentity.createBuildReceipt()

dependencies {
api(libs.jetbrainsAnnotations)
api(project(":base-annotations"))
api(project(":worker-services"))
api(project(":hashing"))
Expand Down
Expand Up @@ -24,6 +24,7 @@
import org.gradle.internal.Factory;
import org.gradle.internal.IoActions;
import org.gradle.internal.UncheckedException;
import org.jetbrains.annotations.Contract;

import javax.annotation.Nullable;
import java.io.File;
Expand Down Expand Up @@ -157,6 +158,7 @@ public static boolean isTrue(@Nullable Object object) {
* would trigger early configuration.
*/
@Nullable
@Contract("!null, _ -> param1; null, !null -> param2; null, null -> null")
public static <T> T elvis(@Nullable T object, @Nullable T defaultValue) {
return isTrue(object) ? object : defaultValue;
}
Expand Down
Expand Up @@ -26,4 +26,10 @@
public interface MinimalExternalModuleDependency extends ExternalModuleDependency {
ModuleIdentifier getModule();
VersionConstraint getVersionConstraint();

/**
* {@inheritDoc}
*/
@Override
MinimalExternalModuleDependency copy();
}
Expand Up @@ -47,4 +47,5 @@ enum ClassPathNotation {
DependencyConstraint createDependencyConstraint(Object dependencyNotation);
ClientModule createModule(Object dependencyNotation, Closure configureClosure);
ProjectDependency createProjectDependencyFromMap(ProjectFinder projectFinder, Map<? extends String, ? extends Object> map);
void injectServices(Dependency dependency);
}
Expand Up @@ -209,7 +209,7 @@ task checkArtifacts {
}
task jar {}
}
project(':b') {
dependencies {
compile project(':a')
Expand All @@ -218,7 +218,7 @@ task checkArtifacts {
task checkArtifacts {
inputs.files configurations.compile
doLast {
configurations.compile.resolvedConfiguration.resolvedArtifacts.forEach { println it }
configurations.compile.resolvedConfiguration.resolvedArtifacts.forEach { println it }
}
}
}
Expand Down Expand Up @@ -247,7 +247,7 @@ task checkArtifacts {
}
task jar {}
}
project(':b') {
dependencies {
compile project(':a')
Expand All @@ -256,7 +256,7 @@ task checkArtifacts {
task checkArtifacts {
inputs.files configurations.compile
doLast {
assert configurations.compile.resolvedConfiguration.resolvedArtifacts.each { println it }
assert configurations.compile.resolvedConfiguration.resolvedArtifacts.each { println it }
}
}
}
Expand Down Expand Up @@ -289,7 +289,7 @@ task checkArtifacts {
}
task classes {}
}
project(':b') {
dependencies {
compile project(':a')
Expand All @@ -298,7 +298,7 @@ task checkArtifacts {
task checkArtifacts {
inputs.files configurations.compile
doLast {
assert configurations.compile.resolvedConfiguration.resolvedArtifacts.each { println it }
assert configurations.compile.resolvedConfiguration.resolvedArtifacts.each { println it }
}
}
}
Expand Down Expand Up @@ -506,4 +506,52 @@ task checkArtifacts {
result.assertTasksExecutedInOrder(":a:checkArtifacts", ":a:jar", ":b:checkArtifacts")
}

def 'artifacts are copied when declaring dependency on existing version catalog dependency with artifact'() {
given:
buildFile << """
configurations {
implementation
destination1
destination2
}
dependencies {
implementation(libs.test) {
artifact {
classifier = "alternative"
}
}
}
task copyAndPrintDependencies {
doLast {
configurations.implementation.dependencies.each {
project.dependencies.add("destination1", it)
configurations.destination2.dependencies.add(it)
}
configurations.implementation.dependencies.each {
println("implementation " + it + " " + it.artifacts*.classifier)
}
configurations.destination1.dependencies.each {
println("destination1 " + it + " " + it.artifacts*.classifier)
}
configurations.destination2.dependencies.each {
println("destination2 " + it + " " + it.artifacts*.classifier)
}
}
}
"""
file("gradle/libs.versions.toml") << """[libraries]
test = { module = 'org:test', version = '1.0' }
"""

when:
succeeds "copyAndPrintDependencies"

then:
outputContains("""implementation org:test:1.0 [alternative]
destination1 org:test:1.0 [alternative]
destination2 org:test:1.0 [alternative]""")
}

}
Expand Up @@ -75,14 +75,15 @@ public Dependency createDependency(Object dependencyNotation) {
Dependency dependency;
if (dependencyNotation instanceof Dependency && !(dependencyNotation instanceof MinimalExternalModuleDependency)) {
dependency = (Dependency) dependencyNotation;
injectServices(dependency);
} else {
dependency = dependencyNotationParser.getNotationParser().parseNotation(dependencyNotation);
}
injectServices(dependency);
return dependency;
}

private void injectServices(Dependency dependency) {
@Override
public void injectServices(Dependency dependency) {
if (dependency instanceof AbstractModuleDependency) {
AbstractModuleDependency moduleDependency = (AbstractModuleDependency) dependency;
moduleDependency.setAttributesFactory(attributesFactory);
Expand Down
Expand Up @@ -36,7 +36,7 @@ public DefaultExternalModuleDependency(ModuleIdentifier id, MutableVersionConstr
}

@Override
public DefaultExternalModuleDependency copy() {
public ExternalModuleDependency copy() {
DefaultExternalModuleDependency copiedModuleDependency = new DefaultExternalModuleDependency(getGroup(), getName(), getVersion(), getTargetConfiguration());
copyTo(copiedModuleDependency);
return copiedModuleDependency;
Expand Down
Expand Up @@ -15,13 +15,12 @@
*/
package org.gradle.api.internal.artifacts.dependencies;

import org.gradle.api.artifacts.MinimalExternalModuleDependency;
import org.gradle.api.artifacts.ModuleIdentifier;
import org.gradle.api.artifacts.MutableVersionConstraint;

import java.io.Serializable;

public class DefaultMinimalDependency extends DefaultExternalModuleDependency implements MinimalExternalModuleDependency, Serializable {
public class DefaultMinimalDependency extends DefaultExternalModuleDependency implements MinimalExternalModuleDependencyInternal, Serializable {
public DefaultMinimalDependency(ModuleIdentifier module, MutableVersionConstraint versionConstraint) {
super(module, versionConstraint);
}
Expand All @@ -41,6 +40,11 @@ protected void validateMutation(Object currentValue, Object newValue) {
validateMutation();
}

@Override
public void copyTo(AbstractExternalModuleDependency target) {
super.copyTo(target);
}

// Intentionally changes to the mutable version.
@Override
public DefaultMutableMinimalDependency copy() {
Expand Down
Expand Up @@ -18,38 +18,96 @@
import org.gradle.api.Action;
import org.gradle.api.artifacts.MinimalExternalModuleDependency;
import org.gradle.api.artifacts.ModuleDependencyCapabilitiesHandler;
import org.gradle.api.artifacts.ModuleIdentifier;
import org.gradle.api.artifacts.MutableVersionConstraint;
import org.gradle.api.attributes.AttributeContainer;
import org.gradle.api.internal.artifacts.dsl.dependencies.ModuleFactoryHelper;
import org.gradle.internal.Actions;
import org.gradle.util.internal.GUtil;

import javax.annotation.Nullable;

public class DefaultMinimalDependencyVariant extends DefaultExternalModuleDependency implements MinimalExternalModuleDependency, DependencyVariant {
private final MinimalExternalModuleDependency delegate;
private final Action<? super AttributeContainer> attributesMutator;
private final Action<? super ModuleDependencyCapabilitiesHandler> capabilitiesMutator;
private final String classifier;
private final String artifactType;

public DefaultMinimalDependencyVariant(MinimalExternalModuleDependency delegate,
@Nullable Action<? super AttributeContainer> attributesMutator,
@Nullable Action<? super ModuleDependencyCapabilitiesHandler> capabilitiesMutator,
@Nullable String classifier,
@Nullable String artifactType) {
super(delegate.getModule(), new DefaultMutableVersionConstraint(delegate.getVersionConstraint()));
this.delegate = delegate;
boolean delegateIsVariant = delegate instanceof DefaultMinimalDependencyVariant;
this.attributesMutator = delegateIsVariant ? Actions.composite(((DefaultMinimalDependencyVariant) delegate).attributesMutator, attributesMutator == null ? Actions.doNothing() : attributesMutator) : attributesMutator;
this.capabilitiesMutator = delegateIsVariant ? Actions.composite(((DefaultMinimalDependencyVariant) delegate).capabilitiesMutator, capabilitiesMutator == null ? Actions.doNothing() : capabilitiesMutator) : capabilitiesMutator;
if (classifier == null && delegateIsVariant) {
classifier = ((DefaultMinimalDependencyVariant) delegate).getClassifier();
}
if (artifactType == null && delegateIsVariant) {
artifactType = ((DefaultMinimalDependencyVariant) delegate).getArtifactType();
public class DefaultMinimalDependencyVariant extends DefaultExternalModuleDependency implements MinimalExternalModuleDependencyInternal, DependencyVariant {
private Action<? super AttributeContainer> attributesMutator;
private Action<? super ModuleDependencyCapabilitiesHandler> capabilitiesMutator;
private String classifier;
private String artifactType;

public static DefaultMinimalDependencyVariant create(
MinimalExternalModuleDependency delegate,
@Nullable Action<? super AttributeContainer> attributesMutator,
@Nullable Action<? super ModuleDependencyCapabilitiesHandler> capabilitiesMutator,
@Nullable String classifier,
@Nullable String artifactType
) {
attributesMutator = GUtil.elvis(attributesMutator, Actions.doNothing());
capabilitiesMutator = GUtil.elvis(capabilitiesMutator, Actions.doNothing());

if (delegate instanceof DefaultMinimalDependencyVariant) {
DefaultMinimalDependencyVariant defaultDelegate = (DefaultMinimalDependencyVariant) delegate;
return new DefaultMinimalDependencyVariant(
delegate.getModule(),
new DefaultMutableVersionConstraint(delegate.getVersionConstraint()),
Actions.composite(defaultDelegate.attributesMutator, attributesMutator),
Actions.composite(defaultDelegate.capabilitiesMutator, capabilitiesMutator),
classifier == null ? defaultDelegate.getClassifier() : classifier,
artifactType == null ? defaultDelegate.getArtifactType() : artifactType
);
} else {
return new DefaultMinimalDependencyVariant(
delegate.getModule(),
new DefaultMutableVersionConstraint(delegate.getVersionConstraint()),
attributesMutator,
capabilitiesMutator,
classifier,
artifactType
);
}
}

private DefaultMinimalDependencyVariant(
ModuleIdentifier id,
MutableVersionConstraint versionConstraint,
Action<? super AttributeContainer> attributesMutator,
Action<? super ModuleDependencyCapabilitiesHandler> capabilitiesMutator,
@Nullable String classifier,
@Nullable String artifactType
) {
super(id, versionConstraint);
this.attributesMutator = attributesMutator;
this.capabilitiesMutator = capabilitiesMutator;
this.classifier = classifier;
this.artifactType = artifactType;
}

@Override
public void copyTo(AbstractExternalModuleDependency target) {
super.copyTo(target);
if (target instanceof DefaultMinimalDependencyVariant) {
DefaultMinimalDependencyVariant depVariant = (DefaultMinimalDependencyVariant) target;
depVariant.attributesMutator = attributesMutator;
depVariant.capabilitiesMutator = capabilitiesMutator;
depVariant.classifier = classifier;
depVariant.artifactType = artifactType;
} else {
target.attributes(attributesMutator);
target.capabilities(capabilitiesMutator);
if (classifier != null || artifactType != null) {
ModuleFactoryHelper.addExplicitArtifactsIfDefined(target, artifactType, classifier);
}
}
}

@Override
public MinimalExternalModuleDependency copy() {
DefaultMinimalDependencyVariant dependency = new DefaultMinimalDependencyVariant(
getModule(), new DefaultMutableVersionConstraint(getVersionConstraint()),
attributesMutator, capabilitiesMutator, classifier, artifactType
);
copyTo(dependency);
return dependency;
}

@Override
public void because(String reason) {
validateMutation();
Expand All @@ -67,16 +125,12 @@ protected void validateMutation(Object currentValue, Object newValue) {

@Override
public void mutateAttributes(AttributeContainer attributes) {
if (attributesMutator!= null) {
attributesMutator.execute(attributes);
}
attributesMutator.execute(attributes);
}

@Override
public void mutateCapabilities(ModuleDependencyCapabilitiesHandler capabilitiesHandler) {
if (capabilitiesMutator != null) {
capabilitiesMutator.execute(capabilitiesHandler);
}
capabilitiesMutator.execute(capabilitiesHandler);
}

@Nullable
Expand All @@ -93,6 +147,11 @@ public String getArtifactType() {

@Override
public String toString() {
return delegate.toString();
return "DefaultMinimalDependencyVariant{" +
", attributesMutator=" + attributesMutator +
", capabilitiesMutator=" + capabilitiesMutator +
", classifier='" + classifier + '\'' +
", artifactType='" + artifactType + '\'' +
"} " + super.toString();
}
}
Expand Up @@ -15,13 +15,12 @@
*/
package org.gradle.api.internal.artifacts.dependencies;

import org.gradle.api.artifacts.MinimalExternalModuleDependency;
import org.gradle.api.artifacts.ModuleIdentifier;
import org.gradle.api.artifacts.MutableVersionConstraint;

import java.io.Serializable;

public class DefaultMutableMinimalDependency extends DefaultExternalModuleDependency implements MinimalExternalModuleDependency, Serializable {
public class DefaultMutableMinimalDependency extends DefaultExternalModuleDependency implements MinimalExternalModuleDependencyInternal, Serializable {
public DefaultMutableMinimalDependency(ModuleIdentifier module, MutableVersionConstraint versionConstraint) {
super(module, versionConstraint);
}
Expand All @@ -33,6 +32,11 @@ public DefaultMutableMinimalDependency copy() {
return dependency;
}

@Override
public void copyTo(AbstractExternalModuleDependency target) {
super.copyTo(target);
}

public String toString() {
String versionConstraintAsString = getVersionConstraint().toString();
return versionConstraintAsString.isEmpty()
Expand Down

0 comments on commit 85314da

Please sign in to comment.