This is an automated email from the ASF dual-hosted git repository.

bodewig pushed a commit to branch ivy-1642
in repository https://gitbox.apache.org/repos/asf/ant-ivy.git


The following commit(s) were added to refs/heads/ivy-1642 by this push:
     new ed104821 don't revert changes made for IVY-1580
ed104821 is described below

commit ed104821825bafb113c5a8bac2c81d97a8e6a729
Author: Stefan Bodewig <bode...@apache.org>
AuthorDate: Fri Apr 14 12:13:58 2023 +0200

    don't revert changes made for IVY-1580
---
 src/java/org/apache/ivy/core/resolve/IvyNode.java  |  6 +++
 .../org/apache/ivy/core/resolve/IvyNodeUsage.java  | 50 ++++++++++++++++++----
 2 files changed, 48 insertions(+), 8 deletions(-)

diff --git a/src/java/org/apache/ivy/core/resolve/IvyNode.java 
b/src/java/org/apache/ivy/core/resolve/IvyNode.java
index 273488ef..c7872c89 100644
--- a/src/java/org/apache/ivy/core/resolve/IvyNode.java
+++ b/src/java/org/apache/ivy/core/resolve/IvyNode.java
@@ -49,6 +49,7 @@ import org.apache.ivy.core.module.descriptor.IncludeRule;
 import org.apache.ivy.core.module.descriptor.MDArtifact;
 import org.apache.ivy.core.module.descriptor.ModuleDescriptor;
 import org.apache.ivy.core.module.id.ArtifactId;
+import org.apache.ivy.core.module.id.ArtifactRevisionId;
 import org.apache.ivy.core.module.id.ModuleId;
 import org.apache.ivy.core.module.id.ModuleRevisionId;
 import org.apache.ivy.core.resolve.IvyNodeCallers.Caller;
@@ -873,6 +874,7 @@ public class IvyNode implements Comparable<IvyNode> {
 
         // now exclude artifacts that aren't accepted by any caller
         Iterator<Artifact> iter = artifacts.iterator();
+        Set<ArtifactRevisionId> artifactRevisionsSeen = new 
HashSet<ArtifactRevisionId>();
         while (iter.hasNext()) {
             Artifact artifact = iter.next();
             boolean excluded = callers.doesCallersExclude(rootModuleConf, 
artifact);
@@ -880,6 +882,10 @@ public class IvyNode implements Comparable<IvyNode> {
                 Message.debug(this + " in " + rootModuleConf + ": excluding " 
+ artifact);
                 iter.remove();
             }
+            if (!artifactRevisionsSeen.add(artifact.getId())) {
+                Message.debug(this + " in " + rootModuleConf + ": skipping 
duplicate " + artifact);
+                iter.remove();
+            }
         }
         return artifacts.toArray(new Artifact[artifacts.size()]);
     }
diff --git a/src/java/org/apache/ivy/core/resolve/IvyNodeUsage.java 
b/src/java/org/apache/ivy/core/resolve/IvyNodeUsage.java
index c9676dcc..f96beb91 100644
--- a/src/java/org/apache/ivy/core/resolve/IvyNodeUsage.java
+++ b/src/java/org/apache/ivy/core/resolve/IvyNodeUsage.java
@@ -24,10 +24,15 @@ import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.ivy.core.module.descriptor.DefaultIncludeRule;
 import org.apache.ivy.core.module.descriptor.DependencyArtifactDescriptor;
 import org.apache.ivy.core.module.descriptor.DependencyDescriptor;
 import org.apache.ivy.core.module.descriptor.IncludeRule;
 import org.apache.ivy.core.module.descriptor.WorkspaceModuleDescriptor;
+import org.apache.ivy.core.module.id.ArtifactId;
+import org.apache.ivy.core.module.id.ModuleId;
+import org.apache.ivy.plugins.matcher.ExactPatternMatcher;
+import org.apache.ivy.plugins.matcher.PatternMatcher;
 
 /**
  * Class collecting usage data for an IvyNode.
@@ -238,15 +243,35 @@ public class IvyNodeUsage {
         if (dependersInConf == null) {
             return null;
         }
-        Set<IncludeRule> dependencyIncludes = new HashSet<>();
-        for (Depender depender : dependersInConf) {
-            IncludeRule[] rules = 
depender.dd.getIncludeRules(depender.dependerConf);
-            if (rules == null || rules.length == 0) {
-                // no include rule in at least one depender -> we must include 
everything,
-                // and so return no include rule at all
-                return null;
+        final Set<IncludeRule> dependencyIncludes = new HashSet<>();
+        // true if the depedency descriptor of any of the depender *doesn't* 
have an explicit
+        // "<artifact>" or an "<include>". false otherwise
+        boolean atLeastOneDependerNeedsAllArtifacts = false;
+        // true if the dependency descriptor of any of the depender either has 
an explicit "<artifact>"
+        // or an "<include>". false otherwise
+        boolean atLeastOneDependerHasSpecificArtifactSelection = false;
+        for (final Depender depender : dependersInConf) {
+            final DependencyArtifactDescriptor dads[] = 
depender.dd.getDependencyArtifacts(depender.dd.getModuleConfigurations());
+            final boolean declaresArtifacts = dads != null && dads.length > 0;
+            final IncludeRule[] rules = 
depender.dd.getIncludeRules(depender.dependerConf);
+            final boolean hasIncludeRule = rules != null && rules.length > 0;
+            if (hasIncludeRule) {
+                dependencyIncludes.addAll(Arrays.asList(rules));
+            }
+            if (declaresArtifacts || hasIncludeRule) {
+                atLeastOneDependerHasSpecificArtifactSelection = true;
             }
-            dependencyIncludes.addAll(Arrays.asList(rules));
+            if (!hasIncludeRule && !declaresArtifacts) {
+                atLeastOneDependerNeedsAllArtifacts = true;
+            }
+        }
+        // so there's at least one depender D1 which has a specific artifact 
dependency and at the
+        // same time there's a depender D2 which doesn't have any explicit 
artifact/includes.
+        // so it is expected that an implicit "include all artifacts" is 
applied so that dependencies
+        // such as D2 get (all) the artifacts that are published by the 
dependency's module
+        if (atLeastOneDependerHasSpecificArtifactSelection && 
atLeastOneDependerNeedsAllArtifacts) {
+            // add a "include all artifacts" rule
+            dependencyIncludes.add(includeAllArtifacts());
         }
         return dependencyIncludes;
     }
@@ -313,4 +338,13 @@ public class IvyNodeUsage {
         return false;
     }
 
+    private static IncludeRule includeAllArtifacts() {
+        final ArtifactId aid = new ArtifactId(
+                new ModuleId(PatternMatcher.ANY_EXPRESSION, 
PatternMatcher.ANY_EXPRESSION),
+                PatternMatcher.ANY_EXPRESSION, PatternMatcher.ANY_EXPRESSION,
+                PatternMatcher.ANY_EXPRESSION);
+        return new DefaultIncludeRule(aid, ExactPatternMatcher.INSTANCE, null);
+    }
+
+
 }

Reply via email to