You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by xa...@apache.org on 2008/01/03 19:51:28 UTC
svn commit: r608593 - in /ant/ivy/core/trunk: ./
src/java/org/apache/ivy/core/cache/ src/java/org/apache/ivy/core/settings/
src/java/org/apache/ivy/plugins/resolver/
test/java/org/apache/ivy/plugins/resolver/
Author: xavier
Date: Thu Jan 3 10:51:26 2008
New Revision: 608593
URL: http://svn.apache.org/viewvc?rev=608593&view=rev
Log:
FIX: Detection of newer and better artifacts should not happen if 'checkModified' is set to 'false' (IVY-389) (with contribution from Johan Stuyts)
Modified:
ant/ivy/core/trunk/CHANGES.txt
ant/ivy/core/trunk/src/java/org/apache/ivy/core/cache/DefaultRepositoryCacheManager.java
ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/ivysettings-default-chain.xml
ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/AbstractResolver.java
ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/ChainResolver.java
ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/resolver/ChainResolverTest.java
ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/resolver/chainresolverconf.xml
Modified: ant/ivy/core/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/CHANGES.txt?rev=608593&r1=608592&r2=608593&view=diff
==============================================================================
--- ant/ivy/core/trunk/CHANGES.txt (original)
+++ ant/ivy/core/trunk/CHANGES.txt Thu Jan 3 10:51:26 2008
@@ -64,6 +64,7 @@
- IMPROVEMENT: Decrease memory footprint (IVY-662)
- IMPROVEMENT: Downgrade Ant version requirement to 1.6 to build Ivy (IVY-687)
+- FIX: Detection of newer and better artifacts should not happen if 'checkModified' is set to 'false' (IVY-389) (with contribution from Johan Stuyts)
- FIX: Ivy doesn't respect the order of the ivy patterns as defined in the settings (IVY-676)
- FIX: XmlModuleDescriptorWriter doesn't write the deprecated attribute of the "ivy-module/configurations/conf" element (IVY-664)
- FIX: XMLModuleDescriptorWriter does not write extra attributes (IVY-471) (with contribution from Mikkel Bjerg)
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=608593&r1=608592&r2=608593&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 Thu Jan 3 10:51:26 2008
@@ -385,8 +385,8 @@
if (resolver != null) {
Message.debug("\tfound ivy file in cache for " + mrid + " (resolved by "
+ resolver.getName() + "): " + ivyFile);
- if (expectedResolver != null
- && expectedResolver.equals(resolver.getName())) {
+ if (expectedResolver == null
+ || expectedResolver.equals(resolver.getName())) {
MetadataArtifactDownloadReport madr
= new MetadataArtifactDownloadReport(
depMD.getMetadataArtifact());
@@ -562,7 +562,9 @@
mdFileInCache);
saveResolvers(md, resolver.getName(), resolver.getName());
- rmr.getReport().setOriginalLocalFile(originalFileInCache);
+ if (!md.isDefault()) {
+ rmr.getReport().setOriginalLocalFile(originalFileInCache);
+ }
rmr.getReport().setLocalFile(mdFileInCache);
} catch (RuntimeException e) {
throw e;
@@ -592,10 +594,9 @@
}
try {
// now let's see if we can find it in cache and if it is up to date
- ResolvedModuleRevision rmr = findModuleInCache(
- mrid, options.isValidate(), resolver.getName());
+ ResolvedModuleRevision rmr = findModuleInCache(mrid, options.isValidate(), null);
if (rmr != null) {
- if (rmr.getDescriptor().isDefault() && rmr.getResolver() != this) {
+ if (rmr.getDescriptor().isDefault() && rmr.getResolver() != resolver) {
Message.verbose("\t" + getName() + ": found revision in cache: " + mrid
+ " (resolved by " + rmr.getResolver().getName()
+ "): but it's a default one, maybe we can find a better one");
Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/ivysettings-default-chain.xml
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/ivysettings-default-chain.xml?rev=608593&r1=608592&r2=608593&view=diff
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/ivysettings-default-chain.xml (original)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/core/settings/ivysettings-default-chain.xml Thu Jan 3 10:51:26 2008
@@ -18,7 +18,7 @@
-->
<ivysettings>
<resolvers>
- <chain name="default" returnFirst="true">
+ <chain name="default" returnFirst="true" checkmodified="true">
<resolver ref="local"/>
<resolver ref="main"/>
</chain>
Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/AbstractResolver.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/AbstractResolver.java?rev=608593&r1=608592&r2=608593&view=diff
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/AbstractResolver.java (original)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/AbstractResolver.java Thu Jan 3 10:51:26 2008
@@ -275,8 +275,13 @@
}
protected ResolvedModuleRevision findModuleInCache(ResolveData data, ModuleRevisionId mrid) {
+ return findModuleInCache(data, mrid, false);
+ }
+
+ protected ResolvedModuleRevision findModuleInCache(
+ ResolveData data, ModuleRevisionId mrid, boolean anyResolver) {
return getRepositoryCacheManager().findModuleInCache(
- mrid, doValidate(data), getName());
+ mrid, doValidate(data), anyResolver ? null : getName());
}
public String getChangingMatcherName() {
Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/ChainResolver.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/ChainResolver.java?rev=608593&r1=608592&r2=608593&view=diff
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/ChainResolver.java (original)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/ChainResolver.java Thu Jan 3 10:51:26 2008
@@ -68,10 +68,34 @@
private boolean dual;
+ private Boolean checkmodified = null;
+
public void add(DependencyResolver resolver) {
chain.add(resolver);
}
+ /**
+ * True if this resolver should check lastmodified date to know if ivy files are up to date.
+ *
+ * @return
+ */
+ public boolean isCheckmodified() {
+ if (checkmodified == null) {
+ if (getSettings() != null) {
+ String check = getSettings().getVariable("ivy.resolver.default.check.modified");
+ return check != null ? Boolean.valueOf(check).booleanValue() : false;
+ } else {
+ return false;
+ }
+ } else {
+ return checkmodified.booleanValue();
+ }
+ }
+
+ public void setCheckmodified(boolean check) {
+ checkmodified = Boolean.valueOf(check);
+ }
+
public ResolvedModuleRevision getDependency(DependencyDescriptor dd, ResolveData data)
throws ParseException {
data = new ResolveData(data, doValidate(data));
@@ -79,10 +103,28 @@
List errors = new ArrayList();
+ ResolvedModuleRevision mr = null;
+
+ ModuleRevisionId mrid = dd.getDependencyRevisionId();
+
+ boolean isDynamic = getSettings().getVersionMatcher().isDynamic(mrid);
+
+ boolean isChangingRevision = getChangingMatcher().matches(mrid.getRevision());
+ boolean isChangingDependency = isChangingRevision || dd.isChanging();
+
+ if (!isDynamic && !isCheckmodified() && !isChangingDependency) {
+ Message.verbose(getName() + ": not dynamic, not check modified and not changing."
+ + " Checking cache for: " + mrid);
+ mr = findModuleInCache(data, mrid, true);
+ if (mr != null) {
+ Message.verbose("chain " + getName() + ": module revision found in cache: " + mrid);
+ return resolvedRevision(mr);
+ }
+ }
+
for (Iterator iter = chain.iterator(); iter.hasNext();) {
DependencyResolver resolver = (DependencyResolver) iter.next();
LatestStrategy oldLatest = setLatestIfRequired(resolver, getLatestStrategy());
- ResolvedModuleRevision mr = null;
try {
mr = resolver.getDependency(dd, data);
} catch (Exception ex) {
@@ -97,8 +139,7 @@
checkInterrupted();
if (mr != null) {
boolean shouldReturn = returnFirst;
- shouldReturn |= !getSettings().getVersionMatcher().isDynamic(
- dd.getDependencyRevisionId())
+ shouldReturn |= !isDynamic
&& ret != null && !ret.getDescriptor().isDefault();
if (!shouldReturn) {
// check if latest is asked and compare to return the most recent
@@ -118,7 +159,7 @@
} else {
Message.debug("\tmodule revision discarded as older: " + mrDesc);
}
- if (!getSettings().getVersionMatcher().isDynamic(dd.getDependencyRevisionId())
+ if (!isDynamic
&& !ret.getDescriptor().isDefault()) {
Message.debug("\tmodule revision found and is not default: returning "
+ mrDesc);
Modified: ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/resolver/ChainResolverTest.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/resolver/ChainResolverTest.java?rev=608593&r1=608592&r2=608593&view=diff
==============================================================================
--- ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/resolver/ChainResolverTest.java (original)
+++ ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/resolver/ChainResolverTest.java Thu Jan 3 10:51:26 2008
@@ -19,6 +19,7 @@
import java.io.File;
import java.util.Arrays;
+import java.util.Collections;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
@@ -339,12 +340,34 @@
assertNotNull(rmr);
assertEquals("2", rmr.getResolver().getName());
}
+
+
+ public void testUseCache() throws Exception {
+ DefaultDependencyDescriptor dd = new DefaultDependencyDescriptor(ModuleRevisionId
+ .newInstance("org1", "mod1.1", "1.0"), false);
+ // resolve dependency twice
+ chainToPutDefaultModuleInCache().getDependency(dd, data);
+
+ ChainResolver chain = new ChainResolver();
+ chain.setName("chain");
+ chain.setSettings(settings);
+ MockResolver[] resolvers = new MockResolver[] {
+ MockResolver.buildMockResolver("1", true, null)};
+ for (int i = 0; i < resolvers.length; i++) {
+ chain.add(resolvers[i]);
+ }
+ chain.getDependency(dd, data);
+ // should not have asked any dependency, should have hit the cache
+ assertEquals(Collections.EMPTY_LIST, resolvers[0].askedDeps);
+ }
+
public void testReturnFirst() throws Exception {
ChainResolver chain = new ChainResolver();
chain.setName("chain");
chain.setSettings(settings);
chain.setReturnFirst(true);
+
MockResolver[] resolvers = new MockResolver[] {
MockResolver.buildMockResolver("1", true, new GregorianCalendar(2005, 1, 20)
.getTime()),
@@ -372,39 +395,52 @@
}
public void testReturnFirstWithDefaultAndCacheAndRealResolver() throws Exception {
- // test case for IVY-207
+ // test case for IVY-389
+ DefaultDependencyDescriptor dd = new DefaultDependencyDescriptor(ModuleRevisionId
+ .newInstance("org1", "mod1.1", "1.0"), false);
// 1 ---- we first do a first resolve which puts a default file in cache
- ChainResolver chain = new ChainResolver();
- chain.setName("chain");
- chain.setSettings(settings);
-
- // no ivy pattern for resolver: will only find a 'default' module
- FileSystemResolver resolver = new FileSystemResolver();
- resolver.setName("old");
- resolver.setSettings(settings);
+ chainToPutDefaultModuleInCache().getDependency(dd, data);
- resolver
- .addArtifactPattern("test/repositories/1/[organisation]/[module]/[type]s/[artifact]-[revision].[type]");
- chain.add(resolver);
+ // 2 ---- now we ask to resolve dependencies with a chain in return first mode with check
+ // modified = false, in which the first resolver is not able to find the module, but the
+ // second is
+ ChainResolver chain = returnFirstChain();
- settings.addResolver(chain);
+ ResolvedModuleRevision rmr = chain.getDependency(dd, data);
+ assertNotNull(rmr);
+ // the module returned should be the default one found in cache since check modified is false
+ assertEquals(true, rmr.getDescriptor().isDefault());
+ }
+ public void testReturnFirstWithCheckModifiedAndDefaultAndCacheAndRealResolver() throws Exception {
+ // test case for IVY-207
+
DefaultDependencyDescriptor dd = new DefaultDependencyDescriptor(ModuleRevisionId
- .newInstance("org1", "mod1.1", "1.0"), false);
- chain.getDependency(dd, data);
+ .newInstance("org1", "mod1.1", "1.0"), false);
+
+ // 1 ---- we first do a first resolve which puts a default file in cache
+ chainToPutDefaultModuleInCache().getDependency(dd, data);
// 2 ---- now we ask to resolve dependencies with a chain in return first mode, in which the
- // first resolver
- // is not able to find the module, but the second is
+ // first resolver is not able to find the module, but the second is
+ ChainResolver chain = returnFirstChain();
+ chain.setCheckmodified(true);
+
+ ResolvedModuleRevision rmr = chain.getDependency(dd, data);
+ assertNotNull(rmr);
+ assertEquals(false, rmr.getDescriptor().isDefault());
+ assertEquals("2", rmr.getResolver().getName());
+ }
- chain = new ChainResolver();
+ private ChainResolver returnFirstChain() {
+ ChainResolver chain = new ChainResolver();
chain.setName("chain");
chain.setSettings(settings);
chain.setReturnFirst(true);
// no pattern for first resolver: will not find the module
- resolver = new FileSystemResolver();
+ FileSystemResolver resolver = new FileSystemResolver();
resolver.setName("1");
resolver.setSettings(settings);
@@ -415,17 +451,32 @@
resolver.setName("2");
resolver.setSettings(settings);
- resolver
- .addIvyPattern("test/repositories/1/[organisation]/[module]/ivys/ivy-[revision].xml");
- resolver
- .addArtifactPattern("test/repositories/1/[organisation]/[module]/[type]s/[artifact]-[revision].[type]");
+ resolver.addIvyPattern(
+ "test/repositories/1/[organisation]/[module]/ivys/ivy-[revision].xml");
+ resolver.addArtifactPattern(
+ "test/repositories/1/[organisation]/[module]/[type]s/[artifact]-[revision].[type]");
chain.add(resolver);
settings.addResolver(chain);
+ return chain;
+ }
- ResolvedModuleRevision rmr = chain.getDependency(dd, data);
- assertNotNull(rmr);
- assertEquals("2", rmr.getResolver().getName());
+ private ChainResolver chainToPutDefaultModuleInCache() {
+ ChainResolver chain = new ChainResolver();
+ chain.setName("chain");
+ chain.setSettings(settings);
+
+ // no ivy pattern for resolver: will only find a 'default' module
+ FileSystemResolver resolver = new FileSystemResolver();
+ resolver.setName("old");
+ resolver.setSettings(settings);
+
+ resolver.addArtifactPattern(
+ "test/repositories/1/[organisation]/[module]/[type]s/[artifact]-[revision].[type]");
+ chain.add(resolver);
+
+ settings.addResolver(chain);
+ return chain;
}
public void testDual() throws Exception {
Modified: ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/resolver/chainresolverconf.xml
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/resolver/chainresolverconf.xml?rev=608593&r1=608592&r2=608593&view=diff
==============================================================================
--- ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/resolver/chainresolverconf.xml (original)
+++ ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/resolver/chainresolverconf.xml Thu Jan 3 10:51:26 2008
@@ -17,7 +17,7 @@
under the License.
-->
<ivysettings>
- <conf defaultResolver="chain"/>
+ <settings defaultResolver="chain"/>
<resolvers>
<chain name="chain">
<ibiblio name="1" />