Repository: ant-ivy Updated Branches: refs/heads/master 7a8d27f5b -> 4ab65afd9
IVY-1478 Fix RetrieveEngine to take into account the correct extension while dealing with unpacked artifacts Project: http://git-wip-us.apache.org/repos/asf/ant-ivy/repo Commit: http://git-wip-us.apache.org/repos/asf/ant-ivy/commit/850a888c Tree: http://git-wip-us.apache.org/repos/asf/ant-ivy/tree/850a888c Diff: http://git-wip-us.apache.org/repos/asf/ant-ivy/diff/850a888c Branch: refs/heads/master Commit: 850a888c546bab897542a2d89ff76ca9debce0ee Parents: 7a8d27f Author: Jaikiran Pai <[email protected]> Authored: Thu May 18 11:25:24 2017 +0530 Committer: Jaikiran Pai <[email protected]> Committed: Thu May 18 11:25:24 2017 +0530 ---------------------------------------------------------------------- .../cache/DefaultRepositoryCacheManager.java | 6 ++-- .../apache/ivy/core/pack/PackagingManager.java | 14 ++++++++-- .../ivy/core/report/ArtifactDownloadReport.java | 10 +++++++ .../ivy/core/retrieve/RetrieveEngine.java | 28 +++++++++++++++---- .../apache/ivy/core/retrieve/RetrieveTest.java | 28 +++++++++++++++++++ .../1/packaging/module10/ivys/ivy-1.0.xml | 27 ++++++++++++++++++ .../1/packaging/module9/ivys/ivy-1.0.xml | 27 ++++++++++++++++++ .../module9/jars/module9-1.0.jar.pack.gz | Bin 0 -> 274 bytes 8 files changed, 130 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ant-ivy/blob/850a888c/src/java/org/apache/ivy/core/cache/DefaultRepositoryCacheManager.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/ivy/core/cache/DefaultRepositoryCacheManager.java b/src/java/org/apache/ivy/core/cache/DefaultRepositoryCacheManager.java index 6fe13c7..86b4a8b 100644 --- a/src/java/org/apache/ivy/core/cache/DefaultRepositoryCacheManager.java +++ b/src/java/org/apache/ivy/core/cache/DefaultRepositoryCacheManager.java @@ -409,7 +409,7 @@ public class DefaultRepositoryCacheManager implements RepositoryCacheManager, Iv * * @param md * the module descriptor resolved - * @param name + * @param artifactResolverName * artifact resolver name */ public void saveResolvers(ModuleDescriptor md, String metadataResolverName, @@ -1043,11 +1043,13 @@ public class DefaultRepositoryCacheManager implements RepositoryCacheManager, Iv File archiveFile = getArchiveFileInCache(unpacked, null, false); if (archiveFile.exists() && !options.isForce()) { adr.setUnpackedLocalFile(archiveFile); + adr.setUnpackedArtifact(unpacked); } else { Message.info("\tUnpacking " + artifact.getId()); try { - packagingManager.unpackArtifact(artifact, adr.getLocalFile(), archiveFile); + final Artifact unpackedArtifact = packagingManager.unpackArtifact(artifact, adr.getLocalFile(), archiveFile); adr.setUnpackedLocalFile(archiveFile); + adr.setUnpackedArtifact(unpackedArtifact); } catch (Exception e) { Message.debug(e); adr.setDownloadStatus(DownloadStatus.FAILED); http://git-wip-us.apache.org/repos/asf/ant-ivy/blob/850a888c/src/java/org/apache/ivy/core/pack/PackagingManager.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/ivy/core/pack/PackagingManager.java b/src/java/org/apache/ivy/core/pack/PackagingManager.java index 6b3caf0..2eba452 100644 --- a/src/java/org/apache/ivy/core/pack/PackagingManager.java +++ b/src/java/org/apache/ivy/core/pack/PackagingManager.java @@ -71,14 +71,14 @@ public class PackagingManager implements IvySettingsAware { return unpacked; } - public void unpackArtifact(Artifact artifact, File localFile, File archiveFile) + public Artifact unpackArtifact(Artifact artifact, File localFile, File archiveFile) throws IOException { String packaging = artifact.getExtraAttribute("packaging"); if (packaging == null) { // not declared as packed, nothing to do - return; + return null; } - + String ext = artifact.getExt(); String[] packings = packaging.split(","); InputStream in = null; try { @@ -94,6 +94,7 @@ public class PackagingManager implements IvySettingsAware { + packings[i] + "' in the streamed chain: " + packaging); } in = ((StreamPacking) packing).unpack(in); + ext = packing.getUnpackedExtension(ext); } ArchivePacking packing = settings.getPackingRegistry().get(packings[0]); if (packing == null) { @@ -101,6 +102,7 @@ public class PackagingManager implements IvySettingsAware { + "' in the packing chain: " + packaging); } packing.unpack(in, archiveFile); + ext = packing.getUnpackedExtension(ext); } finally { if (in != null) { try { @@ -110,6 +112,12 @@ public class PackagingManager implements IvySettingsAware { } } } + final DefaultArtifact unpacked = new DefaultArtifact(artifact.getModuleRevisionId(), + artifact.getPublicationDate(), artifact.getName(), + artifact.getType() + "_unpacked", ext); + + return unpacked; + } } http://git-wip-us.apache.org/repos/asf/ant-ivy/blob/850a888c/src/java/org/apache/ivy/core/report/ArtifactDownloadReport.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/ivy/core/report/ArtifactDownloadReport.java b/src/java/org/apache/ivy/core/report/ArtifactDownloadReport.java index 76547f7..f4a7553 100644 --- a/src/java/org/apache/ivy/core/report/ArtifactDownloadReport.java +++ b/src/java/org/apache/ivy/core/report/ArtifactDownloadReport.java @@ -57,6 +57,8 @@ public class ArtifactDownloadReport { private File unpackedLocalFile; + private Artifact unpackedArtifact; + public ArtifactDownloadReport(Artifact artifact) { this.artifact = artifact; } @@ -164,6 +166,14 @@ public class ArtifactDownloadReport { return unpackedLocalFile; } + public void setUnpackedArtifact(final Artifact unpackedArtifact) { + this.unpackedArtifact = unpackedArtifact; + } + + public Artifact getUnpackedArtifact() { + return this.unpackedArtifact; + } + public int hashCode() { final int prime = 31; int result = 1; http://git-wip-us.apache.org/repos/asf/ant-ivy/blob/850a888c/src/java/org/apache/ivy/core/retrieve/RetrieveEngine.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/ivy/core/retrieve/RetrieveEngine.java b/src/java/org/apache/ivy/core/retrieve/RetrieveEngine.java index 7cfa6a8..57481de 100644 --- a/src/java/org/apache/ivy/core/retrieve/RetrieveEngine.java +++ b/src/java/org/apache/ivy/core/retrieve/RetrieveEngine.java @@ -46,6 +46,7 @@ import org.apache.ivy.core.module.descriptor.ModuleDescriptor; import org.apache.ivy.core.module.id.ArtifactRevisionId; import org.apache.ivy.core.module.id.ModuleId; import org.apache.ivy.core.module.id.ModuleRevisionId; +import org.apache.ivy.core.pack.PackagingManager; import org.apache.ivy.core.report.ArtifactDownloadReport; import org.apache.ivy.core.resolve.ResolveOptions; import org.apache.ivy.plugins.report.XmlReportParser; @@ -331,12 +332,29 @@ public class RetrieveEngine { artifacts.add(parser.getMetadataArtifactReport(mrids[j])); } } - for (ArtifactDownloadReport adr : artifacts) { + final PackagingManager packagingManager = new PackagingManager(); + packagingManager.setSettings(IvyContext.getContext().getSettings()); - Artifact artifact = adr.getArtifact(); - String ext = artifact.getExt(); - if (adr.getUnpackedLocalFile() != null) { - ext = ""; + for (final ArtifactDownloadReport adr : artifacts) { + + final Artifact artifact = adr.getArtifact(); + final String ext; + if (adr.getUnpackedLocalFile() == null) { + ext = artifact.getExt(); + } else { + final Artifact unpackedArtifact; + // check if the download report is aware of the unpacked artifact + if (adr.getUnpackedArtifact() != null) { + unpackedArtifact = adr.getUnpackedArtifact(); + } else { + // use the packaging manager to get hold of the unpacked artifact + unpackedArtifact = packagingManager.getUnpackedArtifact(artifact); + } + if (unpackedArtifact == null) { + throw new RuntimeException("Could not determine unpacked artifact for " + artifact + + " while determining artifacts to copy for module " + mrid); + } + ext = unpackedArtifact.getExt(); } String destPattern = "ivy".equals(adr.getType()) ? destIvyPattern : destFilePattern; http://git-wip-us.apache.org/repos/asf/ant-ivy/blob/850a888c/test/java/org/apache/ivy/core/retrieve/RetrieveTest.java ---------------------------------------------------------------------- diff --git a/test/java/org/apache/ivy/core/retrieve/RetrieveTest.java b/test/java/org/apache/ivy/core/retrieve/RetrieveTest.java index b0482c6..941b744 100644 --- a/test/java/org/apache/ivy/core/retrieve/RetrieveTest.java +++ b/test/java/org/apache/ivy/core/retrieve/RetrieveTest.java @@ -352,6 +352,34 @@ public class RetrieveTest extends TestCase { assertEquals(new File(dest, "META-INF/MANIFEST.MF"), jarContents[0].listFiles()[0]); } + /** + * Tests that the {@link RetrieveEngine} retrieves artifacts with the correct extension if the artifact is unpacked + * + * @throws Exception + * @see <a href="https://issues.apache.org/jira/browse/IVY-1478">IVY-1478</a> + */ + public void testUnpackExt() throws Exception { + final ResolveOptions roptions = getResolveOptions(new String[] {"*"}); + + final URL url = new File("test/repositories/1/packaging/module10/ivys/ivy-1.0.xml").toURI() + .toURL(); + + // normal resolve, the file goes in the cache + final ResolveReport report = ivy.resolve(url, roptions); + assertFalse("Resolution report has errors", report.hasError()); + final ModuleDescriptor md = report.getModuleDescriptor(); + assertNotNull("Module descriptor from report was null", md); + + final String pattern = "build/test/retrieve/[organization]/[module]/[conf]/[type]s/[artifact]-[revision](.[ext])"; + + final RetrieveOptions options = getRetrieveOptions(); + ivy.retrieve(md.getModuleRevisionId(), pattern, options); + + final File dest = new File("build/test/retrieve/packaging/module9/default/jars/module9-1.0.jar"); + assertTrue("Retrieved artifact is missing at " + dest.getAbsolutePath(), dest.exists()); + assertTrue("Retrieved artifact at " + dest.getAbsolutePath() + " is not a file", dest.isFile()); + } + private RetrieveOptions getRetrieveOptions() { return new RetrieveOptions(); } http://git-wip-us.apache.org/repos/asf/ant-ivy/blob/850a888c/test/repositories/1/packaging/module10/ivys/ivy-1.0.xml ---------------------------------------------------------------------- diff --git a/test/repositories/1/packaging/module10/ivys/ivy-1.0.xml b/test/repositories/1/packaging/module10/ivys/ivy-1.0.xml new file mode 100644 index 0000000..403e8ac --- /dev/null +++ b/test/repositories/1/packaging/module10/ivys/ivy-1.0.xml @@ -0,0 +1,27 @@ +<!-- + 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="packaging" module="module10" revision="1.0" /> + <configurations> + <conf name="default" /> + </configurations> + <dependencies> + <dependency org="packaging" name="module9" rev="1.0" /> + </dependencies> +</ivy-module> http://git-wip-us.apache.org/repos/asf/ant-ivy/blob/850a888c/test/repositories/1/packaging/module9/ivys/ivy-1.0.xml ---------------------------------------------------------------------- diff --git a/test/repositories/1/packaging/module9/ivys/ivy-1.0.xml b/test/repositories/1/packaging/module9/ivys/ivy-1.0.xml new file mode 100644 index 0000000..88219aa --- /dev/null +++ b/test/repositories/1/packaging/module9/ivys/ivy-1.0.xml @@ -0,0 +1,27 @@ +<!-- + 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="packaging" module="module9" revision="1.0" /> + <configurations> + <conf name="default" /> + </configurations> + <publications> + <artifact name="module9" type="jar" ext="jar.pack.gz" packaging="pack200" /> + </publications> +</ivy-module> http://git-wip-us.apache.org/repos/asf/ant-ivy/blob/850a888c/test/repositories/1/packaging/module9/jars/module9-1.0.jar.pack.gz ---------------------------------------------------------------------- diff --git a/test/repositories/1/packaging/module9/jars/module9-1.0.jar.pack.gz b/test/repositories/1/packaging/module9/jars/module9-1.0.jar.pack.gz new file mode 100644 index 0000000..6345656 Binary files /dev/null and b/test/repositories/1/packaging/module9/jars/module9-1.0.jar.pack.gz differ
