You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by cs...@apache.org on 2022/05/11 16:34:53 UTC

[maven-resolver] branch tmp-collect-listener created (now d730dcd4)

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

cstamas pushed a change to branch tmp-collect-listener
in repository https://gitbox.apache.org/repos/asf/maven-resolver.git


      at d730dcd4 Tidy up demo

This branch includes the following new commits:

     new 8ffa710c Collect listener?
     new 717ec73a Merge remote-tracking branch 'origin/master' into tmp-collect-listener
     new d730dcd4 Tidy up demo

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[maven-resolver] 01/03: Collect listener?

Posted by cs...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cstamas pushed a commit to branch tmp-collect-listener
in repository https://gitbox.apache.org/repos/asf/maven-resolver.git

commit 8ffa710cf0ecf5d6a14895c9215ad738696c4cca
Author: Tamas Cservenak <ta...@cservenak.net>
AuthorDate: Thu May 5 18:26:38 2022 +0200

    Collect listener?
---
 .../examples/ResolveTransitiveDependencies.java    |  7 +++--
 .../maven/resolver/examples/util/Booter.java       |  4 +--
 .../impl/collect/DependencyCollectorDelegate.java  | 32 ++++++++++++++++++++++
 .../impl/collect/bf/BfDependencyCollector.java     |  3 ++
 .../impl/collect/df/DfDependencyCollector.java     |  2 ++
 5 files changed, 44 insertions(+), 4 deletions(-)

diff --git a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/ResolveTransitiveDependencies.java b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/ResolveTransitiveDependencies.java
index 88ee3ec3..90df6813 100644
--- a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/ResolveTransitiveDependencies.java
+++ b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/ResolveTransitiveDependencies.java
@@ -22,6 +22,7 @@ package org.apache.maven.resolver.examples;
 import java.util.List;
 
 import org.apache.maven.resolver.examples.util.Booter;
+import org.eclipse.aether.DefaultRepositorySystemSession;
 import org.eclipse.aether.RepositorySystem;
 import org.eclipse.aether.RepositorySystemSession;
 import org.eclipse.aether.artifact.Artifact;
@@ -53,15 +54,17 @@ public class ResolveTransitiveDependencies
 
         RepositorySystem system = Booter.newRepositorySystem( Booter.selectFactory( args ) );
 
-        RepositorySystemSession session = Booter.newRepositorySystemSession( system );
+        DefaultRepositorySystemSession session = Booter.newRepositorySystemSession( system );
+        session.setConfigProperty( "aether.collector.impl", "df" );
 
-        Artifact artifact = new DefaultArtifact( "org.apache.maven.resolver:maven-resolver-impl:1.3.3" );
+        Artifact artifact = new DefaultArtifact( "org.apache.maven:maven-core:3.8.5" );
 
         DependencyFilter classpathFlter = DependencyFilterUtils.classpathFilter( JavaScopes.COMPILE );
 
         CollectRequest collectRequest = new CollectRequest();
         collectRequest.setRoot( new Dependency( artifact, JavaScopes.COMPILE ) );
         collectRequest.setRepositories( Booter.newRepositories( system, session ) );
+        collectRequest.setRequestContext( "test" );
 
         DependencyRequest dependencyRequest = new DependencyRequest( collectRequest, classpathFlter );
 
diff --git a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/Booter.java b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/Booter.java
index 399f2f99..e20b9bff 100644
--- a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/Booter.java
+++ b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/Booter.java
@@ -75,8 +75,8 @@ public class Booter
         LocalRepository localRepo = new LocalRepository( "target/local-repo" );
         session.setLocalRepositoryManager( system.newLocalRepositoryManager( session, localRepo ) );
 
-        session.setTransferListener( new ConsoleTransferListener() );
-        session.setRepositoryListener( new ConsoleRepositoryListener() );
+        //session.setTransferListener( new ConsoleTransferListener() );
+        //session.setRepositoryListener( new ConsoleRepositoryListener() );
 
         // uncomment to generate dirty trees
         // session.setDependencyGraphTransformer( null );
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DependencyCollectorDelegate.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DependencyCollectorDelegate.java
index c7c2c985..d539a21f 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DependencyCollectorDelegate.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DependencyCollectorDelegate.java
@@ -19,10 +19,19 @@ package org.eclipse.aether.internal.impl.collect;
  * under the License.
  */
 
+import java.util.Collections;
+import java.util.List;
+import java.util.ListIterator;
+
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.graph.Dependency;
+import org.eclipse.aether.graph.DependencyNode;
 import org.eclipse.aether.impl.ArtifactDescriptorReader;
 import org.eclipse.aether.impl.DependencyCollector;
 import org.eclipse.aether.impl.RemoteRepositoryManager;
 import org.eclipse.aether.impl.VersionRangeResolver;
+import org.eclipse.aether.resolution.ArtifactDescriptorRequest;
+import org.eclipse.aether.resolution.ArtifactDescriptorResult;
 import org.eclipse.aether.spi.locator.ServiceLocator;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -93,4 +102,27 @@ public abstract class DependencyCollectorDelegate implements DependencyCollector
         return this;
     }
 
+    protected void dependencyCollected( RepositorySystemSession session,
+                                        List<DependencyNode> path,
+                                        Dependency dependency,
+                                        ArtifactDescriptorRequest artifactDescriptorRequest,
+                                        ArtifactDescriptorResult artifactDescriptorResult )
+    {
+        logger.info(String.format("%s (context: %s) @ %s", dependency, artifactDescriptorRequest.getRequestContext(),
+                artifactDescriptorResult != null && artifactDescriptorResult.getRepository() == null ? "unknown" : artifactDescriptorResult.getRepository().getId()));
+        int distance = 0;
+        ListIterator<DependencyNode> reversePathIterator = path.listIterator( path.size() );
+        while ( reversePathIterator.hasPrevious() )
+        {
+            DependencyNode dn = reversePathIterator.previous();
+            StringBuilder indent = new StringBuilder();
+            for (int i = 0; i < distance; i++) {
+                indent.append("  ");
+            }
+            distance++;
+            indent.append( " -> " );
+            logger.info(String.format("%s%s (context: %s) @ %s", indent, dn, dn.getRequestContext(),
+                    artifactDescriptorResult.getRepository() == null ? "unknown" : artifactDescriptorResult.getRepository().getId()));
+        }
+    }
 }
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollector.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollector.java
index 4beca799..c934e033 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollector.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollector.java
@@ -446,6 +446,7 @@ public class BfDependencyCollector
                                               descriptorResult.getAliases(), repos, args.request.getRequestContext() );
 
                     context.getParent().getChildren().add( child );
+                    dependencyCollected( args.session, context.parents, d, descriptorRequest, descriptorResult );
 
                     boolean recurse = traverse && !descriptorResult.getDependencies().isEmpty();
                     if ( recurse )
@@ -462,6 +463,7 @@ public class BfDependencyCollector
                     createDependencyNode( relocations, preManaged, rangeResult, version, d, null, repos,
                                           args.request.getRequestContext() );
                 context.getParent().getChildren().add( child );
+                dependencyCollected( args.session, context.parents, d, descriptorRequest, descriptorResult );
             }
         }
     }
@@ -506,6 +508,7 @@ public class BfDependencyCollector
                     args.dependencyProcessingQueue.add(
                             new DependencyProcessingContext( childSelector, childManager, childTraverser, childFilter,
                                     childRepos, descriptorResult.getManagedDependencies(), parents, dependency ) );
+
                 }
                 args.pool.putChildren( key, child.getChildren() );
                 args.skipper.cache( child, parents );
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/df/DfDependencyCollector.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/df/DfDependencyCollector.java
index e803fe13..cc430b43 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/df/DfDependencyCollector.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/df/DfDependencyCollector.java
@@ -420,6 +420,7 @@ public class DfDependencyCollector
                                               descriptorResult.getAliases(), repos, args.request.getRequestContext() );
 
                     node.getChildren().add( child );
+                    dependencyCollected( args.session, args.nodes.nodes, d, descriptorRequest, descriptorResult );
 
                     boolean recurse = traverse && !descriptorResult.getDependencies().isEmpty();
                     if ( recurse )
@@ -438,6 +439,7 @@ public class DfDependencyCollector
                     createDependencyNode( relocations, preManaged, rangeResult, version, d, null, repos,
                                           args.request.getRequestContext() );
                 node.getChildren().add( child );
+                dependencyCollected( args.session, args.nodes.nodes, d, descriptorRequest, descriptorResult );
             }
         }
     }


[maven-resolver] 03/03: Tidy up demo

Posted by cs...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cstamas pushed a commit to branch tmp-collect-listener
in repository https://gitbox.apache.org/repos/asf/maven-resolver.git

commit d730dcd4d7cece3fb1d150879604d87e872cc0dc
Author: Tamas Cservenak <ta...@cservenak.net>
AuthorDate: Wed May 11 18:34:37 2022 +0200

    Tidy up demo
---
 .../examples/ResolveTransitiveDependencies.java    |  7 ++----
 .../maven/resolver/examples/util/Booter.java       |  4 +--
 .../impl/collect/DependencyCollectorDelegate.java  | 29 +++++++++++-----------
 .../impl/collect/bf/BfDependencyCollector.java     |  4 +--
 .../impl/collect/df/DfDependencyCollector.java     |  4 +--
 5 files changed, 22 insertions(+), 26 deletions(-)

diff --git a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/ResolveTransitiveDependencies.java b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/ResolveTransitiveDependencies.java
index 90df6813..88ee3ec3 100644
--- a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/ResolveTransitiveDependencies.java
+++ b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/ResolveTransitiveDependencies.java
@@ -22,7 +22,6 @@ package org.apache.maven.resolver.examples;
 import java.util.List;
 
 import org.apache.maven.resolver.examples.util.Booter;
-import org.eclipse.aether.DefaultRepositorySystemSession;
 import org.eclipse.aether.RepositorySystem;
 import org.eclipse.aether.RepositorySystemSession;
 import org.eclipse.aether.artifact.Artifact;
@@ -54,17 +53,15 @@ public class ResolveTransitiveDependencies
 
         RepositorySystem system = Booter.newRepositorySystem( Booter.selectFactory( args ) );
 
-        DefaultRepositorySystemSession session = Booter.newRepositorySystemSession( system );
-        session.setConfigProperty( "aether.collector.impl", "df" );
+        RepositorySystemSession session = Booter.newRepositorySystemSession( system );
 
-        Artifact artifact = new DefaultArtifact( "org.apache.maven:maven-core:3.8.5" );
+        Artifact artifact = new DefaultArtifact( "org.apache.maven.resolver:maven-resolver-impl:1.3.3" );
 
         DependencyFilter classpathFlter = DependencyFilterUtils.classpathFilter( JavaScopes.COMPILE );
 
         CollectRequest collectRequest = new CollectRequest();
         collectRequest.setRoot( new Dependency( artifact, JavaScopes.COMPILE ) );
         collectRequest.setRepositories( Booter.newRepositories( system, session ) );
-        collectRequest.setRequestContext( "test" );
 
         DependencyRequest dependencyRequest = new DependencyRequest( collectRequest, classpathFlter );
 
diff --git a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/Booter.java b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/Booter.java
index e20b9bff..399f2f99 100644
--- a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/Booter.java
+++ b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/Booter.java
@@ -75,8 +75,8 @@ public class Booter
         LocalRepository localRepo = new LocalRepository( "target/local-repo" );
         session.setLocalRepositoryManager( system.newLocalRepositoryManager( session, localRepo ) );
 
-        //session.setTransferListener( new ConsoleTransferListener() );
-        //session.setRepositoryListener( new ConsoleRepositoryListener() );
+        session.setTransferListener( new ConsoleTransferListener() );
+        session.setRepositoryListener( new ConsoleRepositoryListener() );
 
         // uncomment to generate dirty trees
         // session.setDependencyGraphTransformer( null );
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DependencyCollectorDelegate.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DependencyCollectorDelegate.java
index d539a21f..485eb4c7 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DependencyCollectorDelegate.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DependencyCollectorDelegate.java
@@ -19,19 +19,17 @@ package org.eclipse.aether.internal.impl.collect;
  * under the License.
  */
 
-import java.util.Collections;
 import java.util.List;
 import java.util.ListIterator;
+import java.util.stream.Collectors;
 
 import org.eclipse.aether.RepositorySystemSession;
-import org.eclipse.aether.graph.Dependency;
 import org.eclipse.aether.graph.DependencyNode;
 import org.eclipse.aether.impl.ArtifactDescriptorReader;
 import org.eclipse.aether.impl.DependencyCollector;
 import org.eclipse.aether.impl.RemoteRepositoryManager;
 import org.eclipse.aether.impl.VersionRangeResolver;
-import org.eclipse.aether.resolution.ArtifactDescriptorRequest;
-import org.eclipse.aether.resolution.ArtifactDescriptorResult;
+import org.eclipse.aether.repository.RemoteRepository;
 import org.eclipse.aether.spi.locator.ServiceLocator;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -103,26 +101,27 @@ public abstract class DependencyCollectorDelegate implements DependencyCollector
     }
 
     protected void dependencyCollected( RepositorySystemSession session,
-                                        List<DependencyNode> path,
-                                        Dependency dependency,
-                                        ArtifactDescriptorRequest artifactDescriptorRequest,
-                                        ArtifactDescriptorResult artifactDescriptorResult )
+                                        List<DependencyNode> pathToCollectedNode,
+                                        DependencyNode collectedNode )
     {
-        logger.info(String.format("%s (context: %s) @ %s", dependency, artifactDescriptorRequest.getRequestContext(),
-                artifactDescriptorResult != null && artifactDescriptorResult.getRepository() == null ? "unknown" : artifactDescriptorResult.getRepository().getId()));
+        // TODO: this is below "demo", but will be an extension point
+        logger.info( String.format( "%s (context: %s)",
+                collectedNode.getDependency(), collectedNode.getRequestContext() ) );
         int distance = 0;
-        ListIterator<DependencyNode> reversePathIterator = path.listIterator( path.size() );
+        ListIterator<DependencyNode> reversePathIterator = pathToCollectedNode
+                .listIterator( pathToCollectedNode.size() );
         while ( reversePathIterator.hasPrevious() )
         {
             DependencyNode dn = reversePathIterator.previous();
             StringBuilder indent = new StringBuilder();
-            for (int i = 0; i < distance; i++) {
-                indent.append("  ");
+            for ( int i = 0; i < distance; i++ )
+            {
+                indent.append( "  " );
             }
             distance++;
             indent.append( " -> " );
-            logger.info(String.format("%s%s (context: %s) @ %s", indent, dn, dn.getRequestContext(),
-                    artifactDescriptorResult.getRepository() == null ? "unknown" : artifactDescriptorResult.getRepository().getId()));
+            logger.info( String.format( "%s%s (context: %s) @ %s", indent, dn, dn.getRequestContext(),
+                    dn.getRepositories().stream().map( RemoteRepository::getId ).collect( Collectors.toList() ) ) );
         }
     }
 }
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollector.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollector.java
index 5119a652..d8ae965e 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollector.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollector.java
@@ -446,7 +446,7 @@ public class BfDependencyCollector
                                               descriptorResult.getAliases(), repos, args.request.getRequestContext() );
 
                     context.getParent().getChildren().add( child );
-                    dependencyCollected( args.session, context.parents, d, descriptorRequest, descriptorResult );
+                    dependencyCollected( args.session, context.parents, child );
 
                     boolean recurse = traverse && !descriptorResult.getDependencies().isEmpty();
                     DependencyProcessingContext parentContext = context.withDependency( d );
@@ -471,7 +471,7 @@ public class BfDependencyCollector
                     createDependencyNode( relocations, preManaged, rangeResult, version, d, null, repos,
                                           args.request.getRequestContext() );
                 context.getParent().getChildren().add( child );
-                dependencyCollected( args.session, context.parents, d, descriptorRequest, descriptorResult );
+                dependencyCollected( args.session, context.parents, child );
             }
         }
     }
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/df/DfDependencyCollector.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/df/DfDependencyCollector.java
index cc430b43..d904ded4 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/df/DfDependencyCollector.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/df/DfDependencyCollector.java
@@ -420,7 +420,7 @@ public class DfDependencyCollector
                                               descriptorResult.getAliases(), repos, args.request.getRequestContext() );
 
                     node.getChildren().add( child );
-                    dependencyCollected( args.session, args.nodes.nodes, d, descriptorRequest, descriptorResult );
+                    dependencyCollected( args.session, args.nodes.nodes, child );
 
                     boolean recurse = traverse && !descriptorResult.getDependencies().isEmpty();
                     if ( recurse )
@@ -439,7 +439,7 @@ public class DfDependencyCollector
                     createDependencyNode( relocations, preManaged, rangeResult, version, d, null, repos,
                                           args.request.getRequestContext() );
                 node.getChildren().add( child );
-                dependencyCollected( args.session, args.nodes.nodes, d, descriptorRequest, descriptorResult );
+                dependencyCollected( args.session, args.nodes.nodes, child );
             }
         }
     }


[maven-resolver] 02/03: Merge remote-tracking branch 'origin/master' into tmp-collect-listener

Posted by cs...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cstamas pushed a commit to branch tmp-collect-listener
in repository https://gitbox.apache.org/repos/asf/maven-resolver.git

commit 717ec73a8b3a81a587cd811935f13ec68b1e4903
Merge: 8ffa710c 570c65e6
Author: Tamas Cservenak <ta...@cservenak.net>
AuthorDate: Wed May 11 17:51:45 2022 +0200

    Merge remote-tracking branch 'origin/master' into tmp-collect-listener

 .asf.yaml                                          |   9 +
 .../impl/collect/bf/BfDependencyCollector.java     |  10 +-
 ...=> DependencyCollectorDelegateTestSupport.java} | 152 ++---
 .../impl/collect/bf/BfDependencyCollectorTest.java | 620 ++-------------------
 .../bf/BfDependencyCollectorUseSkipTest.java       |  86 ---
 .../impl/collect/df/DfDependencyCollectorTest.java | 620 +--------------------
 .../dependencies-empty/gid_a_ver.ini               |   4 +
 .../dependencies-empty/gid_aa_ver.ini              |   4 +
 .../dependencies-empty/gid_b_ver.ini               |   2 +
 .../dependencies-empty/gid_c_ver.ini               |   2 +
 .../dependencies-empty/gid_d_1.ini                 |   1 +
 .../dependencies-empty/gid_d_2.ini                 |   2 +
 .../dependencies-empty/gid_e_ver.ini               |   2 +
 .../dependencies-empty/gid_f_ver.ini               |   2 +
 .../dependencies-empty/gid_g_1.ini                 |   2 +
 .../dependencies-empty/gid_g_2.ini                 |   2 +
 .../dependencies-empty/gid_h_1.ini                 |   1 +
 .../dependencies-empty/gid_h_2.ini                 |   1 +
 ...tedSubtreeOnDescriptorDependenciesEmptyLeft.txt |   8 +
 ...edSubtreeOnDescriptorDependenciesEmptyRight.txt |   8 +
 20 files changed, 190 insertions(+), 1348 deletions(-)

diff --cc maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollector.java
index c934e033,4c41d40c..5119a652
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollector.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollector.java
@@@ -446,12 -446,19 +446,20 @@@ public class BfDependencyCollecto
                                                descriptorResult.getAliases(), repos, args.request.getRequestContext() );
  
                      context.getParent().getChildren().add( child );
 +                    dependencyCollected( args.session, context.parents, d, descriptorRequest, descriptorResult );
  
                      boolean recurse = traverse && !descriptorResult.getDependencies().isEmpty();
+                     DependencyProcessingContext parentContext = context.withDependency( d );
                      if ( recurse )
                      {
-                         doRecurse( args, context.withDependency( d ), descriptorResult, child );
+                         doRecurse( args, parentContext, descriptorResult, child );
+                     }
+                     else if ( !args.skipper.skipResolution( child, parentContext.parents ) )
+                     {
+                         List<DependencyNode> parents = new ArrayList<>( parentContext.parents.size() + 1 );
+                         parents.addAll( parentContext.parents );
+                         parents.add( child );
+                         args.skipper.cache( child, parents );
                      }
                  }
              }