This is an automated email from the ASF dual-hosted git repository.
cstamas pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-resolver.git
The following commit(s) were added to refs/heads/master by this push:
new d4035d3a2 Bug: depMgt in manager was "last wins" instead of "first
wins" (#1702)
d4035d3a2 is described below
commit d4035d3a277dec91b56780b72358727b9df13bdd
Author: Tamas Cservenak <[email protected]>
AuthorDate: Tue Dec 9 20:01:00 2025 +0100
Bug: depMgt in manager was "last wins" instead of "first wins" (#1702)
The dependency manager since commit
51a3de6cd5834bbb2748111f7d767093bf99007e (2.0.11+) had a bug to detect just
added entries, and it resulted in "last wins" logic.
This PR fixes the issue and adds UT ensuring "first wins".
Still, we are uncovered in tests (seems we are biased), as we have no
"duplicate entries in depMgt"-like tests as all!
---
.../util/graph/manager/AbstractDependencyManager.java | 16 ++++++++--------
.../aether/util/graph/manager/DependencyManagerTest.java | 13 +++++++++++++
2 files changed, 21 insertions(+), 8 deletions(-)
diff --git
a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/manager/AbstractDependencyManager.java
b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/manager/AbstractDependencyManager.java
index 556b9c588..2b2eeab35 100644
---
a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/manager/AbstractDependencyManager.java
+++
b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/manager/AbstractDependencyManager.java
@@ -197,7 +197,7 @@ public abstract class AbstractDependencyManager implements
DependencyManager {
MMap<Key, String> managedLocalPaths,
MMap<Key, Holder<Collection<Exclusion>>> managedExclusions);
- private boolean containsManagedVersion(Key key) {
+ private boolean containsManagedVersion(Key key, MMap<Key, String>
managedVersions) {
for (AbstractDependencyManager ancestor : path) {
if (ancestor.managedVersions != null &&
ancestor.managedVersions.containsKey(key)) {
return true;
@@ -218,7 +218,7 @@ public abstract class AbstractDependencyManager implements
DependencyManager {
return null;
}
- private boolean containsManagedScope(Key key) {
+ private boolean containsManagedScope(Key key, MMap<Key, String>
managedScopes) {
for (AbstractDependencyManager ancestor : path) {
if (ancestor.managedScopes != null &&
ancestor.managedScopes.containsKey(key)) {
return true;
@@ -239,7 +239,7 @@ public abstract class AbstractDependencyManager implements
DependencyManager {
return null;
}
- private boolean containsManagedOptional(Key key) {
+ private boolean containsManagedOptional(Key key, MMap<Key, Boolean>
managedOptionals) {
for (AbstractDependencyManager ancestor : path) {
if (ancestor.managedOptionals != null &&
ancestor.managedOptionals.containsKey(key)) {
return true;
@@ -260,7 +260,7 @@ public abstract class AbstractDependencyManager implements
DependencyManager {
return null;
}
- private boolean containsManagedLocalPath(Key key) {
+ private boolean containsManagedLocalPath(Key key, MMap<Key, String>
managedLocalPaths) {
for (AbstractDependencyManager ancestor : path) {
if (ancestor.managedLocalPaths != null &&
ancestor.managedLocalPaths.containsKey(key)) {
return true;
@@ -327,7 +327,7 @@ public abstract class AbstractDependencyManager implements
DependencyManager {
Key key = new Key(artifact);
String version = artifact.getVersion();
- if (!version.isEmpty() && !containsManagedVersion(key)) {
+ if (!version.isEmpty() && !containsManagedVersion(key,
managedVersions)) {
if (managedVersions == null) {
managedVersions = MMap.emptyNotDone();
}
@@ -336,7 +336,7 @@ public abstract class AbstractDependencyManager implements
DependencyManager {
if (isInheritedDerived()) {
String scope = managedDependency.getScope();
- if (!scope.isEmpty() && !containsManagedScope(key)) {
+ if (!scope.isEmpty() && !containsManagedScope(key,
managedScopes)) {
if (managedScopes == null) {
managedScopes = MMap.emptyNotDone();
}
@@ -344,7 +344,7 @@ public abstract class AbstractDependencyManager implements
DependencyManager {
}
Boolean optional = managedDependency.getOptional();
- if (optional != null && !containsManagedOptional(key)) {
+ if (optional != null && !containsManagedOptional(key,
managedOptionals)) {
if (managedOptionals == null) {
managedOptionals = MMap.emptyNotDone();
}
@@ -355,7 +355,7 @@ public abstract class AbstractDependencyManager implements
DependencyManager {
String localPath = systemDependencyScope == null
? null
:
systemDependencyScope.getSystemPath(managedDependency.getArtifact());
- if (localPath != null && !containsManagedLocalPath(key)) {
+ if (localPath != null && !containsManagedLocalPath(key,
managedLocalPaths)) {
if (managedLocalPaths == null) {
managedLocalPaths = MMap.emptyNotDone();
}
diff --git
a/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/manager/DependencyManagerTest.java
b/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/manager/DependencyManagerTest.java
index b32b7907e..db5c4afe1 100644
---
a/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/manager/DependencyManagerTest.java
+++
b/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/manager/DependencyManagerTest.java
@@ -71,6 +71,19 @@ public class DependencyManagerTest {
session = TestUtils.newSession();
}
+ @Test
+ void duplicateDepMgt() {
+ DependencyManager manager = new TransitiveDependencyManager(null);
+ DependencyManager derived = manager.deriveChildManager(newContext(
+ new Dependency(new DefaultArtifact("dupe:dupe:1.0"),
""),
+ new Dependency(new DefaultArtifact("dupe:dupe:2.0"),
"")))
+ .deriveChildManager(newContext());
+ DependencyManagement management =
+ derived.manageDependency(new Dependency(new
DefaultArtifact("dupe:dupe:1.1"), ""));
+ // bug: here would be 2.0
+ assertEquals("1.0", management.getVersion());
+ }
+
@Test
void testClassic() {
DependencyManager manager = new ClassicDependencyManager(null);