From c74b03513f163b407b6908f240bfefc4d846c63b Mon Sep 17 00:00:00 2001 From: Mark Harrah Date: Tue, 14 Feb 2012 21:59:13 -0500 Subject: [PATCH] work around 'data has not been loaded' exception when direct dependency overridden by newer version --- ivy/Ivy.scala | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/ivy/Ivy.scala b/ivy/Ivy.scala index 03b434ac4..0c378c899 100644 --- a/ivy/Ivy.scala +++ b/ivy/Ivy.scala @@ -141,9 +141,9 @@ final class IvySbt(val configuration: IvyConfiguration) log.debug("Using inline dependencies specified in Scala" + (if(ivyXML.isEmpty) "." else " and XML.")) val parser = IvySbt.parseIvyXML(ivy.getSettings, IvySbt.wrapped(module, ivyXML), moduleID, defaultConf.name, validate) - IvySbt.addDependencies(moduleID, dependencies, parser) IvySbt.addMainArtifact(moduleID) - IvySbt.addOverrides(moduleID, overrides, ivy.getSettings.getMatcher(PatternMatcher.EXACT_OR_REGEXP)) + IvySbt.addOverrides(moduleID, overrides, ivy.getSettings.getMatcher(PatternMatcher.EXACT)) + IvySbt.addDependencies(moduleID, IvySbt.overrideDirect(dependencies, overrides), parser) (moduleID, parser.getDefaultConf) } private def newConfiguredModuleID(module: ModuleID, moduleInfo: ModuleInfo, configurations: Iterable[Configuration]) = @@ -440,6 +440,20 @@ private object IvySbt val overrideWith = new OverrideDependencyDescriptorMediator(null, overrideDef.revision) moduleID.addDependencyDescriptorMediator(overrideID, matcher, overrideWith) } + /** It is necessary to explicitly modify direct dependencies because Ivy gives + * "IllegalStateException: impossible to get artifacts when data has not been loaded." + * when a direct dependency is overridden with a newer version."*/ + def overrideDirect(dependencies: Seq[ModuleID], overrides: Set[ModuleID]): Seq[ModuleID] = + { + def key(id: ModuleID) = (id.organization, id.name) + val overridden = overrides.map(id => (key(id), id.revision)).toMap + dependencies map { dep => + overridden get key(dep) match { + case Some(rev) => dep.copy(revision = rev) + case None => dep + } + } + } /** This method is used to add inline artifacts to the provided module. */ def addArtifacts(moduleID: DefaultModuleDescriptor, artifacts: Iterable[Artifact]): Unit =