You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ivy-commits@incubator.apache.org by gs...@apache.org on 2007/10/21 19:09:01 UTC

svn commit: r586936 - in /incubator/ivy/core/trunk: src/java/org/apache/ivy/core/sort/ModuleDescriptorSorter.java src/java/org/apache/ivy/core/sort/ModuleInSort.java test/java/org/apache/ivy/core/sort/SortTest.java

Author: gscokart
Date: Sun Oct 21 12:09:00 2007
New Revision: 586936

URL: http://svn.apache.org/viewvc?rev=586936&view=rev
Log:
Remove infinite loop in some case of circular dependencies (IVY-624)

Modified:
    incubator/ivy/core/trunk/src/java/org/apache/ivy/core/sort/ModuleDescriptorSorter.java
    incubator/ivy/core/trunk/src/java/org/apache/ivy/core/sort/ModuleInSort.java
    incubator/ivy/core/trunk/test/java/org/apache/ivy/core/sort/SortTest.java

Modified: incubator/ivy/core/trunk/src/java/org/apache/ivy/core/sort/ModuleDescriptorSorter.java
URL: http://svn.apache.org/viewvc/incubator/ivy/core/trunk/src/java/org/apache/ivy/core/sort/ModuleDescriptorSorter.java?rev=586936&r1=586935&r2=586936&view=diff
==============================================================================
--- incubator/ivy/core/trunk/src/java/org/apache/ivy/core/sort/ModuleDescriptorSorter.java (original)
+++ incubator/ivy/core/trunk/src/java/org/apache/ivy/core/sort/ModuleDescriptorSorter.java Sun Oct 21 12:09:00 2007
@@ -83,7 +83,7 @@
     private void sortModuleDescriptorsHelp(ModuleInSort current, ModuleInSort caller)
             throws CircularDependencyException {
         // if already sorted return
-        if (current.isSorted()) {
+        if (current.isProcessed()) {
             return;
         }
         if (current.checkLoop(caller, circularDepStrategy)) {

Modified: incubator/ivy/core/trunk/src/java/org/apache/ivy/core/sort/ModuleInSort.java
URL: http://svn.apache.org/viewvc/incubator/ivy/core/trunk/src/java/org/apache/ivy/core/sort/ModuleInSort.java?rev=586936&r1=586935&r2=586936&view=diff
==============================================================================
--- incubator/ivy/core/trunk/src/java/org/apache/ivy/core/sort/ModuleInSort.java (original)
+++ incubator/ivy/core/trunk/src/java/org/apache/ivy/core/sort/ModuleInSort.java Sun Oct 21 12:09:00 2007
@@ -65,6 +65,7 @@
         return isLoopIntermediateElement;
     }
 
+    /** This ModuleInSort has been placed on the sorted list */
     public boolean isSorted() {
         if (isSorted) {
             Message.debug("Module descriptor already sorted : "
@@ -75,6 +76,21 @@
         }
     }
 
+    /** This ModuleInSort has already been analyzed.  It is either already added
+     * to the sorted list, either it is included in a loop and will be added
+     * when the root of the loop will be added to the list. 
+     */
+    public boolean isProcessed() {
+        if (isSorted || isLoopIntermediateElement) {
+            Message.debug("Module descriptor is processed : "
+                    + module.getModuleRevisionId().toString());
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    
     public void setCaller(ModuleInSort caller) {
         this.caller = caller;
     }

Modified: incubator/ivy/core/trunk/test/java/org/apache/ivy/core/sort/SortTest.java
URL: http://svn.apache.org/viewvc/incubator/ivy/core/trunk/test/java/org/apache/ivy/core/sort/SortTest.java?rev=586936&r1=586935&r2=586936&view=diff
==============================================================================
--- incubator/ivy/core/trunk/test/java/org/apache/ivy/core/sort/SortTest.java (original)
+++ incubator/ivy/core/trunk/test/java/org/apache/ivy/core/sort/SortTest.java Sun Oct 21 12:09:00 2007
@@ -17,6 +17,7 @@
  */
 package org.apache.ivy.core.sort;
 
+import java.io.File;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -32,6 +33,7 @@
 import org.apache.ivy.core.module.descriptor.DependencyDescriptor;
 import org.apache.ivy.core.module.descriptor.ModuleDescriptor;
 import org.apache.ivy.core.module.id.ModuleRevisionId;
+import org.apache.ivy.core.report.ResolveReport;
 import org.apache.ivy.plugins.circular.CircularDependencyHelper;
 import org.apache.ivy.plugins.circular.CircularDependencyStrategy;
 import org.apache.ivy.plugins.circular.WarnCircularDependencyStrategy;
@@ -130,6 +132,19 @@
         }
     }
 
+    //Test IVY-624
+    public void testCircularDependencyInfiniteLoop() throws Exception {
+        addDependency(md1, "md2", "rev2");
+        addDependency(md1, "md3", "rev3");
+        addDependency(md2, "md3", "rev3");        
+        addDependency(md3, "md4", "rev4");
+        addDependency(md4, "md1", "rev1");
+        addDependency(md4, "md2", "rev2");
+        List toSort = Arrays.asList(new Object[] {md1, md2, md3, md4});
+        sortEngine.sortModuleDescriptors(toSort, nonMatchReporter);
+        //If it ends, it's ok.
+    }
+    
     /**
      * In case of Circular dependency a warning is generated.
      */