more consistent configuration of the Ivy user directory

This commit is contained in:
Mark Harrah 2011-03-12 10:28:53 -05:00
parent f18241395b
commit d371ff9314
12 changed files with 42 additions and 42 deletions

View File

@ -5,13 +5,14 @@ package sbt
import org.apache.ivy.{core,plugins}
import core.module.id.ModuleRevisionId
import core.settings.IvySettings
import plugins.resolver.{ChainResolver, DependencyResolver, IBiblioResolver}
import plugins.resolver.{AbstractPatternsBasedResolver, AbstractSshBasedResolver, FileSystemResolver, SFTPResolver, SshResolver, URLResolver}
private object ConvertResolver
{
/** Converts the given sbt resolver into an Ivy resolver..*/
def apply(r: Resolver) =
def apply(r: Resolver)(implicit settings: IvySettings) =
{
r match
{
@ -69,7 +70,7 @@ private object ConvertResolver
resolver.setM2compatible(true)
resolver.setRoot(root)
}
private def initializeSSHResolver(resolver: AbstractSshBasedResolver, repo: SshBasedRepository)
private def initializeSSHResolver(resolver: AbstractSshBasedResolver, repo: SshBasedRepository)(implicit settings: IvySettings)
{
resolver.setName(repo.name)
resolver.setPassfile(null)
@ -93,10 +94,10 @@ private object ConvertResolver
setUser(user)
}
}
private def initializePatterns(resolver: AbstractPatternsBasedResolver, patterns: Patterns)
private def initializePatterns(resolver: AbstractPatternsBasedResolver, patterns: Patterns)(implicit settings: IvySettings)
{
resolver.setM2compatible(patterns.isMavenCompatible)
patterns.ivyPatterns.foreach(resolver.addIvyPattern)
patterns.artifactPatterns.foreach(resolver.addArtifactPattern)
patterns.ivyPatterns.foreach(p => resolver.addIvyPattern(settings substitute p))
patterns.artifactPatterns.foreach(p => resolver.addArtifactPattern(settings substitute p))
}
}

View File

@ -181,7 +181,7 @@ private object IvySbt
{
def makeChain(label: String, name: String, rs: Seq[Resolver]) = {
log.debug(label + " repositories:")
val chain = resolverChain(name, rs, localOnly, log)
val chain = resolverChain(name, rs, localOnly, settings, log)
settings.addResolver(chain)
chain
}
@ -189,7 +189,7 @@ private object IvySbt
val mainChain = makeChain("Default", "sbt-chain", resolvers)
settings.setDefaultResolver(mainChain.getName)
}
private def resolverChain(name: String, resolvers: Seq[Resolver], localOnly: Boolean, log: Logger): ChainResolver =
private def resolverChain(name: String, resolvers: Seq[Resolver], localOnly: Boolean, settings: IvySettings, log: Logger): ChainResolver =
{
val newDefault = new ChainResolver
newDefault.setName(name)
@ -197,7 +197,7 @@ private object IvySbt
newDefault.setCheckmodified(false)
for(sbtResolver <- resolvers) {
log.debug("\t" + sbtResolver)
newDefault.add(ConvertResolver(sbtResolver))
newDefault.add(ConvertResolver(sbtResolver)(settings))
}
newDefault
}
@ -210,7 +210,7 @@ private object IvySbt
import IvyPatternHelper._
import PatternMatcher._
if(!existing.contains(resolver.name))
settings.addResolver(ConvertResolver(resolver))
settings.addResolver(ConvertResolver(resolver)(settings))
val attributes = javaMap(Map(MODULE_KEY -> name, ORGANISATION_KEY -> organization, REVISION_KEY -> revision))
settings.addModuleConfiguration(attributes, settings.getMatcher(EXACT_OR_REGEXP), resolver.name, null, null, null)
}

View File

@ -84,7 +84,7 @@ object IvyCache
/** A minimal Ivy setup with only a local resolver and the current directory as the base directory.*/
private def basicLocalIvy(lock: Option[xsbti.GlobalLock], log: Logger) =
{
val local = Resolver.defaultLocal(None)
val local = Resolver.defaultLocal
val paths = new IvyPaths(new File("."), None)
val conf = new InlineIvyConfiguration(paths, Seq(local), Nil, Nil, false, lock, log)
(new IvySbt(conf), local)

View File

@ -174,7 +174,7 @@ object Resolver
* If `scalaTools` is true, add the Scala Tools releases repository.
* If `mavenCentral` is true, add the Maven Central repository. */
def withDefaultResolvers(userResolvers: Seq[Resolver], mavenCentral: Boolean, scalaTools: Boolean): Seq[Resolver] =
Seq(Resolver.defaultLocal(None)) ++
Seq(Resolver.defaultLocal) ++
userResolvers ++
single(DefaultMavenRepository, mavenCentral)++
single(ScalaToolsReleases, scalaTools)
@ -270,14 +270,13 @@ object Resolver
def mavenStyleBasePattern = "[organisation]/[module]/[revision]/[artifact]-[revision](-[classifier]).[ext]"
def localBasePattern = "[organisation]/[module]/[revision]/[type]s/[artifact](-[classifier]).[ext]"
def userRoot = System.getProperty("user.home")
def userMavenRoot = userRoot + "/.m2/repository/"
def userIvyRoot = userRoot + "/.ivy2/"
private def userIvyRootFile = new File(userIvyRoot)
def defaultLocal(ivyHome: Option[File]) = defaultUserFileRepository(ivyHome, "local")
def defaultShared(ivyHome: Option[File]) = defaultUserFileRepository(ivyHome, "shared")
def defaultUserFileRepository(ivyHome: Option[File], id: String) = file(id, new File(ivyHome.getOrElse(userIvyRootFile), id))(defaultIvyPatterns)
def defaultLocal = defaultUserFileRepository("local")
def defaultShared = defaultUserFileRepository("shared")
def defaultUserFileRepository(id: String) =
{
val pList = ("${ivy.home}/" + id + "/" + localBasePattern) :: Nil
FileRepository(id, defaultFileConfiguration, Patterns(pList, pList, false))
}
def defaultIvyPatterns =
{
val pList = List(localBasePattern)

View File

@ -42,10 +42,10 @@ class ConfigurationParser extends NotNull
val (boot, m4) = processSection(m3, "boot", getBoot)
val (logging, m5) = processSection(m4, "log", getLogging)
val (properties, m6) = processSection(m5, "app-properties", getAppProperties)
val (cacheDir, m7) = processSection(m6, "ivy", getIvy)
val (ivyHome, m7) = processSection(m6, "ivy", getIvy)
check(m7, "section")
val classifiers = Classifiers(scalaClassifiers, appClassifiers)
new LaunchConfiguration(scalaVersion, IvyOptions(cacheDir, classifiers, repositories), app, boot, logging, properties)
new LaunchConfiguration(scalaVersion, IvyOptions(ivyHome, classifiers, repositories), app, boot, logging, properties)
}
def getScala(m: LabelMap) =
{
@ -94,9 +94,9 @@ class ConfigurationParser extends NotNull
def getIvy(m: LabelMap): Option[File] =
{
val (cacheDir, m1) = file(m, "cache-directory", null) // fix this later
val (ivyHome, m1) = file(m, "ivy-home", null) // fix this later
check(m1, "label")
if(cacheDir eq null) None else Some(cacheDir)
if(ivyHome eq null) None else Some(ivyHome)
}
def getBoot(m: LabelMap): BootSetup =
{

View File

@ -87,12 +87,12 @@ class Launch private[xsbt](val bootDirectory: File, val ivyOptions: IvyOptions)
val updateLockFile = new File(bootDirectory, "sbt.boot.lock")
def globalLock: xsbti.GlobalLock = Locks
def cacheDirectory = ivyOptions.cacheDirectory.orNull
def ivyHome = ivyOptions.ivyHome.orNull
class JNAProvider extends Provider
{
lazy val id = new Application("net.java.dev.jna", "jna", new Explicit("3.2.3"), "", Nil, false, array())
lazy val configuration = new UpdateConfiguration(bootDirectory, ivyOptions.cacheDirectory, "", repositories)
lazy val configuration = new UpdateConfiguration(bootDirectory, ivyOptions.ivyHome, "", repositories)
lazy val libDirectory = new File(bootDirectory, baseDirectoryName(""))
def baseDirectories: List[File] = new File(libDirectory, appDirectoryName(id.toID, File.separator)) :: Nil
def testLoadClasses: List[String] = "com.sun.jna.Function" :: Nil
@ -108,7 +108,7 @@ class Launch private[xsbt](val bootDirectory: File, val ivyOptions: IvyOptions)
def launcher: xsbti.Launcher = Launch.this
def parentLoader = topLoader
lazy val configuration = new UpdateConfiguration(bootDirectory, ivyOptions.cacheDirectory, version, repositories)
lazy val configuration = new UpdateConfiguration(bootDirectory, ivyOptions.ivyHome, version, repositories)
lazy val libDirectory = new File(configuration.bootDirectory, baseDirectoryName(version))
lazy val scalaHome = new File(libDirectory, ScalaDirectoryName)
def compilerJar = new File(scalaHome, CompilerModuleName + ".jar")

View File

@ -9,7 +9,7 @@ import java.net.URL
import scala.collection.immutable.List
//TODO: use copy constructor, check size change
final case class LaunchConfiguration(scalaVersion: Value[String], ivyConfiguration: IvyOptions, app: Application, boot: BootSetup, logging: Logging, appProperties: List[AppProperty]) extends NotNull
final case class LaunchConfiguration(scalaVersion: Value[String], ivyConfiguration: IvyOptions, app: Application, boot: BootSetup, logging: Logging, appProperties: List[AppProperty])
{
def getScalaVersion = Value.get(scalaVersion)
def withScalaVersion(newScalaVersion: String) = LaunchConfiguration(new Explicit(newScalaVersion), ivyConfiguration, app, boot, logging, appProperties)
@ -20,7 +20,7 @@ final case class LaunchConfiguration(scalaVersion: Value[String], ivyConfigurati
LaunchConfiguration(new Explicit(newScalaVersion), ivyConfiguration.copy(classifiers = classifiers0), app.withVersion(new Explicit(newAppVersion)), boot, logging, appProperties)
def map(f: File => File) = LaunchConfiguration(scalaVersion, ivyConfiguration, app.map(f), boot.map(f), logging, appProperties)
}
final case class IvyOptions(cacheDirectory: Option[File], classifiers: Classifiers, repositories: List[Repository]) extends NotNull
final case class IvyOptions(ivyHome: Option[File], classifiers: Classifiers, repositories: List[Repository]) extends NotNull
sealed trait Value[T]
final class Explicit[T](val value: T) extends Value[T] {

View File

@ -30,12 +30,12 @@ sealed trait UpdateTarget { def tpe: String; def classifiers: List[String] }
final class UpdateScala(val classifiers: List[String]) extends UpdateTarget { def tpe = "scala" }
final class UpdateApp(val id: Application, val classifiers: List[String]) extends UpdateTarget { def tpe = "app" }
final class UpdateConfiguration(val bootDirectory: File, val ivyCacheDirectory: Option[File], val scalaVersion: String, val repositories: List[Repository])
final class UpdateConfiguration(val bootDirectory: File, val ivyHome: Option[File], val scalaVersion: String, val repositories: List[Repository])
/** Ensures that the Scala and application jars exist for the given versions or else downloads them.*/
final class Update(config: UpdateConfiguration)
{
import config.{bootDirectory, ivyCacheDirectory, repositories, scalaVersion}
import config.{bootDirectory, ivyHome, repositories, scalaVersion}
bootDirectory.mkdirs
private def logFile = new File(bootDirectory, UpdateLogName)
@ -44,6 +44,7 @@ final class Update(config: UpdateConfiguration)
private lazy val settings =
{
val settings = new IvySettings
ivyHome foreach settings.setDefaultIvyUserDir
addResolvers(settings)
settings.setDefaultConflictManager(settings.getConflictManager(ConflictManagerName))
settings.setBaseDir(bootDirectory)
@ -198,7 +199,7 @@ final class Update(config: UpdateConfiguration)
if(repositories.isEmpty) error("No repositories defined.")
for(repo <- repositories if includeRepo(repo))
newDefault.add(toIvyRepository(settings, repo))
configureCache(settings, ivyCacheDirectory)
configureCache(settings)
settings.addResolver(newDefault)
settings.setDefaultResolver(newDefault.getName)
}
@ -208,16 +209,14 @@ final class Update(config: UpdateConfiguration)
private[this] val Snapshot = "-SNAPSHOT"
private[this] val ChangingPattern = ".*" + Snapshot
private[this] val ChangingMatcher = PatternMatcher.REGEXP
private def configureCache(settings: IvySettings, dir: Option[File])
private def configureCache(settings: IvySettings)
{
val cacheDir = dir.getOrElse(settings.getDefaultRepositoryCacheBasedir())
val manager = new DefaultRepositoryCacheManager("default-cache", settings, cacheDir)
val manager = new DefaultRepositoryCacheManager("default-cache", settings, settings.getDefaultRepositoryCacheBasedir())
manager.setUseOrigin(true)
manager.setChangingMatcher(ChangingMatcher)
manager.setChangingPattern(ChangingPattern)
settings.addRepositoryCacheManager(manager)
settings.setDefaultRepositoryCacheManager(manager)
dir.foreach(dir => settings.setDefaultResolutionCacheBasedir(dir.getAbsolutePath))
}
private def toIvyRepository(settings: IvySettings, repo: Repository) =
{

View File

@ -10,5 +10,5 @@ public interface Launcher
public GlobalLock globalLock();
public File bootDirectory();
// null if none set
public File cacheDirectory();
public File ivyHome();
}

View File

@ -31,4 +31,4 @@
# sbt.version: quick=set(0.9.0-SNAPSHOT), new=prompt(sbt version)[0.9.0-SNAPSHOT], fill=prompt(sbt version)[0.9.0-SNAPSHOT]
#[ivy]
# cache-directory: /home/user/.ivy2/cache2
# ivy-home: /home/user/.ivy2

View File

@ -215,11 +215,12 @@ object Load
// note that there is State is passed in but not pulled out
def defaultLoad(state: State, baseDirectory: File, log: Logger): (() => Eval, BuildStructure) =
{
val stagingDirectory = defaultStaging.getCanonicalFile // TODO: properly configurable
val provider = state.configuration.provider
val scalaProvider = provider.scalaProvider
val stagingDirectory = defaultStaging.getCanonicalFile
val base = baseDirectory.getCanonicalFile
val loader = getClass.getClassLoader
val provider = state.configuration.provider
val classpath = provider.mainClasspath ++ provider.scalaProvider.jars
val classpath = provider.mainClasspath ++ scalaProvider.jars
val compilers = Compiler.compilers(state.configuration, log)
val evalPluginDef = EvaluateTask.evalPluginDef(log) _
val delegates = memo(defaultDelegates)
@ -656,7 +657,7 @@ object BuildPaths
import Path._
import GlobFilter._
def defaultStaging = Path.userHome / ".ivy2" / "staging"
def defaultStaging = Path.userHome / ".sbt" / "staging"
def definitionSources(base: File): Seq[File] = (base * "*.scala").getFiles.toSeq
def configurationSources(base: File): Seq[File] = (base * "*.sbt").getFiles.toSeq

View File

@ -428,7 +428,7 @@ object Classpaths
moduleID :== normalizedName,
defaultConfiguration in GlobalScope :== Some(Configurations.Compile),
defaultConfigurationMapping in GlobalScope <<= defaultConfiguration{ case Some(d) => "*->" + d.name; case None => "*->*" },
ivyPaths <<= (baseDirectory, appConfiguration) { (base, app) => new IvyPaths(base, Option(app.provider.scalaProvider.launcher.cacheDirectory)) },
ivyPaths <<= (baseDirectory, appConfiguration) { (base, app) => new IvyPaths(base, Option(app.provider.scalaProvider.launcher.ivyHome)) },
otherResolvers in GlobalScope :== Nil,
projectResolver <<= projectResolverTask,
projectDependencies <<= projectDependenciesTask,