Added:
trunk/src/test/java/com/google/ant/extensions/types/resources/project/c/c1/build.xml
trunk/src/test/java/com/google/ant/extensions/types/resources/project/c/c2/build.xml
Modified:
trunk/src/main/java/com/google/ant/extensions/tasks/DrillTask.java
trunk/src/main/java/com/google/ant/extensions/types/Modules.java
trunk/src/main/java/com/google/ant/extensions/types/Resolver.java
trunk/src/test/java/com/google/ant/extensions/types/ResolverTest.java
trunk/src/test/java/com/google/ant/extensions/types/resources/project/d/d1/build.xml
trunk/src/test/java/com/google/ant/extensions/types/resources/project/d/d2/build.xml
Log:
* New algorithm for the module resolver and conflicts finding
--____________--
M src/test/java/com/google/ant/extensions/types/ResolverTest.java
A
src/test/java/com/google/ant/extensions/types/resources/project/c/c1/build.xml
A
src/test/java/com/google/ant/extensions/types/resources/project/c/c2/build.xml
M
src/test/java/com/google/ant/extensions/types/resources/project/d/d1/build.xml
M
src/test/java/com/google/ant/extensions/types/resources/project/d/d2/build.xml
M src/main/java/com/google/ant/extensions/types/Resolver.java
M src/main/java/com/google/ant/extensions/types/Modules.java
M src/main/java/com/google/ant/extensions/tasks/DrillTask.java
Modified: trunk/src/main/java/com/google/ant/extensions/tasks/DrillTask.java
==============================================================================
--- trunk/src/main/java/com/google/ant/extensions/tasks/DrillTask.java
(original)
+++ trunk/src/main/java/com/google/ant/extensions/tasks/DrillTask.java Tue
Sep 9 04:59:27 2008
@@ -2,6 +2,7 @@
import java.io.File;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.Enumeration;
import java.util.Vector;
@@ -170,8 +171,10 @@
throw new BuildException("No modules specified");
}
- Collection<Module> builds = new Resolver().resolve(modules.list());
+ Collection<Module> builds = new ArrayList<Module>();
+ new Resolver().resolve2(modules.listAll(), builds, 0);
+ //System.out.println(builds);
printStarter(builds);
if (builds.size() < 1) {
Modified: trunk/src/main/java/com/google/ant/extensions/types/Modules.java
==============================================================================
--- trunk/src/main/java/com/google/ant/extensions/types/Modules.java
(original)
+++ trunk/src/main/java/com/google/ant/extensions/types/Modules.java Tue
Sep 9 04:59:27 2008
@@ -60,6 +60,7 @@
public List<Module> list() {
List<Module> builds = new ArrayList<Module>();
SourceRepo repo = new SourceRepo(getProject());
+
for (Iterator iter = modules.iterator(); iter.hasNext();) {
Module module = (Module) iter.next();
boolean hasSubModules = hasSubModules(module);
@@ -106,6 +107,24 @@
module.selfRegister();
}
return builds;
+ }
+
+ public List<Module> listAll() {
+ List<Module> allModules = new ArrayList<Module>();
+ for (Module m : list()) {
+ allModules.add(m);
+ for (Module m2 : m.getDependencies()) {
+ if (!allModules.contains(m2)) {
+ allModules.add(m2);
+ }
+ }
+ }
+
+ for (Module module : allModules) {
+ module.selfRegister();
+ }
+
+ return allModules;
}
public String toString() {
Modified: trunk/src/main/java/com/google/ant/extensions/types/Resolver.java
==============================================================================
--- trunk/src/main/java/com/google/ant/extensions/types/Resolver.java
(original)
+++ trunk/src/main/java/com/google/ant/extensions/types/Resolver.java Tue
Sep 9 04:59:27 2008
@@ -2,10 +2,77 @@
import java.util.ArrayList;
import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
import java.util.Stack;
+
import org.apache.tools.ant.BuildException;
public class Resolver {
+ private Map<Module, Collection<Module>> depModulesMap = new
HashMap<Module, Collection<Module>>();
+
+ public void resolve2(Collection<Module> modules, Collection<Module>
results, int lastResultsCount) {
+ Collection<Module> toRemove = new ArrayList<Module>();
+
+ for (Module module : modules) {
+ //System.out.println("*** " + module +
module.getDependencies());
+ if (!depModulesMap.containsKey(module)) {
+ Collection<Module> depModules = new ArrayList<Module>();
+ depModules.addAll(module.getDependencies());
+ depModulesMap.put(module, depModules);
+ }
+
+ Collection<Module> depModules = depModulesMap.get(module);
+
+ if (depModules.isEmpty()) {
+ toRemove.add(module);
+ results.add(module);
+ }
+
+ if (depModules.size() == 1 &&
results.contains(depModules.iterator().next())) {
+ toRemove.add(module);
+ results.add(module);
+ }
+ if (depModules.size() > 1) {
+ removeDependency(depModules, results);
+ }
+ }
+
+ //System.out.println("to remove: " + toRemove);
+ //System.out.println("results: " + results);
+
+ if (lastResultsCount == results.size()) {
+ checkCycleDependencies(modules);
+ }
+
+ for (Module m : toRemove) {
+ modules.remove(m);
+ }
+
+ if (!modules.isEmpty()) {
+ resolve2(modules, results, results.size());
+ }
+ }
+
+ private void checkCycleDependencies(Collection<Module> modules) {
+ Stack<Module> s = new Stack<Module>();
+ s.addAll(modules);
+ String message = "You have a cyclic dependency : " + printGraph(s,
modules.iterator().next());
+ throw new BuildException(message);
+ }
+
+ private void removeDependency(Collection<Module> depModules,
Collection<Module> results) {
+ Collection<Module> toRemove = new ArrayList<Module>();
+ for (Module m : depModules) {
+ if (results.contains(m)) {
+ toRemove.add(m);
+ }
+ }
+ for (Module m : toRemove) {
+ depModules.remove(m);
+ }
+ }
+
public Collection<Module> resolve(Collection<Module> modules) {
Collection<Module> results = new ArrayList<Module>();
Stack<Module> stack1 = new Stack<Module>();
Modified:
trunk/src/test/java/com/google/ant/extensions/types/ResolverTest.java
==============================================================================
--- trunk/src/test/java/com/google/ant/extensions/types/ResolverTest.java
(original)
+++ trunk/src/test/java/com/google/ant/extensions/types/ResolverTest.java
Tue Sep 9 04:59:27 2008
@@ -1,5 +1,6 @@
package com.google.ant.extensions.types;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
@@ -11,6 +12,7 @@
import org.junit.Before;
import org.junit.Test;
+
public class ResolverTest extends TestBase {
String oldFantHome;
String projectBase;
@@ -90,6 +92,71 @@
} catch (Exception e) {
assertTrue(e instanceof BuildException);
assertEquals("You have a cyclic dependency : d2 <-- d1 <--
d2", e.getMessage());
+ }
+ }
+
+ @Test
+ public void testResolve2() throws Exception {
+ String bBase = getLocation("resources/project/b/");
+ String cBase = getLocation("resources/project/c/");
+
+ new SourceRepo().add("test**b1**1.0|" + bBase + "b1|build.xml|b1");
+ new SourceRepo().add("test**b2**1.0|" + bBase + "b2|build.xml|b2");
+ new SourceRepo().add("test**c1**1.0|" + cBase + "c1|build.xml|c1");
+ new SourceRepo().add("test**c2**1.0|" + cBase + "c2|build.xml|c2");
+
+ Module m2 = new Module();
+ m2.setName("b2");
+
+ Modules modules = new Modules();
+ modules.setBuilddep(true);
+ modules.addModule(m2);
+
+ Project project = new Project();
+ project.setBasedir(getLocation("resources/project/b"));
+ modules.setProject(project);
+
+ Collection<Module> builds = modules.listAll();
+ Collection<Module> results = new ArrayList<Module>();
+
+ new Resolver().resolve2(builds, results, 0);
+
+ assertEquals(4, results.size());
+
+ Iterator<Module> iterator = results.iterator();
+ assertEquals("b1", iterator.next().getName());
+ assertEquals("c2", iterator.next().getName());
+ assertEquals("c1", iterator.next().getName());
+ assertEquals("b2", iterator.next().getName());
+ }
+
+ @Test
+ public void testCyclic2() throws Exception {
+ String bBase = getLocation("resources/project/d/");
+
+ new SourceRepo().add("test**d1**1.0|" + bBase + "d1|build.xml|d1");
+ new SourceRepo().add("test**d2**1.0|" + bBase + "d2|build.xml|d2");
+
+ Module m2 = new Module();
+ m2.setName("d2");
+
+ Modules modules = new Modules();
+ modules.setBuilddep(true);
+ modules.addModule(m2);
+
+ Project project = new Project();
+ project.setBasedir(getLocation("resources/project/d"));
+ modules.setProject(project);
+
+ Collection<Module> builds = modules.list();
+ assertEquals(2, builds.size());
+
+ Collection<Module> results = new ArrayList<Module>();
+ try {
+ new Resolver().resolve2(builds, results, 0);
+ } catch (Exception e) {
+ assertTrue(e instanceof BuildException);
+ assertEquals("You have a cyclic dependency : d1 <-- d2 <--
d1", e.getMessage());
}
}
}
Added:
trunk/src/test/java/com/google/ant/extensions/types/resources/project/c/c1/build.xml
==============================================================================
--- (empty file)
+++
trunk/src/test/java/com/google/ant/extensions/types/resources/project/c/c1/build.xml
Tue Sep 9 04:59:27 2008
@@ -0,0 +1,2 @@
+<project name="c1">
+</project>
\ No newline at end of file
Added:
trunk/src/test/java/com/google/ant/extensions/types/resources/project/c/c2/build.xml
==============================================================================
--- (empty file)
+++
trunk/src/test/java/com/google/ant/extensions/types/resources/project/c/c2/build.xml
Tue Sep 9 04:59:27 2008
@@ -0,0 +1,2 @@
+<project name="c2">
+</project>
\ No newline at end of file
Modified:
trunk/src/test/java/com/google/ant/extensions/types/resources/project/d/d1/build.xml
==============================================================================
---
trunk/src/test/java/com/google/ant/extensions/types/resources/project/d/d1/build.xml
(original)
+++
trunk/src/test/java/com/google/ant/extensions/types/resources/project/d/d1/build.xml
Tue Sep 9 04:59:27 2008
@@ -0,0 +1,2 @@
+<project name="d1">
+</project>
\ No newline at end of file
Modified:
trunk/src/test/java/com/google/ant/extensions/types/resources/project/d/d2/build.xml
==============================================================================
---
trunk/src/test/java/com/google/ant/extensions/types/resources/project/d/d2/build.xml
(original)
+++
trunk/src/test/java/com/google/ant/extensions/types/resources/project/d/d2/build.xml
Tue Sep 9 04:59:27 2008
@@ -0,0 +1,2 @@
+<project name="d2">
+</project>
\ No newline at end of file