Do you have a concrete use case for this feature?  Based on the the example,
I didn't catch it directly.  Maybe a real example combining 2 real axes
(other than 'color') would help.


Gilles Scokart


2009/6/28 <xav...@apache.org>

> 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