From 16ef8e71fc764f643e76e4f32554dbb220e66894 Mon Sep 17 00:00:00 2001 From: Xavier Hanin Date: Wed, 26 Oct 2005 07:06:37 +0000 Subject: [PATCH] FIX: norevision management: added a unit test, it now seems to work well git-svn-id: https://svn.apache.org/repos/asf/incubator/ivy/trunk@484062 13f79535-47bb-0310-9956-ffa450edef68 --- .../fr/jayasoft/ivy/ModuleRevisionId.java | 34 ++++++---- .../jayasoft/ivy/resolver/BasicResolver.java | 13 +--- .../ivy/resolver/FileSystemResolverTest.java | 64 ++++++++++++++++++- .../norevision/ivy-mod1.1-after.xml | 11 ++++ .../norevision/ivy-mod1.1-before.xml | 11 ++++ test/repositories/norevision/mod1.1-after.jar | 1 + .../repositories/norevision/mod1.1-before.jar | 1 + 7 files changed, 111 insertions(+), 24 deletions(-) create mode 100644 test/repositories/norevision/ivy-mod1.1-after.xml create mode 100644 test/repositories/norevision/ivy-mod1.1-before.xml create mode 100644 test/repositories/norevision/mod1.1-after.jar create mode 100644 test/repositories/norevision/mod1.1-before.jar diff --git a/src/java/fr/jayasoft/ivy/ModuleRevisionId.java b/src/java/fr/jayasoft/ivy/ModuleRevisionId.java index 698e1dfc..419ab414 100644 --- a/src/java/fr/jayasoft/ivy/ModuleRevisionId.java +++ b/src/java/fr/jayasoft/ivy/ModuleRevisionId.java @@ -61,21 +61,33 @@ public class ModuleRevisionId { * @return true if the given revision can be considered as a revision of this module revision id. */ public boolean acceptRevision(String revision) { - if (_revision.equals(revision)) { - return true; - } - if (_revision.startsWith("latest.")) { - return true; - } - if (_revision.endsWith("+") && revision.startsWith(_revision.substring(0, _revision.length() - 1))) { - return true; - } - return false; + return acceptRevision(_revision, revision); } /** * @return true if the revision is an exact one, i.e. not a 'latest.' nor a xx+ one. */ public boolean isExactRevision() { - return !_revision.startsWith("latest.") && !_revision.endsWith("+"); + return isExactRevision(_revision); } + + public static boolean acceptRevision(String askedRevision, String revision) { + if (askedRevision.equals(revision)) { + return true; + } + if (askedRevision.startsWith("latest.")) { + return true; + } + if (askedRevision.endsWith("+") && revision.startsWith(askedRevision.substring(0, askedRevision.length() - 1))) { + return true; + } + return false; + } + + /** + * @return true if the revision is an exact one, i.e. not a 'latest.' nor a xx+ one. + */ + public static boolean isExactRevision(String revision) { + return !revision.startsWith("latest.") && !revision.endsWith("+"); + } + } diff --git a/src/java/fr/jayasoft/ivy/resolver/BasicResolver.java b/src/java/fr/jayasoft/ivy/resolver/BasicResolver.java index a8602294..a14e260c 100644 --- a/src/java/fr/jayasoft/ivy/resolver/BasicResolver.java +++ b/src/java/fr/jayasoft/ivy/resolver/BasicResolver.java @@ -111,7 +111,6 @@ public abstract class BasicResolver extends AbstractResolver { boolean downloaded = false; boolean searched = false; Date cachedPublicationDate = null; - String cachedRevision = null; ModuleRevisionId mrid = dd.getDependencyRevisionId(); // check revision int index = mrid.getRevision().indexOf("@"); @@ -191,7 +190,6 @@ public abstract class BasicResolver extends AbstractResolver { return searchedRmr(rmr); } else { Message.verbose("\t"+getName()+": revision in cache is not up to date: "+resolvedMrid); - cachedRevision = rmr.getDescriptor().getResolvedModuleRevisionId().getRevision(); if (dd.isChanging()) { // ivy file has been updated, we should see if it has a new publication date // to see if a new download is required (in case the dependency is a changing one) @@ -237,7 +235,7 @@ public abstract class BasicResolver extends AbstractResolver { throw new IllegalStateException("bad module name found in "+ivyRef.getResource()+": expected="+mrid.getName()+" found="+md.getModuleRevisionId().getName()); } if (ivyRef.getRevision() != null && md.getModuleRevisionId().getRevision() != null && - !ivyRef.getRevision().equals(md.getModuleRevisionId().getRevision())) { + !ModuleRevisionId.acceptRevision(ivyRef.getRevision(), md.getModuleRevisionId().getRevision())) { throw new IllegalStateException("bad revision found in "+ivyRef.getResource()+": expected="+ivyRef.getRevision()+" found="+md.getModuleRevisionId().getRevision()); } @@ -248,15 +246,6 @@ public abstract class BasicResolver extends AbstractResolver { Message.verbose("dependency "+dd+" has changed: deleting old artifacts"); deleteOldArtifacts = true; } - if (cachedRevision != null) { - if (!cachedRevision.equals(md.getResolvedModuleRevisionId().getRevision())) { - // revision has changed, artifacts should be downloaded again - Message.verbose("revision "+dd+" has changed: deleting old artifacts"); - deleteOldArtifacts = true; - } else { - Message.debug("revision "+dd+" has not changed: keeping old artifacts"); - } - } if (deleteOldArtifacts) { String[] confs = rmr.getDescriptor().getConfigurationsNames(); for (int i = 0; i < confs.length; i++) { diff --git a/test/java/fr/jayasoft/ivy/resolver/FileSystemResolverTest.java b/test/java/fr/jayasoft/ivy/resolver/FileSystemResolverTest.java index 597821b7..8ff3bfc6 100644 --- a/test/java/fr/jayasoft/ivy/resolver/FileSystemResolverTest.java +++ b/test/java/fr/jayasoft/ivy/resolver/FileSystemResolverTest.java @@ -158,6 +158,68 @@ public class FileSystemResolverTest extends TestCase { assertEquals(pubdate, rmr.getPublicationDate()); } + public void testNoRevision() throws Exception { + FileSystemResolver resolver = new FileSystemResolver(); + resolver.setName("test"); + resolver.setIvy(_ivy); + _ivy.addResolver(resolver); + assertEquals("test", resolver.getName()); + + resolver.addIvyPattern("test"+FS+"repositories"+FS+"norevision"+FS+"ivy-[module].xml"); + resolver.addArtifactPattern("test"+FS+"repositories"+FS+"norevision"+FS+"[artifact].[ext]"); + File modify = new File("test/repositories/norevision/ivy-mod1.1.xml"); + File artifact = new File("test/repositories/norevision/mod1.1.jar"); + + // 'publish' 'before' version + FileUtil.copy(new File("test/repositories/norevision/ivy-mod1.1-before.xml"), modify, null); + FileUtil.copy(new File("test/repositories/norevision/mod1.1-before.jar"), artifact, null); + Date pubdate = new GregorianCalendar(2004, 10, 1, 11, 0, 0).getTime(); + modify.setLastModified(pubdate.getTime()); + + ModuleRevisionId mrid = ModuleRevisionId.newInstance("org1", "mod1.1", "latest.integration"); + ResolvedModuleRevision rmr = resolver.getDependency(new DefaultDependencyDescriptor(mrid, false), _data); + assertNotNull(rmr); + + assertEquals(ModuleRevisionId.newInstance("org1", "mod1.1", "1.0"), rmr.getId()); + assertEquals(pubdate, rmr.getPublicationDate()); + + Artifact[] artifacts = rmr.getDescriptor().getArtifacts("default"); + File archiveFileInCache = _ivy.getArchiveFileInCache(_cache, artifacts[0]); + resolver.download(artifacts, _ivy, _cache); + assertTrue(archiveFileInCache.exists()); + BufferedReader r = new BufferedReader(new FileReader(archiveFileInCache)); + assertEquals("before", r.readLine()); + r.close(); + + // updates ivy file and artifact in repository + FileUtil.copy(new File("test/repositories/norevision/ivy-mod1.1-after.xml"), modify, null); + FileUtil.copy(new File("test/repositories/norevision/mod1.1-after.jar"), artifact, null); + pubdate = new GregorianCalendar(2005, 4, 1, 11, 0, 0).getTime(); + modify.setLastModified(pubdate.getTime()); + // no need to update new artifact timestamp cause it isn't used + + // should get the new version even if checkModified is false, beacause we ask a latest.integration + resolver.setCheckmodified(false); + rmr = resolver.getDependency(new DefaultDependencyDescriptor(mrid, false), _data); + assertNotNull(rmr); + + assertEquals(ModuleRevisionId.newInstance("org1", "mod1.1", "1.1"), rmr.getId()); + assertEquals(pubdate, rmr.getPublicationDate()); + + artifacts = rmr.getDescriptor().getArtifacts("default"); + archiveFileInCache = _ivy.getArchiveFileInCache(_cache, artifacts[0]); + + assertFalse(archiveFileInCache.exists()); + + // should download the new artifact + artifacts = rmr.getDescriptor().getArtifacts("default"); + resolver.download(artifacts, _ivy, _cache); + assertTrue(archiveFileInCache.exists()); + r = new BufferedReader(new FileReader(archiveFileInCache)); + assertEquals("after", r.readLine()); + r.close(); + } + public void testChanging() throws Exception { FileSystemResolver resolver = new FileSystemResolver(); resolver.setName("test"); @@ -226,7 +288,7 @@ public class FileSystemResolverTest extends TestCase { r = new BufferedReader(new FileReader(archiveFileInCache)); assertEquals("after", r.readLine()); r.close(); -} + } public void testLatestTime() throws Exception { FileSystemResolver resolver = new FileSystemResolver(); diff --git a/test/repositories/norevision/ivy-mod1.1-after.xml b/test/repositories/norevision/ivy-mod1.1-after.xml new file mode 100644 index 00000000..383b0047 --- /dev/null +++ b/test/repositories/norevision/ivy-mod1.1-after.xml @@ -0,0 +1,11 @@ + + + + + + diff --git a/test/repositories/norevision/ivy-mod1.1-before.xml b/test/repositories/norevision/ivy-mod1.1-before.xml new file mode 100644 index 00000000..c3d6a682 --- /dev/null +++ b/test/repositories/norevision/ivy-mod1.1-before.xml @@ -0,0 +1,11 @@ + + + + + + diff --git a/test/repositories/norevision/mod1.1-after.jar b/test/repositories/norevision/mod1.1-after.jar new file mode 100644 index 00000000..5c80f32d --- /dev/null +++ b/test/repositories/norevision/mod1.1-after.jar @@ -0,0 +1 @@ +after \ No newline at end of file diff --git a/test/repositories/norevision/mod1.1-before.jar b/test/repositories/norevision/mod1.1-before.jar new file mode 100644 index 00000000..ee2363a4 --- /dev/null +++ b/test/repositories/norevision/mod1.1-before.jar @@ -0,0 +1 @@ +before \ No newline at end of file