diff --git a/subprojects/dependency-management/src/integTest/groovy/org/gradle/integtests/resolve/alignment/AlignmentIntegrationTest.groovy b/subprojects/dependency-management/src/integTest/groovy/org/gradle/integtests/resolve/alignment/AlignmentIntegrationTest.groovy index 88bb5dbf5dbf..4ae6c907d4fa 100644 --- a/subprojects/dependency-management/src/integTest/groovy/org/gradle/integtests/resolve/alignment/AlignmentIntegrationTest.groovy +++ b/subprojects/dependency-management/src/integTest/groovy/org/gradle/integtests/resolve/alignment/AlignmentIntegrationTest.groovy @@ -1089,4 +1089,58 @@ class AlignmentIntegrationTest extends AbstractAlignmentSpec { virtualConfiguration("org:platform:1.1") } } + + @RequiredFeatures([ + // We only need to test one flavor + @RequiredFeature(feature = GradleMetadataResolveRunner.GRADLE_METADATA, value = "true"), + @RequiredFeature(feature = GradleMetadataResolveRunner.REPOSITORY_TYPE, value = "maven") + ]) + def "should manage to realign through two conflicts"() { + repository { + path 'start:start:1.0 -> foo:1.0' + + path 'foo:1.0 -> bar:1.0' + path 'foo:1.1 -> bar:1.1' + + 'org:bar:1.0'() + 'org:bar:1.1'() + } + + given: + buildFile << ''' + dependencies { + constraints { + conf platform("org:platform:1.1") + } + + conf 'start:start:1.0' + } + ''' + + and: + "align the 'org' group only"() + + when: + expectAlignment { + module('start') group('start') alignsTo('1.0') + module('foo') tries('1.0') alignsTo('1.1') byVirtualPlatform() + module('bar') tries('1.0') alignsTo('1.1') byVirtualPlatform() + } + run ':checkDeps', 'dependencyInsight', '--configuration', 'conf', '--dependency', 'bar' + + then: + resolve.expectGraph { + root(":", ":test:") { + module("start:start:1.0") { + edge("org:foo:1.0", "org:foo:1.1") { + byConstraint("belongs to platform org:platform:1.1") + module("org:bar:1.1") { + byConstraint("belongs to platform org:platform:1.1") + } + } + } + } + virtualConfiguration("org:platform:1.1") + } + } } diff --git a/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/ivyservice/resolveengine/graph/builder/DefaultPendingDependenciesVisitor.java b/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/ivyservice/resolveengine/graph/builder/DefaultPendingDependenciesVisitor.java index 6d2030b41783..2c174a8a534d 100644 --- a/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/ivyservice/resolveengine/graph/builder/DefaultPendingDependenciesVisitor.java +++ b/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/ivyservice/resolveengine/graph/builder/DefaultPendingDependenciesVisitor.java @@ -68,7 +68,7 @@ private boolean markNoLongerPending(PendingDependencies pendingDependencies) { noLongerPending = Lists.newLinkedList(); } noLongerPending.add(pendingDependencies); - activatedPending = true; + activatedPending = pendingDependencies.shouldReportActivatePending(); } pendingDependencies.increaseHardEdgeCount(); return activatedPending; diff --git a/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/ivyservice/resolveengine/graph/builder/PendingDependencies.java b/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/ivyservice/resolveengine/graph/builder/PendingDependencies.java index 5d2a0e2544a7..1f2a70ae9774 100644 --- a/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/ivyservice/resolveengine/graph/builder/PendingDependencies.java +++ b/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/ivyservice/resolveengine/graph/builder/PendingDependencies.java @@ -24,11 +24,13 @@ public class PendingDependencies { private final ModuleIdentifier moduleIdentifier; private final Set affectedComponents; private int hardEdges; + private boolean reportActivePending; PendingDependencies(ModuleIdentifier moduleIdentifier) { this.moduleIdentifier = moduleIdentifier; this.affectedComponents = Sets.newLinkedHashSet(); this.hardEdges = 0; + this.reportActivePending = true; } ModuleIdentifier getModuleIdentifier() { @@ -40,6 +42,9 @@ void addNode(NodeState state) { throw new IllegalStateException("Cannot add a pending node for a dependency which is not pending"); } affectedComponents.add(state); + if (state.getComponent().getModule().isVirtualPlatform()) { + reportActivePending = false; + } } void turnIntoHardDependencies() { @@ -47,6 +52,7 @@ void turnIntoHardDependencies() { affectedComponent.prepareForConstraintNoLongerPending(moduleIdentifier); } affectedComponents.clear(); + reportActivePending = true; } public boolean isPending() { @@ -65,4 +71,8 @@ void decreaseHardEdgeCount() { assert hardEdges > 0 : "Cannot remove a hard edge when none recorded"; hardEdges--; } + + public boolean shouldReportActivatePending() { + return reportActivePending; + } }