Index: ivy/test/java/org/apache/ivy/core/install/InstallTest.java =================================================================== --- ivy/test/java/org/apache/ivy/core/install/InstallTest.java (revision 759045) +++ ivy/test/java/org/apache/ivy/core/install/InstallTest.java (working copy) @@ -160,7 +160,31 @@ assertTrue(new File("build/test/install/org1/mod1.4/ivy-1.0.1.xml").exists()); } + + public void testCanChooseNotToOverwriteExistingArtifacts() throws Exception { + Ivy ivy = Ivy.newInstance(); + ivy.configure(new File("test/repositories/ivysettings.xml")); + + InstallOptions options = new InstallOptions().setIgnoreExisting(true); + assertFalse(options.isOverwrite()); + assertTrue(options.isIgnoreExisting()); + + ivy.install(ModuleRevisionId.newInstance("org1", "mod1.2", "2.0"), ivy.getSettings() + .getDefaultResolver().getName(), "install", options); + + assertTrue(new File("build/test/install/org1/mod1.2/ivy-2.0.xml").exists()); + assertTrue(new File("build/test/install/org1/mod1.2/mod1.2-2.0.jar").exists()); + ivy.install(ModuleRevisionId.newInstance("org1", "mod1.1", "1.0"), ivy.getSettings() + .getDefaultResolver().getName(), "install", options); + + assertTrue(new File("build/test/install/org1/mod1.1/ivy-1.0.xml").exists()); + assertTrue(new File("build/test/install/org1/mod1.1/mod1.1-1.0.jar").exists()); + + assertTrue(new File("build/test/install/org1/mod1.2/ivy-2.0.xml").exists()); + assertTrue(new File("build/test/install/org1/mod1.2/mod1.2-2.0.jar").exists()); + } + private File _cache; protected void setUp() throws Exception { Index: ivy/src/java/org/apache/ivy/ant/IvyInstall.java =================================================================== --- ivy/src/java/org/apache/ivy/ant/IvyInstall.java (revision 759045) +++ ivy/src/java/org/apache/ivy/ant/IvyInstall.java (working copy) @@ -28,6 +28,7 @@ import org.apache.ivy.plugins.matcher.PatternMatcher; import org.apache.ivy.util.filter.FilterHelper; import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Project; /** * Allow to install a module or a set of module from repository to another one. @@ -41,7 +42,9 @@ private String branch; - private boolean overwrite = false; + private boolean overwrite; + + private boolean ignoreExisting; private String from; @@ -103,6 +106,7 @@ .setTransitive(transitive) .setValidate(doValidate(settings)) .setOverwrite(overwrite) + .setIgnoreExisting(ignoreExisting) .setArtifactFilter(FilterHelper.getArtifactTypeFilter(type)) .setMatcherName(matcher)); } catch (Exception e) { @@ -159,12 +163,18 @@ this.revision = revision; } - public boolean isOverwrite() { + public boolean getOverwrite() { return overwrite; } - public void setOverwrite(boolean overwrite) { - this.overwrite = overwrite; + public void setOverwrite(String overwrite) { + if ("ignore".equalsIgnoreCase(overwrite)) { + this.ignoreExisting = true; + this.overwrite = false; + } else { + this.overwrite = Project.toBoolean(overwrite); + this.ignoreExisting = false; + } } public String getFrom() { Index: ivy/src/java/org/apache/ivy/core/install/InstallOptions.java =================================================================== --- ivy/src/java/org/apache/ivy/core/install/InstallOptions.java (revision 759045) +++ ivy/src/java/org/apache/ivy/core/install/InstallOptions.java (working copy) @@ -27,6 +27,7 @@ private boolean overwrite = false; private Filter artifactFilter = FilterHelper.NO_FILTER; private String matcherName = PatternMatcher.EXACT; + private boolean ignoreExisting = false; public boolean isTransitive() { return transitive; @@ -49,6 +50,13 @@ this.overwrite = overwrite; return this; } + public InstallOptions setIgnoreExisting(boolean ignore) { + this.ignoreExisting = ignore; + return this; + } + public boolean isIgnoreExisting() { + return ignoreExisting; + } public Filter getArtifactFilter() { return artifactFilter; } @@ -63,4 +71,5 @@ this.matcherName = matcherName; return this; } -} + +} \ No newline at end of file Index: ivy/src/java/org/apache/ivy/core/install/InstallEngine.java =================================================================== --- ivy/src/java/org/apache/ivy/core/install/InstallEngine.java (revision 759045) +++ ivy/src/java/org/apache/ivy/core/install/InstallEngine.java (working copy) @@ -22,6 +22,7 @@ import java.util.Arrays; import java.util.Date; +import org.apache.ivy.core.module.descriptor.Artifact; import org.apache.ivy.core.module.descriptor.Configuration; import org.apache.ivy.core.module.descriptor.DefaultDependencyDescriptor; import org.apache.ivy.core.module.descriptor.DefaultModuleDescriptor; @@ -138,17 +139,27 @@ ArtifactDownloadReport[] artifacts = report.getArtifactsReports(depMrid); for (int j = 0; j < artifacts.length; j++) { - if (artifacts[j].getLocalFile() != null) { - toResolver.publish(artifacts[j].getArtifact(), - artifacts[j].getLocalFile(), options.isOverwrite()); + Artifact artifact = artifacts[j].getArtifact(); + if (options.isIgnoreExisting() && toResolver.exists(artifact)) { + Message.info("\tskipped " + artifact + ", already exists in " + toResolver); + } else { + if (artifacts[j].getLocalFile() != null) { + toResolver.publish(artifacts[j].getArtifact(), + artifacts[j].getLocalFile(), options.isOverwrite()); + } } } // publish metadata File localIvyFile = dependencies[i] .getModuleRevision().getReport().getLocalFile(); - toResolver.publish( - depmd.getMetadataArtifact(), localIvyFile, options.isOverwrite()); + Artifact metaData = depmd.getMetadataArtifact(); + if (options.isIgnoreExisting() && toResolver.exists(metaData)) { + Message.info("\tskipped " + metaData + ", already exists in " + toResolver); + } else { + toResolver.publish( + depmd.getMetadataArtifact(), localIvyFile, options.isOverwrite()); + } // end module publish toResolver.commitPublishTransaction(); Index: ivy/doc/use/install.html =================================================================== --- ivy/doc/use/install.html (revision 759045) +++ ivy/doc/use/install.html (working copy) @@ -52,7 +52,7 @@