[ 
https://issues.apache.org/jira/browse/IVY-1179?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12852029#action_12852029
 ] 

Stefan De Boey commented on IVY-1179:
-------------------------------------

i've created an extra example to illustrate the problem. in this example i 
retrieve the module commons-configuration for company org.apache via the 
package resolver. the packager resolver is configured to look for the ivy.xml 
and the packaging instructions in a directory on disk.

the build.xml file is trivial:

{code:xml}
<project xmlns:ivy="antlib:org.apache.ivy.ant" name="hello-ivy" default="run">

    <target name="resolve" description="--> retrieve dependencies with ivy">
        <ivy:retrieve organisation="org.apache" module="commons-configuration" 
revision="1.6" inline="true" pattern="./[artifact]-[revision].[ext]"/>
    </target>

</project>
{code}

this tells ivy to retrieve the module commons-configuration (version 1.6) via 
the default resolver.

the ivysettings.xml:

{code:xml}
<ivysettings>

        <settings defaultResolver="package" />

        <resolvers>

                <packager name="package" buildRoot="${basedir}/packager/build"
                        resourceCache="${basedir}/packager/cache" 
preserveBuildDirectories="true">
                        <ivy 
pattern="file://${basedir}/repo/[organisation]/[module]/ivy-[revision].xml" />
                        <artifact 
pattern="file://${basedir}/repo/[organisation]/[module]/packager-[revision].xml"
 />
                </packager>

        </resolvers>

</ivysettings>

{code}

this specifies a packager resolver as the default resolver. the packager 
resolver will look for the module configuration file (ivy.xml and packager.xml} 
in the 'repo' directory.

the ivy file (ivy-1.6.xml):

{code:xml}
<?xml version="1.0" encoding="UTF-8"?>
<ivy-module version="2.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
        
xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd";>

        <info organisation="org.apache" module="commons-configuration" 
revision="1.6" />

        <publications>
                <artifact name="commons-configuration" />
        </publications>

</ivy-module>
{code}

and the packaging instruction (packager-1.6.xml):

{code:xml}
<packager-module version="1.0">

        <resource dest="archive"
                
url="http://www.apache.org/dist/commons/configuration/binaries/commons-configuration-1.6.zip";
                sha1="f716c88e10a9a776fa70815c44ef4ba5781a2a7e">

                <include 
name="commons-configuration-1.6/commons-configuration-1.6.jar" />

        </resource>

        <build>
                <move 
file="archive/commons-configuration-1.6/commons-configuration-1.6.jar" 
tofile="artifacts/jars/commons-configuration.jar" />
        </build>

</packager-module>

{code}

Notice the 'include' tag that specifies to only include (extract) the file 
commons-configuration-1.6.jar from the commons-configuration directory in the 
archive (resource)

Now, if you execute the ANT target and then take a look at the 
./packager/build/org.apache/commons-configuration/1.6/archive directory you 
will see that the complete archive was extracted and not only the 
commons-configuration-1.6.jar file.

> Packager resolver always extracts all files from archives even when the 
> packaging instructions contains include tags
> --------------------------------------------------------------------------------------------------------------------
>
>                 Key: IVY-1179
>                 URL: https://issues.apache.org/jira/browse/IVY-1179
>             Project: Ivy
>          Issue Type: Bug
>          Components: Core
>    Affects Versions: 2.1.0, trunk
>            Reporter: Stefan De Boey
>            Priority: Minor
>   Original Estimate: 2h
>  Remaining Estimate: 2h
>
> According to the documentation the packager resolver should unzip/untar only 
> specific files and folders (and not the complete archive) from downloaded 
> resources in case the packager module description specfies include tags. 
> Let's assume we have a module testng (example is taken from the examples in 
> the Packager Resolver documentation) and we have a packager module descriptor 
> (the packaging instructions) packager.xml specifying the following resource:
> {code:xml}
> <resource dest="archive" url="http://testng.org/${zipname}.zip"; 
> sha1="2ea19275dc17453306f8bb780fe6ef6e9af7756b">
>         <include name="${zipname}/*.jar"/>
> </resource>
> {code}
> this instructs the package resolver to download the resources from 
> http://testng.org/... and then extract the archive, but only all JAR files in 
> the root of the archive.
> in this case only the JAR's in the ZIP file should be extracted from the 
> resource, but that's not the case. at first i didn't notice this, but i was 
> creating the packaging instructions for a project which is in a huge ZIP file 
> and so i only wanted to extract the files that i actually needed, but i 
> noticed that the extraction took way to long.
> i then configured the packager resolver to preserve the build directories 
> (where the archive is extracted) for debugging purposes and i noticed that 
> the complete archive was still extracted although the packager.xml file 
> contained the necessary 'include' tags to only inluce 3 JAR's.
> when using the preserveBuildDirectories switch on the packager resolver, it's 
> also possible to view the ANT build file packager-output.xml (this one is 
> generated by the packager resolver based on the packaging instructions). this 
> build file is executed by the package resolver to do the extraction process. 
> this is the relevant part of the packager-output.xml file for the above 
> mentioded example for TestNG:
> {code:xml}
> <unzip src="${resdir.N65541}${file.separator}${filename.N65541}" 
> dest="archive">
>     <fileset dir=".">
>         <include name="testng-2.5/*.jar"/>
>      </fileset>
> </unzip>
> {code}
> but this is incorrect and that's why the complete zip is still extracted. the 
> 'fileset' tag should be used to indicate a set of ZIP files that need to be 
> extracted, not to indicate which resources from the archive (specified in the 
> 'src' attribute of the unzip tag) need to be included when extracting. 
> 'patternset' is what we need here instead of 'fileset'
> the actual problem is situated in the file 
> src/java/org/apache/ivy/plugins/resolver/packager/packager.xsl on line 420 
> (in the ivy core project).
> {code:xml}
> <xsl:when test="$type = 'zip' or $type = 'war' or $type = 'jar'">
>     <unzip src="{$file}" dest="{$dir}">
>         <xsl:if test="$includes">
>             <fileset dir=".">
>                 <xsl:copy-of select="$includes"/>
>             </fileset>
>         </xsl:if>
>     </unzip>
> </xsl:when>
> {code}
> should be:
> {code:xml}
> <xsl:when test="$type = 'zip' or $type = 'war' or $type = 'jar'">
>     <unzip src="{$file}" dest="{$dir}">
>         <xsl:if test="$includes">
>             <patternset>
>                 <xsl:copy-of select="$includes"/>
>             </patternset>
>         </xsl:if>
>     </unzip>
> </xsl:when>
> {code}
> the same needs to be done for the TAR part in the packages.xsl file.
> i already tried this fix and it works.
> if that's OK, i'll create a patch for this and provide the necessary unit 
> tests to illustrate the problem and the fix.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to