You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by hi...@apache.org on 2013/12/14 18:06:26 UTC
svn commit: r1550939 - in /ant/ivy/core/trunk: ./ doc/use/
src/java/org/apache/ivy/ant/ src/java/org/apache/ivy/core/cache/
src/java/org/apache/ivy/core/install/ test/java/org/apache/ivy/ant/
test/java/org/apache/ivy/core/cache/ test/java/org/apache/iv...
Author: hibou
Date: Sat Dec 14 17:06:25 2013
New Revision: 1550939
URL: http://svn.apache.org/r1550939
Log:
IVY-1431: Also copy original metadata artifact (e.g. POM) on ivy:install (Thanks to Erwin Tratar)
Modified:
ant/ivy/core/trunk/CHANGES.txt
ant/ivy/core/trunk/doc/use/install.html
ant/ivy/core/trunk/src/java/org/apache/ivy/ant/IvyInstall.java
ant/ivy/core/trunk/src/java/org/apache/ivy/core/cache/DefaultRepositoryCacheManager.java
ant/ivy/core/trunk/src/java/org/apache/ivy/core/install/InstallEngine.java
ant/ivy/core/trunk/src/java/org/apache/ivy/core/install/InstallOptions.java
ant/ivy/core/trunk/test/java/org/apache/ivy/ant/IvyInstallTest.java
ant/ivy/core/trunk/test/java/org/apache/ivy/core/cache/DefaultRepositoryCacheManagerTest.java
ant/ivy/core/trunk/test/java/org/apache/ivy/core/install/InstallTest.java
ant/ivy/core/trunk/test/repositories/ivysettings.xml
Modified: ant/ivy/core/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/CHANGES.txt?rev=1550939&r1=1550938&r2=1550939&view=diff
==============================================================================
--- ant/ivy/core/trunk/CHANGES.txt (original)
+++ ant/ivy/core/trunk/CHANGES.txt Sat Dec 14 17:06:25 2013
@@ -122,6 +122,7 @@ for detailed view of each issue, please
Simon Steiner
Johan Stuyts
John Tinetti
+ Erwin Tratar
Jason Trump
Tjeerd Verhagen
Richard Vowles
@@ -150,6 +151,7 @@ for detailed view of each issue, please
- IMPROVEMENT: Optional <include> ivysettings directives (IVY-1392) (thanks to Yanus Poluektovich)
- IMPROVEMENT: add support for source bundles from p2 repositories
- IMPROVEMENT: add support for source URI from OBR repositories
+- IMPROVEMENT: Also copy original metadata artifact (e.g. POM) on ivy:install (IVY-1431) (Thanks to Erwin Tratar)
- FIX: In IvyDE, Ivy fails to parse ivy-settings.xml file if it contains <pgp> element (thanks to Gregory Amerson) (IVY-1441)
- FIX: ParseException when "Bundle-Description" is present in OSGI MANIFEST.MF (IVY-1438)
Modified: ant/ivy/core/trunk/doc/use/install.html
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/doc/use/install.html?rev=1550939&r1=1550938&r2=1550939&view=diff
==============================================================================
--- ant/ivy/core/trunk/doc/use/install.html (original)
+++ ant/ivy/core/trunk/doc/use/install.html Sat Dec 14 17:06:25 2013
@@ -66,6 +66,8 @@ For more details about this task and its
<td>No, 'ivy.instance' is taken by default.</td></tr>
<tr><td>haltonfailure</td><td>true to fail build on unresolved dependencies <span class="since">since 2.0</span></td>
<td>No, defaults to true</td></tr>
+ <tr><td>installOriginalMetadata</td><td>true to install original metadata (if available). If the module has been originally resolved from a m2 repository, the original metadata is the original POM file <span class="since">since 2.4</span></td>
+ <td>No, defaults to false</td></tr>
</tbody>
</table>
<h1>Examples</h1>
Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/ant/IvyInstall.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/ant/IvyInstall.java?rev=1550939&r1=1550938&r2=1550939&view=diff
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/ant/IvyInstall.java (original)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/ant/IvyInstall.java Sat Dec 14 17:06:25 2013
@@ -57,6 +57,8 @@ public class IvyInstall extends IvyTask
private boolean haltOnFailure = true;
+ private boolean installOriginalMetadata = false;
+
public void doExecute() throws BuildException {
Ivy ivy = getIvyInstance();
IvySettings settings = ivy.getSettings();
@@ -107,7 +109,8 @@ public class IvyInstall extends IvyTask
.setOverwrite(overwrite)
.setConfs(conf.split(","))
.setArtifactFilter(FilterHelper.getArtifactTypeFilter(type))
- .setMatcherName(matcher));
+ .setMatcherName(matcher)
+ .setInstallOriginalMetadata(installOriginalMetadata));
} catch (Exception e) {
throw new BuildException("impossible to install " + mrid + ": " + e, e);
}
@@ -218,4 +221,11 @@ public class IvyInstall extends IvyTask
this.conf = conf;
}
+ public boolean isInstallOriginalMetadata() {
+ return installOriginalMetadata;
+ }
+
+ public void setInstallOriginalMetadata(boolean installOriginalMetadata) {
+ this.installOriginalMetadata = installOriginalMetadata;
+ }
}
Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/core/cache/DefaultRepositoryCacheManager.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/core/cache/DefaultRepositoryCacheManager.java?rev=1550939&r1=1550938&r2=1550939&view=diff
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/core/cache/DefaultRepositoryCacheManager.java (original)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/core/cache/DefaultRepositoryCacheManager.java Sat Dec 14 17:06:25 2013
@@ -23,11 +23,14 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
+import java.net.MalformedURLException;
+import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.ParseException;
import java.util.Date;
import java.util.Enumeration;
+import java.util.Iterator;
import java.util.Map;
import java.util.regex.Pattern;
import java.util.zip.ZipEntry;
@@ -39,6 +42,7 @@ import org.apache.ivy.core.module.descri
import org.apache.ivy.core.module.descriptor.DefaultArtifact;
import org.apache.ivy.core.module.descriptor.DependencyDescriptor;
import org.apache.ivy.core.module.descriptor.ModuleDescriptor;
+import org.apache.ivy.core.module.id.ArtifactRevisionId;
import org.apache.ivy.core.module.id.ModuleRevisionId;
import org.apache.ivy.core.module.id.ModuleRules;
import org.apache.ivy.core.report.ArtifactDownloadReport;
@@ -465,6 +469,7 @@ public class DefaultRepositoryCacheManag
PropertiesFile cdf = getCachedDataFile(artifact.getModuleRevisionId());
cdf.setProperty(getIsLocalKey(artifact), String.valueOf(origin.isLocal()));
cdf.setProperty(getLocationKey(artifact), origin.getLocation());
+ cdf.setProperty(getOriginalKey(artifact), getPrefixKey(origin.getArtifact()));
if (origin.getLastChecked() != null) {
cdf.setProperty(getLastCheckedKey(artifact), origin.getLastChecked().toString());
}
@@ -478,9 +483,13 @@ public class DefaultRepositoryCacheManag
cdf.remove(getLocationKey(artifact));
cdf.remove(getIsLocalKey(artifact));
cdf.remove(getLastCheckedKey(artifact));
+ cdf.remove(getOriginalKey(artifact));
cdf.save();
}
+ private static final Pattern ARTIFACT_KEY_PATTERN =
+ Pattern.compile(".*:(.*)#(.*)#(.*)#(.*)(\\.location)?");
+
public ArtifactOrigin getSavedArtifactOrigin(Artifact artifact) {
ModuleRevisionId mrid = artifact.getModuleRevisionId();
if (!lockMetadataArtifact(mrid)) {
@@ -493,6 +502,7 @@ public class DefaultRepositoryCacheManag
String local = cdf.getProperty(getIsLocalKey(artifact));
String lastChecked = cdf.getProperty(getLastCheckedKey(artifact));
String exists = cdf.getProperty(getExistsKey(artifact));
+ String original = cdf.getProperty(getOriginalKey(artifact));
boolean isLocal = Boolean.valueOf(local).booleanValue();
@@ -501,6 +511,72 @@ public class DefaultRepositoryCacheManag
return ArtifactOrigin.unkwnown(artifact);
}
+ if (original != null) {
+ // original artifact key artifact:[name]#[type]#[ext]#[hashcode]
+ java.util.regex.Matcher m = ARTIFACT_KEY_PATTERN.matcher(original);
+ if (m.matches()) {
+ String origName = m.group(1);
+ String origType = m.group(2);
+ String origExt = m.group(3);
+
+ ArtifactRevisionId originArtifactId = ArtifactRevisionId.newInstance(
+ artifact.getModuleRevisionId(), origName, origType, origExt);
+ // second check: verify the hashcode of the cached artifact
+ if (m.group(4).equals("" + originArtifactId.hashCode())) {
+ try {
+ artifact = new DefaultArtifact(originArtifactId,
+ artifact.getPublicationDate(), new URL(location), true);
+ } catch (MalformedURLException e) {
+ Message.debug(e);
+ }
+ }
+ }
+ } else {
+ // Fallback if cached with old version:
+
+ // if the origin artifact has another extension (e.g. .pom) then make a synthetic
+ // origin artifact for it
+ if (!location.endsWith("." + artifact.getExt())) {
+ // try to find other cached artifact info with same location. This must be the
+ // origin. We must parse the key as we do not know for sure what the original
+ // artifact is named.
+ Iterator it = cdf.entrySet().iterator();
+ String ownLocationKey = getLocationKey(artifact);
+ while (it.hasNext()) {
+ Map.Entry entry = (Map.Entry) it.next();
+ if (entry.getValue().equals(location)
+ && !ownLocationKey.equals(entry.getKey())) {
+ // found a match, key is artifact:[name]#[type]#[ext]#[hashcode].location
+ java.util.regex.Matcher m = ARTIFACT_KEY_PATTERN.matcher(
+ (String) entry.getKey());
+ if (m.matches()) {
+ String origName = m.group(1);
+ String origType = m.group(2);
+ String origExt = m.group(3);
+
+ // first check: the type should end in .original
+ if (!origType.endsWith(".original")) {
+ continue;
+ }
+
+ ArtifactRevisionId originArtifactId = ArtifactRevisionId.newInstance(
+ artifact.getModuleRevisionId(), origName, origType, origExt);
+ // second check: verify the hashcode of the cached artifact
+ if (m.group(4).equals("" + originArtifactId.hashCode())) {
+ try {
+ artifact = new DefaultArtifact(originArtifactId,
+ artifact.getPublicationDate(), new URL(location), true);
+ } catch (MalformedURLException e) {
+ Message.debug(e);
+ }
+ }
+ break;
+ }
+ }
+ }
+ }
+ }
+
ArtifactOrigin origin = new ArtifactOrigin(artifact, isLocal, location);
if (lastChecked != null) {
origin.setLastChecked(Long.valueOf(lastChecked));
@@ -578,6 +654,18 @@ public class DefaultRepositoryCacheManag
return prefix + ".exists";
}
+ /**
+ * Returns the key used to identify the original artifact.
+ *
+ * @param artifact
+ * the artifact to generate the key from. Cannot be null.
+ * @return the key to be used to reference the original artifact.
+ */
+ private String getOriginalKey(Artifact artifact) {
+ String prefix = getPrefixKey(artifact);
+ return prefix + ".original";
+ }
+
private PropertiesFile getCachedDataFile(ModuleDescriptor md) {
return getCachedDataFile(md.getResolvedModuleRevisionId());
}
@@ -675,6 +763,17 @@ public class DefaultRepositoryCacheManag
madr.setSize(ivyFile.length());
madr.setArtifactOrigin(
getSavedArtifactOrigin(depMD.getMetadataArtifact()));
+ if (madr.getArtifactOrigin().isExists()) {
+ if (madr.getArtifactOrigin().isLocal()
+ && madr.getArtifactOrigin().getArtifact().getUrl() != null) {
+ madr.setOriginalLocalFile(
+ new File(madr.getArtifactOrigin().getArtifact().getUrl().toURI()));
+ } else {
+ // find locally cached file
+ madr.setOriginalLocalFile(
+ getArchiveFileInCache(madr.getArtifactOrigin().getArtifact()));
+ }
+ }
return new ResolvedModuleRevision(
resolver, artResolver, depMD, madr);
} else {
Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/core/install/InstallEngine.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/core/install/InstallEngine.java?rev=1550939&r1=1550938&r2=1550939&view=diff
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/core/install/InstallEngine.java (original)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/core/install/InstallEngine.java Sat Dec 14 17:06:25 2013
@@ -22,6 +22,7 @@ import java.io.IOException;
import java.util.Arrays;
import java.util.Date;
+import org.apache.ivy.core.cache.ArtifactOrigin;
import org.apache.ivy.core.module.descriptor.Configuration;
import org.apache.ivy.core.module.descriptor.DefaultDependencyDescriptor;
import org.apache.ivy.core.module.descriptor.DefaultModuleDescriptor;
@@ -29,6 +30,7 @@ import org.apache.ivy.core.module.descri
import org.apache.ivy.core.module.id.ModuleId;
import org.apache.ivy.core.module.id.ModuleRevisionId;
import org.apache.ivy.core.report.ArtifactDownloadReport;
+import org.apache.ivy.core.report.MetadataArtifactDownloadReport;
import org.apache.ivy.core.report.ResolveReport;
import org.apache.ivy.core.resolve.DownloadOptions;
import org.apache.ivy.core.resolve.IvyNode;
@@ -153,11 +155,28 @@ public class InstallEngine {
}
// publish metadata
- File localIvyFile = dependencies[i]
- .getModuleRevision().getReport().getLocalFile();
+ MetadataArtifactDownloadReport artifactDownloadReport = dependencies[i]
+ .getModuleRevision().getReport();
+ File localIvyFile = artifactDownloadReport.getLocalFile();
toResolver.publish(
depmd.getMetadataArtifact(), localIvyFile, options.isOverwrite());
+ if (options.isInstallOriginalMetadata()) {
+ if (artifactDownloadReport.getArtifactOrigin() != null
+ && artifactDownloadReport.getArtifactOrigin().isExists()
+ && !ArtifactOrigin.isUnknown(artifactDownloadReport.getArtifactOrigin())
+ && artifactDownloadReport.getArtifactOrigin().getArtifact() != null
+ && artifactDownloadReport.getArtifactOrigin().getArtifact()
+ .getType().endsWith(".original")
+ && !artifactDownloadReport.getArtifactOrigin().getArtifact()
+ .getType().equals(depmd.getMetadataArtifact().getType()+".original")) {
+ // publish original metadata artifact, too, as it has a different type
+ toResolver.publish(artifactDownloadReport.getArtifactOrigin().getArtifact(),
+ artifactDownloadReport.getOriginalLocalFile(),
+ options.isOverwrite());
+ }
+ }
+
// end module publish
toResolver.commitPublishTransaction();
successfullyPublished = true;
Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/core/install/InstallOptions.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/core/install/InstallOptions.java?rev=1550939&r1=1550938&r2=1550939&view=diff
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/core/install/InstallOptions.java (original)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/core/install/InstallOptions.java Sat Dec 14 17:06:25 2013
@@ -25,6 +25,7 @@ public class InstallOptions {
private boolean transitive = true;
private boolean validate = true;
private boolean overwrite = false;
+ private boolean installOriginalMetadata = false;
private String[] confs = {"*"};
private Filter artifactFilter = FilterHelper.NO_FILTER;
private String matcherName = PatternMatcher.EXACT;
@@ -71,4 +72,11 @@ public class InstallOptions {
this.confs = conf;
return this;
}
+ public boolean isInstallOriginalMetadata() {
+ return installOriginalMetadata;
+ }
+ public InstallOptions setInstallOriginalMetadata(boolean installOriginalMetadata) {
+ this.installOriginalMetadata = installOriginalMetadata;
+ return this;
+ }
}
Modified: ant/ivy/core/trunk/test/java/org/apache/ivy/ant/IvyInstallTest.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/java/org/apache/ivy/ant/IvyInstallTest.java?rev=1550939&r1=1550938&r2=1550939&view=diff
==============================================================================
--- ant/ivy/core/trunk/test/java/org/apache/ivy/ant/IvyInstallTest.java (original)
+++ ant/ivy/core/trunk/test/java/org/apache/ivy/ant/IvyInstallTest.java Sat Dec 14 17:06:25 2013
@@ -21,6 +21,9 @@ import java.io.File;
import junit.framework.TestCase;
+import org.apache.ivy.core.install.InstallOptions;
+import org.apache.ivy.core.module.id.ModuleRevisionId;
+import org.apache.ivy.core.report.ResolveReport;
import org.apache.ivy.util.FileUtil;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
@@ -181,6 +184,35 @@ public class IvyInstallTest extends Test
assertFalse(new File("build/test/install/org8/mod8.1/a-1.1.txt").exists());
}
+
+ public void testInstallWithOriginalMetadata() {
+ project.setProperty("ivy.settings.file", "test/repositories/ivysettings.xml");
+ install.setOrganisation("org.apache");
+ install.setModule("test");
+ install.setRevision("1.0");
+ install.setFrom("test");
+ install.setTo("install");
+ install.setHaltonfailure(false);
+
+ try {
+ install.execute();
+ } catch (BuildException be) {
+ fail("unknown dependency, failure unexpected (haltonfailure=false). Failure: " + be);
+ }
+
+ assertFalse(new File("build/test/install/org.apache/test/test-1.0.pom").exists());
+
+ install.setInstallOriginalMetadata(true);
+
+ try {
+ install.setOverwrite(true);
+ install.execute();
+ } catch (BuildException be) {
+ fail("unknown dependency, failure unexpected (haltonfailure=false). Failure: " + be);
+ }
+
+ assertTrue(new File("build/test/install/org.apache/test/test-1.0.pom").exists());
+ }
public void testIVY843() {
project.setProperty("ivy.settings.file", "test/repositories/ivysettings-IVY843.xml");
Modified: ant/ivy/core/trunk/test/java/org/apache/ivy/core/cache/DefaultRepositoryCacheManagerTest.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/java/org/apache/ivy/core/cache/DefaultRepositoryCacheManagerTest.java?rev=1550939&r1=1550938&r2=1550939&view=diff
==============================================================================
--- ant/ivy/core/trunk/test/java/org/apache/ivy/core/cache/DefaultRepositoryCacheManagerTest.java (original)
+++ ant/ivy/core/trunk/test/java/org/apache/ivy/core/cache/DefaultRepositoryCacheManagerTest.java Sat Dec 14 17:06:25 2013
@@ -52,7 +52,11 @@ public class DefaultRepositoryCacheManag
cacheManager.setBasedir(f);
artifact = createArtifact("org", "module", "rev", "name", "type", "ext");
- origin = new ArtifactOrigin(artifact, true, "/some/where");
+
+ Artifact originArtifact = createArtifact("org", "module", "rev", "name", "pom.original", "pom");
+ origin = new ArtifactOrigin(originArtifact, true, "file:/some/where.pom");
+
+ cacheManager.saveArtifactOrigin(originArtifact, origin);
cacheManager.saveArtifactOrigin(artifact, origin);
}
@@ -66,6 +70,7 @@ public class DefaultRepositoryCacheManag
public void testArtifactOrigin() {
ArtifactOrigin found = cacheManager.getSavedArtifactOrigin(artifact);
assertEquals(origin, found);
+ assertEquals("pom", found.getArtifact().getExt());
artifact = createArtifact("org", "module", "rev", "name", "type2", "ext");
found = cacheManager.getSavedArtifactOrigin(artifact);
Modified: ant/ivy/core/trunk/test/java/org/apache/ivy/core/install/InstallTest.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/java/org/apache/ivy/core/install/InstallTest.java?rev=1550939&r1=1550938&r2=1550939&view=diff
==============================================================================
--- ant/ivy/core/trunk/test/java/org/apache/ivy/core/install/InstallTest.java (original)
+++ ant/ivy/core/trunk/test/java/org/apache/ivy/core/install/InstallTest.java Sat Dec 14 17:06:25 2013
@@ -23,6 +23,7 @@ import junit.framework.TestCase;
import org.apache.ivy.Ivy;
import org.apache.ivy.core.module.id.ModuleRevisionId;
+import org.apache.ivy.core.report.ResolveReport;
import org.apache.ivy.plugins.matcher.PatternMatcher;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.Delete;
@@ -52,6 +53,28 @@ public class InstallTest extends TestCas
assertFalse(new File("build/test/install/orgfailure/modfailure/modfailure-1.0.jar").exists());
}
+ public void testMaven() throws Exception {
+ Ivy ivy = Ivy.newInstance();
+ ivy.configure(new File("test/repositories/ivysettings.xml"));
+
+ ResolveReport rr = ivy.install(ModuleRevisionId.newInstance("org.apache", "test", "1.0"), ivy.getSettings()
+ .getDefaultResolver().getName(), "install", new InstallOptions());
+
+ assertTrue(new File("build/test/install/org.apache/test/ivy-1.0.xml").exists());
+ assertTrue(new File("build/test/install/org.apache/test/test-1.0.jar").exists());
+
+ // the original descriptor is not installed
+ assertFalse(new File("build/test/install/org.apache/test/test-1.0.pom").exists());
+
+ ivy.install(ModuleRevisionId.newInstance("org.apache", "test", "1.0"), ivy.getSettings()
+ .getDefaultResolver().getName(), "install", new InstallOptions()
+ .setInstallOriginalMetadata(true)
+ .setOverwrite(true));
+
+ // the original descriptor is installed now, too
+ assertTrue(new File("build/test/install/org.apache/test/test-1.0.pom").exists());
+ }
+
public void testNoValidate() throws Exception {
Ivy ivy = Ivy.newInstance();
ivy.configure(new File("test/repositories/ivysettings.xml"));
Modified: ant/ivy/core/trunk/test/repositories/ivysettings.xml
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/repositories/ivysettings.xml?rev=1550939&r1=1550938&r2=1550939&view=diff
==============================================================================
--- ant/ivy/core/trunk/test/repositories/ivysettings.xml (original)
+++ ant/ivy/core/trunk/test/repositories/ivysettings.xml Sat Dec 14 17:06:25 2013
@@ -35,6 +35,8 @@
<artifact pattern="${ivy.settings.dir}/2/[module]/[artifact].[ext]"/>
</filesystem>
</dual>
+ <ibiblio name="m2" m2compatible="true" useMavenMetadata="true"
+ root="file:${ivy.settings.dir}/m2" />
</chain>
<filesystem name="install">
<ivy pattern="${ivy.basedir}/build/test/install/[organisation]/[module]/[artifact]-[revision].[ext]"/>