Sven created IVY-1606:
-------------------------

             Summary: incorrect dependency order on buildlist
                 Key: IVY-1606
                 URL: https://issues.apache.org/jira/browse/IVY-1606
             Project: Ivy
          Issue Type: Bug
          Components: Core
    Affects Versions: 2.5.0-rc1
            Reporter: Sven
         Attachments: deps.png, example.zip

Hi,

I am facing a problem with the ivy buildlist target: 

My scenario looks like the graph in picture deps.png (see attachments). 

The artefact 1B is having a dependency to A in Version 1.0.
The artefact C is having a dependency to A in Version 2.0 AND a dependency to 
1B (in Version 1.0).
In the ivy.xml file the conflict manager „latest-revision" is active.

Targets like report and resolve works like a charm, speaking Version 2.0 of 
artefact A is pulled, while Version 1.0 is evicted. 

But if I use the ivy:buildlist Tag, the dependency order looks like this:

 
{code:java}
run:
[ivy:buildlist] :: Apache Ivy 2.5.0-RC1 - 20141213170938 :: 
http://ant.apache.org/ivy/ ::
[ivy:buildlist] :: loading settings :: url = 
jar:file:/C:/Program%20Files/apache-ant-1.10.1/lib/ivy-2.4.0.jar!/org/apache/ivy/core/settings/ivysettings.xml
     [echo] ##### buildlist: test#1B, test#A1, test#A, test#D
 
BUILD SUCCESSFUL
Total time: 0 seconds
{code}
 

 

 As you can see, the dependency 1B is in first position, though it has an 
(evicted) dependency to A.

After digging around in the source, I found the function 
_getModuleDescriptorDependency_ in the Class _CollectionOfModulesToSort_ is 
using a _VersionMatcher_ to determine the correct dependency order.

So this class do not take the conflict-manager „latest-revision" into account. 

I workaround this, by patching die SortEngine like so:

 
{code:java}
27d26
< import org.apache.ivy.core.module.id.ModuleRevisionId;
32d30
< import org.apache.ivy.plugins.version.AbstractVersionMatcher;
125,137c123
<         VersionMatcher matcher = new AbstractVersionMatcher("all") {
<
<             @Override
<             public boolean isDynamic(ModuleRevisionId askedMrid) {
<                 return false;
<             }
<
<             @Override
<             public boolean accept(ModuleRevisionId askedMrid, 
ModuleRevisionId foundMrid) {
<                 return true;
<             }
<         };
<         return matcher;
---
>         return settings.getVersionMatcher();
{code}
 

 

After that, in my opinion the build order is correct, as the Version of a 
dependency should not affect the dependency order:
{code:java}
run:
[ivy:buildlist] :: Apache Ivy 2.5.0-CL - 20190826123506 :: 
http://ant.apache.org/ivy/ ::
[ivy:buildlist] :: loading settings :: url = 
jar:file:/C:/Users/kuhnert/.ant/lib/ivy.jar!/org/apache/ivy/core/settings/ivysettings.xml
     [echo] ##### buildlist: test#A1, test#A, test#1B, test#D
 
BUILD SUCCESSFUL
{code}
 

If you think, this is the right approach, I can create a merge request for this 
ticket.
Otherwise, I would be glad to hear your thoughts.

 

Kind regards,
Sven



--
This message was sent by Atlassian Jira
(v8.3.2#803003)

Reply via email to