More than one rule matched while retrieving parent POM
------------------------------------------------------
Key: IVY-1154
URL: https://issues.apache.org/jira/browse/IVY-1154
Project: Ivy
Issue Type: Bug
Affects Versions: 2.1.0
Environment: Windows 7, Sun JDK 1.6.0_16, Ant 1.7.1
Reporter: Ryan Saunders
In trying to build an Ivy repository with a sensible org/module hierarchy, I
seem to have stumbled over a bug in the namespace translation code. In the
following Ivy configuration, I'm trying to map all apache commons projects into
the "org.apache.commons" organization, locally, even though many of them have
the module name as the org name in the maven2 repo. The second and third rules
in this namespace _ought_ to be equivalent in their effect, but they are
not...if I use the rule with the regex, it appears to match the
"commons-parent", which it shouldn't, because commons-parent is matched by the
first rule in the namespace ("chainrules" is false).
If you comment out rule #3 and uncomment rule #2, it works just fine, because
rule #2 cannot match "commons-parent".
{code:xml|title=ivysettings.xml}
<ivysettings>
<property name="ibiblio-maven2-root" value="http://repo1.maven.org/maven2/"
override="false" />
<!--
The ibiblio Maven2 repository has some funky historical ways of organizing
projects. Specifically, Apache
projects are not filed under "org.apache", as you'd expect them to
be...instead, the org name is the name
of the project (e.g., "commons-lang"). This namespace definition converts
all known Apache projects to the
more normal organization, by mapping them to an org name of "org.apache".
-->
<namespaces>
<namespace name="ibiblio-maven2">
<!-- After a certain point in time, it appears that new Apache projects
were properly placed under
org/apache/... commons-parent is one of these. This rule should
match any request for
org.apache.commons#commons-parent;*. It is first in the list because
we want it to match commons-parent,
rather than the commons-.+ regex of the next rule. -->
<rule>
<fromsystem>
<src org="org\.apache\.commons" module="commons-parent"/>
<dest org="org.apache.commons" module="$m0"/>
</fromsystem>
<tosystem>
<src org="org\.apache\.commons" module="commons-parent"/>
<dest org="org.apache.commons" module="$m0"/>
</tosystem>
</rule>
<!-- ALTERNATIVE #1: THIS WORKS
commons-math, on the other hand, lives in the "old" place, with the
module name instead of the org name
as the directory. If I write a rule that specifically translates
org.apache.commons#commons-math;* into
"commons-math"/"commons-math", everything works fine, and we can
resolve both commons-math and also
commons-parent. -->
<!--rule>
<fromsystem>
<src org="org\.apache\.commons" module="commons-math"/>
<src org="org\.apache\.commons" module="commons-logging"/>
<src org="org\.apache\.commons" module="commons-discovery"/>
<dest org="$m0" module="$m0"/>
</fromsystem>
<tosystem>
<src org="commons-math" module="commons-math"/>
<src org="commons-logging" module="commons-logging"/>
<src org="commons-discovery" module="commons-discovery"/>
<dest org="org.apache.commons" module="$m0"/>
</tosystem>
</rule-->
<!-- ALTERNATIVE #2: WHY ISN'T THIS EQUIVALENT TO #1?
Things go to crap, on the other hand, if I try to use a regex to
match any commons- prefixed project.
In theory, since I put an explicit rule to match commons-parent
earlier in the rule sequence, commons-parent
should never get to here. In practice, it seems to, and the lookup
for commons-parent fails, because it's
looking for
http://repo.whatever.org/commons-parent/commons-parent/7/commons-parent-7.pom,
which does not
exist. -->
<rule>
<fromsystem>
<src org="org\.apache\.commons" module="commons-.+"/>
<dest org="$m0" module="$m0"/>
</fromsystem>
<tosystem>
<src org="commons-.+" module="commons-.+"/>
<dest org="org.apache.commons" module="$m0"/>
</tosystem>
</rule>
</namespace>
</namespaces>
<!-- We want the "all versions" conflict manager, so that newer versions
don't evict old ones from the repo -->
<settings defaultConflictManager="all" />
<resolvers>
<filesystem name="ivy-repository">
<ivy
pattern="${ivy.repo.dir}/[organisation]/[module]/ivys/ivy-[revision].xml"/>
<artifact
pattern="${ivy.repo.dir}/[organisation]/[module]/[type]s/[artifact]-[revision].[ext]"/>
</filesystem>
<ibiblio name="ibiblio-maven2-repository"
root="${ibiblio-maven2-root}"
m2compatible="true"
namespace="ibiblio-maven2"/>
</resolvers>
</ivysettings>
{code}
Here is the corresponding build.xml for controlling this from Ant. If you want
to run this, adjust the value of the ivy.repo.dir property for your system, and
then run "ant install".
{code:xml|title=build.xml}
<project name="ivy-repository" xmlns:ivy="antlib:org.apache.ivy.ant">
<property name="from.resolver" value="ibiblio-maven2-repository"/>
<property name="to.resolver" value="ivy-repository"/>
<property name="ivy.repo.dir" value="C:/Users/jediry/repo"/>
<target name="install">
<delete dir="${ivy.repo.dir}"/>
<mkdir dir="${ivy.repo.dir}"/>
<ivy:settings id="ivy.instance" file="ivysettings.xml"/>
<ivy:install from="${from.resolver}" to="${to.resolver}" transitive="true"
organisation="org.apache.commons" module="commons-math"
revision="1.2"/>
</target>
</project>
{code}
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.