Author: xavier
Date: Sun Jun 28 13:02:10 2009
New Revision: 789095

URL: http://svn.apache.org/viewvc?rev=789095&view=rev
Log:
NEW: configuration groups (IVY-1097)

Added:
    
ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/ConfigurationGroup.java
   (with props)
    ant/ivy/core/trunk/test/repositories/2/mod5.1/art51B-4.5.dll   (with props)
    ant/ivy/core/trunk/test/repositories/2/mod5.1/art51B-4.5.jar   (with props)
    ant/ivy/core/trunk/test/repositories/2/mod5.1/art51B-4.5.so   (with props)
    ant/ivy/core/trunk/test/repositories/2/mod5.1/ivy-4.5.xml   (with props)
    ant/ivy/core/trunk/test/repositories/2/mod5.2/ivy-3.1.xml   (with props)
Modified:
    ant/ivy/core/trunk/CHANGES.txt
    ant/ivy/core/trunk/doc/ivyfile/dependency.html
    
ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/DefaultDependencyDescriptor.java
    
ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/DefaultModuleDescriptor.java
    ant/ivy/core/trunk/test/java/org/apache/ivy/core/resolve/ResolveTest.java

Modified: ant/ivy/core/trunk/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/ant/ivy/core/trunk/CHANGES.txt?rev=789095&r1=789094&r2=789095&view=diff
==============================================================================
--- ant/ivy/core/trunk/CHANGES.txt (original)
+++ ant/ivy/core/trunk/CHANGES.txt Sun Jun 28 13:02:10 2009
@@ -90,6 +90,7 @@
    trunk
 =====================================
 - NEW: configuration intersections (IVY-1093)
+- NEW: configuration groups (IVY-1097)
 
 - IMPROVEMENT: Added support for NTLM authentication (IVY-1094) (thanks to 
Mathieu Anquetin)
 - IMPROVEMENT: Standalone runner should accept all the same parameters as ant 
tasks (IVY-1090)

Modified: ant/ivy/core/trunk/doc/ivyfile/dependency.html
URL: 
http://svn.apache.org/viewvc/ant/ivy/core/trunk/doc/ivyfile/dependency.html?rev=789095&r1=789094&r2=789095&view=diff
==============================================================================
--- ant/ivy/core/trunk/doc/ivyfile/dependency.html (original)
+++ ant/ivy/core/trunk/doc/ivyfile/dependency.html Sun Jun 28 13:02:10 2009
@@ -33,12 +33,14 @@
 The revision can be given as a fixed one (1.5.2, for instance) or as a latest 
(or dynamic) one. Several possibilities for dynamic revisions are implemented 
in Ivy:
 <ul>
 <li>latest.integration</li> selects the latest revision of the dependency 
module.
-<li>latest.[any status]</li> selects the latest revision of the dependency 
module with at least the specified status. <span class="since">since 1.4</span>
+<li>latest.[any status] <span class="since">since 1.4</span></li> selects the 
latest revision of the dependency module with at least the specified status. 
+
 For instance latest.milestone will select the latest version being either a 
milestone or a release, and latest.release will only selects the latest 
release. Note that in order to find the latest revision with the appropriate 
status Ivy has to parse all the ivy files in your repository from the last one 
until it finds such a revision. Hence don't be surprised if the resolution slow 
down.
 See also [[settings/statuses]] to see how to configure module statuses.
 <li>end the revision with a +</li> selects the latest sub-revision of the 
dependency module. For instance, 
 if the dependency module exists in revision 1.0.3, 1.0.7 and 1.1.2, "1.0.+" 
will select 1.0.7.
-<li>version ranges</li> mathematical notation for ranges can be used to match 
a range of version. <span class="since">since 1.4</span>  
+<li>version ranges <span class="since">since 1.4</span></li> mathematical 
notation for ranges can be used to match a range of version.   
+
 Examples:
 [1.0,2.0] matches all versions greater or equal to 1.0 and lower or equal to 
2.0
 [1.0,2.0[ matches all versions greater or equal to 1.0 and lower than 2.0
@@ -116,7 +118,30 @@
 
 Moreover, the mapping '*->@' is handled as a specific case with configuration 
intersections: it maps also the intersections. So if one resolve conf A+B in a 
module which defines a dependency with mapping *->@, the mapping *->@ is 
interpreted as A+B->A+B so the intersection of A and B will be resolved in the 
dependency.
 
-<span class="since">since 1.4</span> you can add simple conditions in the 
dependency mapping. This is done by adding a condition between '[' and ']'. If 
the condition evaluates to <code>true</code>, the mapping is performed. If the 
condition evaluates to <code>false</code>, the mapping will be ignored. For 
instance, <code>test->[org=A]runtime,[org=B]default</code> means that the 
<code>test</code> configuration will be mapped to the <code>runtime</code> conf 
for the dependencies of organisation 'A' and to the <code>default</code> conf 
for dependencies of organisation 'B'.
+<span class="since">since 2.1</span> you can refer to a group of 
configurations sharing the same value for an attribute as left side part of the 
dependency mapping. 
+
+The syntax is 
+<code>*[att=value]</code>
+where <em>att</em> is the name of the attribute shared by the configurations 
of the group, and <em>value</em is the value for this attribute that 
configurations must have to be part of the group. This is especially useful 
with extra attributes.
+
+For instance, if you have:
+<code>
+<configurations>
+       <conf name="red" e:axis="color" />
+       <conf name="blue" e:axis="color" />
+               
+       <conf name="windows" e:axis="platform" />
+       <conf name="linux" e:axis="platform"/>
+</configurations>
+</code>
+
+Then you can do:
+<code>
+<dependency org="acme" name="foo" rev="2.0" conf="*[axis=platform]->default"/>
+</code>
+To map the windows and linux configurations (the one which have the attribute 
axis equal to platform) to the default configuration of foo.
+
+<span class="since">since 1.4</span> you can add simple conditions in the 
right side of the dependency mapping. This is done by adding a condition 
between '[' and ']'. If the condition evaluates to <code>true</code>, the 
mapping is performed. If the condition evaluates to <code>false</code>, the 
mapping will be ignored. For instance, 
<code>test->[org=A]runtime,[org=B]default</code> means that the 
<code>test</code> configuration will be mapped to the <code>runtime</code> conf 
for the dependencies of organisation 'A' and to the <code>default</code> conf 
for dependencies of organisation 'B'.
 
 <li>Specify a semi-column separated list of any of the previous specs.</li> In 
this case, it is the union of the mapping which is kept. For instance, 'A -> B; 
* -> C' means that B conf is needed in A conf and C conf is need in all master 
conf... so both B & C dep conf are required in A master conf
 </ul>

Added: 
ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/ConfigurationGroup.java
URL: 
http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/ConfigurationGroup.java?rev=789095&view=auto
==============================================================================
--- 
ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/ConfigurationGroup.java
 (added)
+++ 
ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/ConfigurationGroup.java
 Sun Jun 28 13:02:10 2009
@@ -0,0 +1,72 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.ivy.core.module.descriptor;
+
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * A configuration which is actually a group of several configurations.
+ */
+public class ConfigurationGroup extends Configuration {
+
+    private final Map/*<String, Configuration>*/ members;
+
+    public ConfigurationGroup(String confName, Map /*<String, Configuration>*/ 
members) {
+        super(confName);
+        this.members = members;
+    }
+
+    /**
+     * Returns the list of configurations' names this object is a group of.
+     * <p>
+     * This list is built from the configuration name, if some of these 
configuration names have
+     * actually not been recognized in the module, they will be 
<code>null</code> when accessed from
+     * {...@link #getIntersectedConfiguration(String)}.
+     * </p>
+     * 
+     * @return the list of configurations' names this object is an 
intersection of.
+     */
+    public String[] getMembersConfigurationNames() {
+        return (String[]) members.keySet()
+                    .toArray(new String[members.size()]);
+    }
+
+    /**
+     * Returns the {...@link Configuration} object for the given conf name, or
+     * <code>null</code> if the given conf name is not part of this group or 
if this conf
+     * name isn't defined in the module in which this group has been built.
+     * 
+     * @param confName
+     *            the name of the configuration to return.
+     * @return the member {...@link Configuration} object for the given conf 
name
+     */
+    public Configuration getMemberConfiguration(String confName) {
+        return (Configuration) members.get(confName);
+    }
+    
+    public Visibility getVisibility() {
+        for (Iterator it = members.values().iterator(); it.hasNext();) {
+            Configuration c = (Configuration) it.next();
+            if (c != null && Visibility.PRIVATE.equals(c.getVisibility())) {
+                return Visibility.PRIVATE;
+            }
+        }
+        return Visibility.PUBLIC;
+    }
+}

Propchange: 
ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/ConfigurationGroup.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: 
ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/DefaultDependencyDescriptor.java
URL: 
http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/DefaultDependencyDescriptor.java?rev=789095&r1=789094&r2=789095&view=diff
==============================================================================
--- 
ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/DefaultDependencyDescriptor.java
 (original)
+++ 
ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/DefaultDependencyDescriptor.java
 Sun Jun 28 13:02:10 2009
@@ -305,20 +305,37 @@
                         }
                     }
                 }
+                List confsList = (List) confs.get(moduleConfiguration);
+                if (confsList != null) {
+                    intersectedDepConfs.addAll(confsList);
+                }
                 if (intersectedDepConfs.isEmpty()) {
                     List defConfs = (List) confs.get("*");
                     if (defConfs != null) {
                         for (Iterator it = defConfs.iterator(); it.hasNext();) 
{
                             String mappedConf = (String) it.next();
                             if (mappedConf != null && 
mappedConf.startsWith("@+")) {
-                                return new String[] {moduleConfiguration + 
mappedConf.substring(1)};
+                                return new String[] {
+                                        moduleConfiguration + 
mappedConf.substring(1)};
                             } else if (mappedConf != null && 
mappedConf.equals("@")) {
                                 return new String[] {moduleConfiguration};
                             }
                         }
                     }
                 }
-                return (String[]) intersectedDepConfs.toArray(new 
String[intersectedDepConfs.size()]);
+                return (String[]) intersectedDepConfs.toArray(
+                            new String[intersectedDepConfs.size()]);
+            } else if (c instanceof ConfigurationGroup) {
+                ConfigurationGroup group = (ConfigurationGroup) c;
+                Set /*<String>*/ groupDepConfs = new HashSet();
+                String[] members = group.getMembersConfigurationNames();
+                for (int i = 0; i < members.length; i++) {
+                    Collection depConfs = 
+                         getDependencyConfigurationsIncludingExtending(
+                             members[i], requestedConfiguration);
+                    groupDepConfs.addAll(depConfs);
+                }
+                return (String[]) groupDepConfs.toArray(new 
String[groupDepConfs.size()]);
             }
         }
         
@@ -532,6 +549,14 @@
                     + "' to configuration '" + masterConf + "' of module "
                     + md.getModuleRevisionId() + " because this configuration 
doesn't exist!");
             }
+            if (config instanceof ConfigurationGroup) {
+                ConfigurationGroup group = (ConfigurationGroup) config;
+                String[] members = group.getMembersConfigurationNames();
+                for (int i = 0; i < members.length; i++) {
+                    addDependencyConfiguration(members[i], depConf);
+                }
+                return;
+            }
         }
 
         List confsList = (List) confs.get(masterConf);

Modified: 
ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/DefaultModuleDescriptor.java
URL: 
http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/DefaultModuleDescriptor.java?rev=789095&r1=789094&r2=789095&view=diff
==============================================================================
--- 
ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/DefaultModuleDescriptor.java
 (original)
+++ 
ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/DefaultModuleDescriptor.java
 Sun Jun 28 13:02:10 2009
@@ -23,7 +23,6 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -33,6 +32,8 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.Stack;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import org.apache.ivy.core.module.id.ArtifactId;
 import org.apache.ivy.core.module.id.ModuleId;
@@ -337,19 +338,27 @@
      * @param artifact
      */
     public void addArtifact(String conf, Artifact artifact) {
-        if (!configurations.containsKey(conf)) {
+        Configuration c = getConfiguration(conf);
+        if (c == null) {
             throw new IllegalArgumentException("Cannot add artifact '" + 
artifact.getId().getArtifactId().getShortDescription()
                     + "' to configuration '" + conf + "' of module " + revId 
                     + " because this configuration doesn't exist!");
         }
-
-        Collection artifacts = (Collection) artifactsByConf.get(conf);
-        if (artifacts == null) {
-            artifacts = new ArrayList();
-            artifactsByConf.put(conf, artifacts);
+        if (c instanceof ConfigurationGroup) {
+            ConfigurationGroup group = (ConfigurationGroup) c;
+            String[] members = group.getMembersConfigurationNames();
+            for (int i = 0; i < members.length; i++) {
+                addArtifact(members[i], artifact);
+            }
+        } else {
+            Collection artifacts = (Collection) artifactsByConf.get(conf);
+            if (artifacts == null) {
+                artifacts = new ArrayList();
+                artifactsByConf.put(conf, artifacts);
+            }
+            artifacts.add(artifact);
+            this.artifacts.add(artifact);
         }
-        artifacts.add(artifact);
-        this.artifacts.add(artifact);
     }
 
     public ModuleRevisionId getModuleRevisionId() {
@@ -391,6 +400,23 @@
     public Configuration getConfiguration(String confName) {
         Configuration configuration = (Configuration) 
configurations.get(confName);
         if (configuration == null && confName != null) {
+            // let's first check if the configuration is a conf group
+            Matcher m = 
Pattern.compile("\\*\\[([^=]+)\\=([^\\]]+)\\]").matcher(confName);
+            if (m.matches()) {
+                String attName = m.group(1);
+                String attValue = m.group(2);
+
+                // this is a conf group, let's search for its members
+                Map /*<String,Configuration>*/ members = new LinkedHashMap();
+                for (Iterator it = configurations.values().iterator(); 
it.hasNext();) {
+                    Configuration conf = (Configuration) it.next();
+                    if (attValue.equals(conf.getAttribute(attName))) {
+                        members.put(conf.getName(), conf);
+                    }
+                }
+                return new ConfigurationGroup(confName, members);
+            }
+            
             // let's see if a configuration intersection is requested
             String[] confs = confName.split("\\+");
             if (confs.length <= 1) {
@@ -413,32 +439,51 @@
     }
 
     public Artifact[] getArtifacts(String conf) {
+        Configuration c = getConfiguration(conf);
+        if (c == null) {
+            return new Artifact[0];
+        }
         Collection artifacts = (Collection) artifactsByConf.get(conf);
-        if (artifacts == null) {
-            Configuration c = getConfiguration(conf);
-            if (c instanceof ConfigurationIntersection) {
-                ConfigurationIntersection intersection = 
(ConfigurationIntersection) c;
-                String[] intersected = 
intersection.getIntersectedConfigurationNames();
-                Set/*<Artifact>*/ intersectedArtifacts = new LinkedHashSet();
-                for (int j = 0; j < intersected.length; j++) {
-                    Collection arts = 
getArtifactsIncludingExtending(intersected[j]);
-                    if (intersectedArtifacts.isEmpty()) {
-                        intersectedArtifacts.addAll(arts);
-                    } else {
-                        intersectedArtifacts.retainAll(arts);
-                    }
+        if (c instanceof ConfigurationIntersection) {
+            ConfigurationIntersection intersection = 
(ConfigurationIntersection) c;
+            String[] intersected = 
intersection.getIntersectedConfigurationNames();
+            Set/*<Artifact>*/ intersectedArtifacts = new LinkedHashSet();
+            for (int j = 0; j < intersected.length; j++) {
+                Collection arts = 
getArtifactsIncludingExtending(intersected[j]);
+                if (intersectedArtifacts.isEmpty()) {
+                    intersectedArtifacts.addAll(arts);
+                } else {
+                    intersectedArtifacts.retainAll(arts);
                 }
-                return (Artifact[]) intersectedArtifacts.toArray(new 
Artifact[intersectedArtifacts.size()]);
-            } else {
-                return new Artifact[0];
             }
+            if (artifacts != null) {
+                intersectedArtifacts.addAll(artifacts);
+            }
+            return (Artifact[]) intersectedArtifacts.toArray(
+                new Artifact[intersectedArtifacts.size()]);
+        } else if (c instanceof ConfigurationGroup) {
+            ConfigurationGroup group = (ConfigurationGroup) c;
+            String[] members = group.getMembersConfigurationNames();
+            Set/*<Artifact>*/ groupArtifacts = new LinkedHashSet();
+            for (int i = 0; i < members.length; i++) {
+                
groupArtifacts.addAll(getArtifactsIncludingExtending(members[i]));
+            }
+            if (artifacts != null) {
+                groupArtifacts.addAll(artifacts);
+            }
+            return (Artifact[]) groupArtifacts.toArray(new 
Artifact[groupArtifacts.size()]);
         } else {
-            return (Artifact[]) artifacts.toArray(new 
Artifact[artifacts.size()]);
+            if (artifacts == null) {
+                return new Artifact[0];
+            } else {
+                return (Artifact[]) artifacts.toArray(new 
Artifact[artifacts.size()]);
+            }
         }
     }
 
     private Collection/*<Artifact>*/ getArtifactsIncludingExtending(String 
conf) {
-        Collection extendingConfs = 
Configuration.findConfigurationExtending(conf, getConfigurations());
+        Collection extendingConfs = Configuration.findConfigurationExtending(
+                                                            conf, 
getConfigurations());
         Set/*<Artifact>*/ artifacts = new LinkedHashSet();
         Collection arts = (Collection) artifactsByConf.get(conf);
         if (arts != null) {

Modified: 
ant/ivy/core/trunk/test/java/org/apache/ivy/core/resolve/ResolveTest.java
URL: 
http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/java/org/apache/ivy/core/resolve/ResolveTest.java?rev=789095&r1=789094&r2=789095&view=diff
==============================================================================
--- ant/ivy/core/trunk/test/java/org/apache/ivy/core/resolve/ResolveTest.java 
(original)
+++ ant/ivy/core/trunk/test/java/org/apache/ivy/core/resolve/ResolveTest.java 
Sun Jun 28 13:02:10 2009
@@ -3747,6 +3747,31 @@
         assertFalse(getArchiveFileInCache("org2", "mod2.8", "0.6", 
"art28-windows-debug", "jar", "jar").exists());
     }
 
+    public void testConfigurationGroups() throws Exception {
+        // mod5.2;3.1 -> mod5.1;4.5 (*->@)
+        // mod5.1;4.5 -> mod1.2;2.0 (B,*[axis=platform]->default)
+        // mod5.1;4.5 -> mod2.2;0.9 (B,windows->myconf1;B,linux->myconf2)
+        // mod5.1;4.5 -> mod2.1;0.5 (B,windows->A+B)
+        // mod5.1;4.5 -> mod2.8;0.6 (windows,linux->@+thread+debug;A,B->*)
+        ivy.resolve(new File("test/repositories/2/mod5.2/ivy-3.1.xml").toURL(),
+            getResolveOptions(new String[] {"B+linux"}));
+
+        assertFalse(getArchiveFileInCache("org5", "mod5.1", "4.5", "art51A", 
"jar", "jar").exists());
+        assertTrue(getArchiveFileInCache("org5", "mod5.1", "4.5", "art51B", 
"jar", "jar").exists());
+        assertFalse(getArchiveFileInCache("org5", "mod5.1", "4.5", "art51B", 
"dll", "dll").exists());
+        assertTrue(getArchiveFileInCache("org5", "mod5.1", "4.5", "art51B", 
"so", "so").exists());
+        assertTrue(getArchiveFileInCache("org1", "mod1.2", "2.0", "mod1.2", 
"jar", "jar").exists());
+        assertFalse(getArchiveFileInCache("org2", "mod2.2", "0.9", "art22-1", 
"jar", "jar").exists());
+        assertTrue(getArchiveFileInCache("org2", "mod2.2", "0.9", "art22-2", 
"jar", "jar").exists());
+        assertFalse(getArchiveFileInCache("org2", "mod2.1", "0.5", "art21A", 
"jar", "jar").exists());
+        assertFalse(getArchiveFileInCache("org2", "mod2.1", "0.5", "art21B", 
"jar", "jar").exists());
+        assertFalse(getArchiveFileInCache("org2", "mod2.1", "0.5", "art21AB", 
"jar", "jar").exists());
+        assertTrue(getArchiveFileInCache("org2", "mod2.8", "0.6", 
"art28-linux-debug-thread", "jar", "jar").exists());
+        assertFalse(getArchiveFileInCache("org2", "mod2.8", "0.6", 
"art28-linux-debug", "jar", "jar").exists());
+        assertFalse(getArchiveFileInCache("org2", "mod2.8", "0.6", 
"art28-windows-debug-thread", "jar", "jar").exists());
+        assertFalse(getArchiveFileInCache("org2", "mod2.8", "0.6", 
"art28-windows-debug", "jar", "jar").exists());
+    }
+
     public void testResolveFallbackConfiguration() throws Exception {
         // mod10.2 depends on mod5.1 conf runtime(default)
         ivy.resolve(new 
File("test/repositories/2/mod10.2/ivy-1.0.xml").toURL(),

Added: ant/ivy/core/trunk/test/repositories/2/mod5.1/art51B-4.5.dll
URL: 
http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/repositories/2/mod5.1/art51B-4.5.dll?rev=789095&view=auto
==============================================================================
Binary file - no diff available.

Propchange: ant/ivy/core/trunk/test/repositories/2/mod5.1/art51B-4.5.dll
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: ant/ivy/core/trunk/test/repositories/2/mod5.1/art51B-4.5.jar
URL: 
http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/repositories/2/mod5.1/art51B-4.5.jar?rev=789095&view=auto
==============================================================================
Binary file - no diff available.

Propchange: ant/ivy/core/trunk/test/repositories/2/mod5.1/art51B-4.5.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: ant/ivy/core/trunk/test/repositories/2/mod5.1/art51B-4.5.so
URL: 
http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/repositories/2/mod5.1/art51B-4.5.so?rev=789095&view=auto
==============================================================================
Binary file - no diff available.

Propchange: ant/ivy/core/trunk/test/repositories/2/mod5.1/art51B-4.5.so
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: ant/ivy/core/trunk/test/repositories/2/mod5.1/ivy-4.5.xml
URL: 
http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/repositories/2/mod5.1/ivy-4.5.xml?rev=789095&view=auto
==============================================================================
--- ant/ivy/core/trunk/test/repositories/2/mod5.1/ivy-4.5.xml (added)
+++ ant/ivy/core/trunk/test/repositories/2/mod5.1/ivy-4.5.xml Sun Jun 28 
13:02:10 2009
@@ -0,0 +1,45 @@
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one
+   or more contributor license agreements.  See the NOTICE file
+   distributed with this work for additional information
+   regarding copyright ownership.  The ASF licenses this file
+   to you under the Apache License, Version 2.0 (the
+   "License"); you may not use this file except in compliance
+   with the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing,
+   software distributed under the License is distributed on an
+   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+   KIND, either express or implied.  See the License for the
+   specific language governing permissions and limitations
+   under the License.    
+-->
+<ivy-module version="1.0" xmlns:e="http://ant.apache.org/ivy/extra";>
+       <info organisation="org5"
+              module="mod5.1"
+              revision="4.5"
+              status="integration"
+              publication="20090501110000"
+       />
+       <configurations>
+               <conf name="A" />
+               <conf name="B" />
+               
+               <conf name="windows" e:axis="platform" />
+               <conf name="linux" e:axis="platform"/>
+       </configurations>
+       <publications>
+               <artifact name="art51A" type="jar" conf="A,*[axis=platform]"/>
+               <artifact name="art51B" type="jar" conf="B,*[axis=platform]"/>
+               <artifact name="art51B" type="dll" conf="B,windows"/>
+               <artifact name="art51B" type="so" conf="B,linux"/>
+       </publications>
+       <dependencies>
+               <dependency org="org1" name="mod1.2" rev="2.0" 
conf="B,*[axis=platform]->default"/>
+               <dependency org="org2" name="mod2.2" rev="0.9" 
conf="B,windows->myconf1;B,linux->myconf2"/>
+               <dependency org="org2" name="mod2.1" rev="0.5" 
conf="B,windows->A+B"/>
+               <dependency org="org2" name="mod2.8" rev="0.6" 
conf="windows,linux->@+thread+debug;A,B->*"/>
+       </dependencies>
+</ivy-module>

Propchange: ant/ivy/core/trunk/test/repositories/2/mod5.1/ivy-4.5.xml
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: ant/ivy/core/trunk/test/repositories/2/mod5.2/ivy-3.1.xml
URL: 
http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/repositories/2/mod5.2/ivy-3.1.xml?rev=789095&view=auto
==============================================================================
--- ant/ivy/core/trunk/test/repositories/2/mod5.2/ivy-3.1.xml (added)
+++ ant/ivy/core/trunk/test/repositories/2/mod5.2/ivy-3.1.xml Sun Jun 28 
13:02:10 2009
@@ -0,0 +1,37 @@
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one
+   or more contributor license agreements.  See the NOTICE file
+   distributed with this work for additional information
+   regarding copyright ownership.  The ASF licenses this file
+   to you under the Apache License, Version 2.0 (the
+   "License"); you may not use this file except in compliance
+   with the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing,
+   software distributed under the License is distributed on an
+   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+   KIND, either express or implied.  See the License for the
+   specific language governing permissions and limitations
+   under the License.    
+-->
+<ivy-module version="1.0">
+       <info organisation="org5"
+              module="mod5.2"
+              revision="3.1"
+              status="integration"
+              publication="20090601110000"
+       />
+       <configurations>
+               <conf name="A"/>
+               <conf name="B"/>
+               
+               <conf name="windows"/>
+               <conf name="linux"/>
+       </configurations>
+       <publications />
+       <dependencies>
+               <dependency name="mod5.1" rev="4.5" conf="*->@"/>
+       </dependencies>
+</ivy-module>

Propchange: ant/ivy/core/trunk/test/repositories/2/mod5.2/ivy-3.1.xml
------------------------------------------------------------------------------
    svn:mime-type = text/plain


Reply via email to