mirror of https://github.com/sbt/sbt.git
Merge pull request #147 from eed3si9n/wip/api_mod
Let `ModuleDescriptor` declare cache inputs
This commit is contained in:
commit
47e4dca194
|
|
@ -102,7 +102,10 @@ lazy val lmCore = (project in file("core"))
|
||||||
// method open(java.net.URL)java.net.HttpURLConnection in object sbt.librarymanagement.Http does not have a correspondent in current version
|
// method open(java.net.URL)java.net.HttpURLConnection in object sbt.librarymanagement.Http does not have a correspondent in current version
|
||||||
// Was private[sbt] and manually checked to be unused in Zinc or sbt
|
// Was private[sbt] and manually checked to be unused in Zinc or sbt
|
||||||
ProblemFilters.exclude[DirectMissingMethodProblem]("sbt.librarymanagement.Http.open"),
|
ProblemFilters.exclude[DirectMissingMethodProblem]("sbt.librarymanagement.Http.open"),
|
||||||
|
// New methods added to LM API
|
||||||
|
ProblemFilters.exclude[ReversedMissingMethodProblem]("sbt.librarymanagement.ModuleDescriptor.moduleSettings"),
|
||||||
|
// New methods added to LM API
|
||||||
|
ProblemFilters.exclude[ReversedMissingMethodProblem]("sbt.librarymanagement.ModuleDescriptor.extraInputHash"),
|
||||||
// method globalLockIsoString()sjsonnew.IsoString in trait sbt.internal.librarymanagement.formats.GlobalLockFormat is present only in current version
|
// method globalLockIsoString()sjsonnew.IsoString in trait sbt.internal.librarymanagement.formats.GlobalLockFormat is present only in current version
|
||||||
// method xsbtiLoggerIsoString()sjsonnew.IsoString in trait sbt.internal.librarymanagement.formats.LoggerFormat is present only in current version
|
// method xsbtiLoggerIsoString()sjsonnew.IsoString in trait sbt.internal.librarymanagement.formats.LoggerFormat is present only in current version
|
||||||
// These only fail in Scala 2.11
|
// These only fail in Scala 2.11
|
||||||
|
|
|
||||||
|
|
@ -81,4 +81,14 @@ trait ModuleDescriptor {
|
||||||
* if any.
|
* if any.
|
||||||
*/
|
*/
|
||||||
def scalaModuleInfo: Option[ScalaModuleInfo]
|
def scalaModuleInfo: Option[ScalaModuleInfo]
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The input parameters used to construct the `ModuleSettings`.
|
||||||
|
*/
|
||||||
|
def moduleSettings: ModuleSettings
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hash for extra parameter that were not captured as `moduleSettings`.
|
||||||
|
*/
|
||||||
|
def extraInputHash: Long
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -36,10 +36,12 @@ import org.apache.ivy.util.extendable.ExtendableItem
|
||||||
import org.apache.ivy.util.url._
|
import org.apache.ivy.util.url._
|
||||||
import scala.xml.NodeSeq
|
import scala.xml.NodeSeq
|
||||||
import scala.collection.mutable
|
import scala.collection.mutable
|
||||||
import sbt.util.Logger
|
import scala.util.{ Success, Failure }
|
||||||
|
import sbt.util._
|
||||||
import sbt.librarymanagement.{ ModuleDescriptorConfiguration => InlineConfiguration, _ }
|
import sbt.librarymanagement.{ ModuleDescriptorConfiguration => InlineConfiguration, _ }
|
||||||
import sbt.librarymanagement.ivy._
|
import sbt.librarymanagement.ivy._
|
||||||
import sbt.librarymanagement.syntax._
|
import sbt.librarymanagement.syntax._
|
||||||
|
|
||||||
import IvyInternalDefaults._
|
import IvyInternalDefaults._
|
||||||
import Resolver.PluginPattern
|
import Resolver.PluginPattern
|
||||||
import ivyint.{
|
import ivyint.{
|
||||||
|
|
@ -49,6 +51,8 @@ import ivyint.{
|
||||||
SbtDefaultDependencyDescriptor,
|
SbtDefaultDependencyDescriptor,
|
||||||
GigahorseUrlHandler
|
GigahorseUrlHandler
|
||||||
}
|
}
|
||||||
|
import sjsonnew.JsonFormat
|
||||||
|
import sjsonnew.support.murmurhash.Hasher
|
||||||
|
|
||||||
final class IvySbt(val configuration: IvyConfiguration) { self =>
|
final class IvySbt(val configuration: IvyConfiguration) { self =>
|
||||||
/*
|
/*
|
||||||
|
|
@ -336,6 +340,73 @@ final class IvySbt(val configuration: IvyConfiguration) { self =>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
private def toURL(file: File) = file.toURI.toURL
|
private def toURL(file: File) = file.toURI.toURL
|
||||||
|
|
||||||
|
// Todo: We just need writing side of this codec. We can clean up the reads.
|
||||||
|
private[sbt] object AltLibraryManagementCodec extends IvyLibraryManagementCodec {
|
||||||
|
import sbt.io.Hash
|
||||||
|
type InlineIvyHL = (Option[IvyPaths], Vector[Resolver], Vector[Resolver], Vector[
|
||||||
|
ModuleConfiguration], Vector[String], Boolean)
|
||||||
|
def inlineIvyToHL(i: InlineIvyConfiguration): InlineIvyHL =
|
||||||
|
(i.paths, i.resolvers, i.otherResolvers, i.moduleConfigurations,
|
||||||
|
i.checksums, i.managedChecksums)
|
||||||
|
|
||||||
|
type ExternalIvyHL = (Option[PlainFileInfo], Array[Byte])
|
||||||
|
def externalIvyToHL(e: ExternalIvyConfiguration): ExternalIvyHL =
|
||||||
|
(e.baseDirectory.map(FileInfo.exists.apply),
|
||||||
|
e.uri.map(Hash.contentsIfLocal).getOrElse(Array.empty))
|
||||||
|
|
||||||
|
// Redefine to use a subset of properties, that are serialisable
|
||||||
|
override implicit lazy val InlineIvyConfigurationFormat: JsonFormat[InlineIvyConfiguration] = {
|
||||||
|
def hlToInlineIvy(i: InlineIvyHL): InlineIvyConfiguration = {
|
||||||
|
val (paths, resolvers, otherResolvers, moduleConfigurations, checksums, managedChecksums) = i
|
||||||
|
InlineIvyConfiguration()
|
||||||
|
.withPaths(paths)
|
||||||
|
.withResolvers(resolvers)
|
||||||
|
.withOtherResolvers(otherResolvers)
|
||||||
|
.withModuleConfigurations(moduleConfigurations)
|
||||||
|
.withManagedChecksums(managedChecksums)
|
||||||
|
.withChecksums(checksums)
|
||||||
|
}
|
||||||
|
projectFormat[InlineIvyConfiguration, InlineIvyHL](inlineIvyToHL, hlToInlineIvy)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Redefine to use a subset of properties, that are serialisable
|
||||||
|
override implicit lazy val ExternalIvyConfigurationFormat
|
||||||
|
: JsonFormat[ExternalIvyConfiguration] = {
|
||||||
|
def hlToExternalIvy(e: ExternalIvyHL): ExternalIvyConfiguration = {
|
||||||
|
val (baseDirectory, _) = e
|
||||||
|
ExternalIvyConfiguration(
|
||||||
|
None,
|
||||||
|
Some(NullLogger),
|
||||||
|
UpdateOptions(),
|
||||||
|
baseDirectory.map(_.file),
|
||||||
|
None /* the original uri is destroyed.. */,
|
||||||
|
Vector.empty
|
||||||
|
)
|
||||||
|
}
|
||||||
|
projectFormat[ExternalIvyConfiguration, ExternalIvyHL](externalIvyToHL, hlToExternalIvy)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Redefine to switch to unionFormat
|
||||||
|
override implicit lazy val IvyConfigurationFormat: JsonFormat[IvyConfiguration] =
|
||||||
|
unionFormat2[IvyConfiguration, InlineIvyConfiguration, ExternalIvyConfiguration]
|
||||||
|
|
||||||
|
object NullLogger extends sbt.internal.util.BasicLogger {
|
||||||
|
override def control(event: sbt.util.ControlEvent.Value, message: ⇒ String): Unit = ()
|
||||||
|
override def log(level: Level.Value, message: ⇒ String): Unit = ()
|
||||||
|
override def logAll(events: Seq[sbt.util.LogEvent]): Unit = ()
|
||||||
|
override def success(message: ⇒ String): Unit = ()
|
||||||
|
override def trace(t: ⇒ Throwable): Unit = ()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
def extraInputHash: Long = {
|
||||||
|
import AltLibraryManagementCodec._
|
||||||
|
Hasher.hash(owner.configuration) match {
|
||||||
|
case Success(keyHash) => keyHash.toLong
|
||||||
|
case Failure(_) => 0L
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue