diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 000000000..a5b73c0d8 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,4 @@ +language: scala +scala: + - 2.10.5 + - 2.11.7 diff --git a/build.sbt b/build.sbt index 39eceba3f..71e663210 100644 --- a/build.sbt +++ b/build.sbt @@ -7,11 +7,12 @@ def commonSettings: Seq[Setting[_]] = Seq( // publishArtifact in packageDoc := false, resolvers += Resolver.typesafeIvyRepo("releases"), resolvers += Resolver.sonatypeRepo("snapshots"), + resolvers += Resolver.bintrayRepo("sbt", "maven-releases"), // concurrentRestrictions in Global += Util.testExclusiveRestriction, testOptions += Tests.Argument(TestFrameworks.ScalaCheck, "-w", "1"), javacOptions in compile ++= Seq("-target", "6", "-source", "6", "-Xlint", "-Xlint:-serial"), incOptions := incOptions.value.withNameHashing(true), - // crossScalaVersions := Seq(scala210) + crossScalaVersions := Seq(scala210, scala211), // bintrayPackage := (bintrayPackage in ThisBuild).value, // bintrayRepository := (bintrayRepository in ThisBuild).value, resolvers += Resolver.sonatypeRepo("public") @@ -47,7 +48,8 @@ lazy val root = (project in file(".")). lazy val lm = (project in file("librarymanagement")). settings( commonSettings, - libraryDependencies ++= Seq(utilLogging, ioProj, utilCollection), - libraryDependencies ++= Seq(ivy, jsch, sbtSerialization, scalaReflect.value, launcherInterface), + libraryDependencies ++= Seq(utilLogging, utilLogging), + libraryDependencies ++= Seq(sbtIO, utilCollection, ivy, jsch, sbtSerialization, scalaReflect.value, launcherInterface), + resourceGenerators in Compile <+= (version, resourceManaged, streams, compile in Compile) map Util.generateVersionFile, name := "librarymanagement" ) diff --git a/librarymanagement/src/main/scala/sbt/ConvertResolver.scala b/librarymanagement/src/main/scala/sbt/ConvertResolver.scala index 9768241d5..9e2f11f63 100644 --- a/librarymanagement/src/main/scala/sbt/ConvertResolver.scala +++ b/librarymanagement/src/main/scala/sbt/ConvertResolver.scala @@ -17,6 +17,7 @@ import org.apache.ivy.plugins.repository.file.{ FileRepository => FileRepo, File import java.io.{ IOException, File } import org.apache.ivy.util.{ FileUtil, ChecksumHelper } import org.apache.ivy.core.module.descriptor.{ Artifact => IArtifact } +import sbt.io.IO private[sbt] object ConvertResolver { import UpdateOptions.ResolverConverter diff --git a/librarymanagement/src/main/scala/sbt/Credentials.scala b/librarymanagement/src/main/scala/sbt/Credentials.scala index 464d5de8e..9cbe9d977 100644 --- a/librarymanagement/src/main/scala/sbt/Credentials.scala +++ b/librarymanagement/src/main/scala/sbt/Credentials.scala @@ -5,6 +5,7 @@ package sbt import java.io.File import org.apache.ivy.util.url.CredentialsStore +import sbt.io.IO object Credentials { def apply(realm: String, host: String, userName: String, passwd: String): Credentials = diff --git a/librarymanagement/src/main/scala/sbt/CustomPomParser.scala b/librarymanagement/src/main/scala/sbt/CustomPomParser.scala index be98bfe25..8cf372af0 100644 --- a/librarymanagement/src/main/scala/sbt/CustomPomParser.scala +++ b/librarymanagement/src/main/scala/sbt/CustomPomParser.scala @@ -13,6 +13,7 @@ import java.io.{ File, InputStream } import java.net.URL import java.util.regex.Pattern import sbt.mavenint.{ PomExtraDependencyAttributes, SbtPomExtraProperties } +import sbt.io.Hash @deprecated("We now use an Aether-based pom parser.", "0.13.8") final class CustomPomParser(delegate: ModuleDescriptorParser, transform: (ModuleDescriptorParser, ModuleDescriptor) => ModuleDescriptor) extends ModuleDescriptorParser { diff --git a/librarymanagement/src/main/scala/sbt/DependencyFilter.scala b/librarymanagement/src/main/scala/sbt/DependencyFilter.scala index fee8da46c..701d179aa 100644 --- a/librarymanagement/src/main/scala/sbt/DependencyFilter.scala +++ b/librarymanagement/src/main/scala/sbt/DependencyFilter.scala @@ -3,6 +3,8 @@ */ package sbt +import sbt.io.{ AllPassFilter, NameFilter } + trait DependencyFilterExtra { def moduleFilter(organization: NameFilter = AllPassFilter, name: NameFilter = AllPassFilter, revision: NameFilter = AllPassFilter): ModuleFilter = new ModuleFilter { @@ -57,4 +59,4 @@ trait ArtifactFilter extends SubDepFilter[Artifact, ArtifactFilter] { trait ConfigurationFilter extends SubDepFilter[String, ConfigurationFilter] { protected final def make(f: String => Boolean) = new ConfigurationFilter { def apply(m: String) = f(m) } final def apply(configuration: String, module: ModuleID, artifact: Artifact): Boolean = apply(configuration) -} \ No newline at end of file +} diff --git a/librarymanagement/src/main/scala/sbt/IvyActions.scala b/librarymanagement/src/main/scala/sbt/IvyActions.scala index 33436452c..e3cc20602 100644 --- a/librarymanagement/src/main/scala/sbt/IvyActions.scala +++ b/librarymanagement/src/main/scala/sbt/IvyActions.scala @@ -16,6 +16,7 @@ import org.apache.ivy.core.module.descriptor.{ Artifact => IArtifact, MDArtifact import org.apache.ivy.core.report.ResolveReport import org.apache.ivy.core.resolve.ResolveOptions import org.apache.ivy.plugins.resolver.{ BasicResolver, DependencyResolver } +import sbt.io.{ IO, PathFinder } final class DeliverConfiguration(val deliverIvyPattern: String, val status: String, val configurations: Option[Seq[Configuration]], val logging: UpdateLogging.Value) final class PublishConfiguration(val ivyFile: Option[File], val resolverName: String, val artifacts: Map[Artifact, File], val checksums: Seq[String], val logging: UpdateLogging.Value, @@ -304,7 +305,7 @@ object IvyActions { case None => None case Some(configs) => Some(configs.map(_.name)) } - val existingFiles = PathFinder(base).***.get filterNot { _.isDirectory } + val existingFiles = PathFinder(base).allPaths.get filterNot { _.isDirectory } val toCopy = new collection.mutable.HashSet[(File, File)] val retReport = report retrieve { (conf, mid, art, cached) => configurationNames match { diff --git a/librarymanagement/src/main/scala/sbt/IvyCache.scala b/librarymanagement/src/main/scala/sbt/IvyCache.scala index ce2ddd9f2..1e715a278 100644 --- a/librarymanagement/src/main/scala/sbt/IvyCache.scala +++ b/librarymanagement/src/main/scala/sbt/IvyCache.scala @@ -12,6 +12,7 @@ import org.apache.ivy.plugins.repository.file.{ FileRepository => IvyFileReposit import org.apache.ivy.plugins.repository.{ ArtifactResourceResolver, Resource, ResourceDownloader } import org.apache.ivy.plugins.resolver.util.ResolvedResource import org.apache.ivy.util.FileUtil +import sbt.io.Path class NotInCache(val id: ModuleID, cause: Throwable) extends RuntimeException(NotInCache(id, cause), cause) { diff --git a/librarymanagement/src/main/scala/sbt/JsonUtil.scala b/librarymanagement/src/main/scala/sbt/JsonUtil.scala index d4db781f7..6ee5bd68a 100644 --- a/librarymanagement/src/main/scala/sbt/JsonUtil.scala +++ b/librarymanagement/src/main/scala/sbt/JsonUtil.scala @@ -24,7 +24,7 @@ private[sbt] object JsonUtil { } def writeUpdateReport(ur: UpdateReport, graphPath: File): Unit = { - IO.createDirectory(graphPath.getParentFile) + sbt.io.IO.createDirectory(graphPath.getParentFile) toJsonFile(toLite(ur), graphPath) } def toLite(ur: UpdateReport): UpdateReportLite = diff --git a/librarymanagement/src/main/scala/sbt/LogicalClock.scala b/librarymanagement/src/main/scala/sbt/LogicalClock.scala index d4e1d4cc3..83c516a17 100644 --- a/librarymanagement/src/main/scala/sbt/LogicalClock.scala +++ b/librarymanagement/src/main/scala/sbt/LogicalClock.scala @@ -12,7 +12,7 @@ object LogicalClock { def apply(hashCode: Int): LogicalClock = { def intToByteArray(x: Int): Array[Byte] = Array((x >>> 24).toByte, (x >> 16 & 0xff).toByte, (x >> 8 & 0xff).toByte, (x & 0xff).toByte) - apply(Hash.toHex(intToByteArray(hashCode))) + apply(sbt.io.Hash.toHex(intToByteArray(hashCode))) } def apply(x: String): LogicalClock = new LogicalClock { override def toString: String = x diff --git a/librarymanagement/src/main/scala/sbt/MakePom.scala b/librarymanagement/src/main/scala/sbt/MakePom.scala index e2018612f..472dd6cfb 100644 --- a/librarymanagement/src/main/scala/sbt/MakePom.scala +++ b/librarymanagement/src/main/scala/sbt/MakePom.scala @@ -21,6 +21,7 @@ import org.apache.ivy.core.settings.IvySettings import org.apache.ivy.core.module.descriptor.{ DependencyArtifactDescriptor, DependencyDescriptor, License, ModuleDescriptor, ExcludeRule } import org.apache.ivy.plugins.resolver.{ ChainResolver, DependencyResolver, IBiblioResolver } import ivyint.CustomRemoteMavenResolver +import sbt.io.IO object MakePom { /** True if the revision is an ivy-range, not a complete revision. */ def isDependencyVersionRange(revision: String): Boolean = { diff --git a/librarymanagement/src/main/scala/sbt/ResolutionCache.scala b/librarymanagement/src/main/scala/sbt/ResolutionCache.scala index a68c52417..30b8d74f7 100644 --- a/librarymanagement/src/main/scala/sbt/ResolutionCache.scala +++ b/librarymanagement/src/main/scala/sbt/ResolutionCache.scala @@ -12,6 +12,7 @@ import core.module.id.ModuleRevisionId import core.module.descriptor.ModuleDescriptor import ResolutionCache.{ Name, ReportDirectory, ResolvedName, ResolvedPattern } import parser.xml.XmlModuleDescriptorParser +import sbt.io.IO /** * Replaces the standard Ivy resolution cache in order to: diff --git a/librarymanagement/src/main/scala/sbt/Resolver.scala b/librarymanagement/src/main/scala/sbt/Resolver.scala index ce3a2830f..ec2564b43 100644 --- a/librarymanagement/src/main/scala/sbt/Resolver.scala +++ b/librarymanagement/src/main/scala/sbt/Resolver.scala @@ -345,9 +345,9 @@ object Resolver { case _: IOException => None case e: SAXParseException => System.err.println(s"WARNING: Problem parsing ${f().getAbsolutePath}, ${e.getMessage}"); None } - loadHomeFromSettings(() => new File(Path.userHome, ".m2/settings.xml")) orElse + loadHomeFromSettings(() => new File(sbt.io.Path.userHome, ".m2/settings.xml")) orElse loadHomeFromSettings(() => new File(new File(System.getenv("M2_HOME")), "conf/settings.xml")) getOrElse - new File(Path.userHome, ".m2/repository") + new File(sbt.io.Path.userHome, ".m2/repository") } // TODO - should this just be the *exact* same as mavenLocal? probably... def publishMavenLocal: MavenCache = new MavenCache("publish-m2-local", mavenLocalDir) diff --git a/librarymanagement/src/main/scala/sbt/ivyint/CachedResolutionResolveEngine.scala b/librarymanagement/src/main/scala/sbt/ivyint/CachedResolutionResolveEngine.scala index a1fc5ddfc..ab0896649 100644 --- a/librarymanagement/src/main/scala/sbt/ivyint/CachedResolutionResolveEngine.scala +++ b/librarymanagement/src/main/scala/sbt/ivyint/CachedResolutionResolveEngine.scala @@ -22,6 +22,7 @@ import org.apache.ivy.plugins.matcher.{ MapMatcher, PatternMatcher } import Configurations.{ System => _, _ } import annotation.tailrec import scala.concurrent.duration._ +import sbt.io.{ DirectoryFilter, Hash, IO, Path } private[sbt] object CachedResolutionResolveCache { def createID(organization: String, name: String, revision: String) = diff --git a/librarymanagement/src/test/scala/BaseIvySpecification.scala b/librarymanagement/src/test/scala/BaseIvySpecification.scala index a8a19ea76..f4e21c4c0 100644 --- a/librarymanagement/src/test/scala/BaseIvySpecification.scala +++ b/librarymanagement/src/test/scala/BaseIvySpecification.scala @@ -1,6 +1,7 @@ package sbt -import Path._, Configurations._ +import sbt.io.Path._, Configurations._ +import sbt.io.IO import java.io.File import org.specs2._ import cross.CrossVersionUtil diff --git a/librarymanagement/src/test/scala/ComponentManagerTest.scala b/librarymanagement/src/test/scala/ComponentManagerTest.scala index 165bdf9e2..29017b6a3 100644 --- a/librarymanagement/src/test/scala/ComponentManagerTest.scala +++ b/librarymanagement/src/test/scala/ComponentManagerTest.scala @@ -4,7 +4,8 @@ import java.io.File import java.util.concurrent.Callable import org.specs2._ import mutable.Specification -import IO.{ createDirectory, delete, touch, withTemporaryDirectory } +import sbt.io.IO.{ createDirectory, delete, touch, withTemporaryDirectory } +import sbt.io.IO import org.apache.ivy.util.ChecksumHelper import IfMissing.Fail import xsbti.ComponentProvider diff --git a/librarymanagement/src/test/scala/CustomPomParserTest.scala b/librarymanagement/src/test/scala/CustomPomParserTest.scala index 1bc39a120..262e4a22b 100644 --- a/librarymanagement/src/test/scala/CustomPomParserTest.scala +++ b/librarymanagement/src/test/scala/CustomPomParserTest.scala @@ -4,7 +4,7 @@ import org.apache.ivy.core.module.id.ModuleRevisionId import org.apache.ivy.core.resolve.ResolveOptions import org.specs2.mutable.Specification import sbt._ -import IO.withTemporaryDirectory +import sbt.io.IO.withTemporaryDirectory object CustomPomParserTest extends Specification { diff --git a/project/Dependencies.scala b/project/Dependencies.scala index e0f1916fc..92f1a778d 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -2,9 +2,12 @@ import sbt._ import Keys._ object Dependencies { + lazy val scala210 = "2.10.5" + lazy val scala211 = "2.11.7" + val utilVersion = "0.1.0-M1" val ioVersion = "1.0.0-M1" - lazy val ioProj = "org.scala-sbt" %% "io" % ioVersion + lazy val sbtIO = "org.scala-sbt" %% "io" % ioVersion lazy val utilCollection = "org.scala-sbt" %% "util-collection" % utilVersion lazy val utilLogging = "org.scala-sbt" %% "util-logging" % utilVersion @@ -12,10 +15,5 @@ object Dependencies { lazy val ivy = "org.scala-sbt.ivy" % "ivy" % "2.3.0-sbt-927bc9ded7f8fba63297cddd0d5a3d01d6ad5d8d" lazy val jsch = "com.jcraft" % "jsch" % "0.1.46" intransitive () lazy val sbtSerialization = "org.scala-sbt" %% "serialization" % "0.1.2" - // lazy val sbinary = "org.scala-tools.sbinary" %% "sbinary" % "0.4.2" - // lazy val scalaCheck = "org.scalacheck" %% "scalacheck" % "1.11.4" - // lazy val specs2 = "org.specs2" %% "specs2" % "2.3.11" - // lazy val junit = "junit" % "junit" % "4.11" - // lazy val scalaCompiler = Def.setting { "org.scala-lang" % "scala-compiler" % scalaVersion.value } lazy val scalaReflect = Def.setting { "org.scala-lang" % "scala-reflect" % scalaVersion.value } } diff --git a/project/Util.scala b/project/Util.scala new file mode 100644 index 000000000..26533a73b --- /dev/null +++ b/project/Util.scala @@ -0,0 +1,32 @@ +import sbt._ +import Keys._ +import sbt.IO + +import java.io.File + + +object Util { + + def versionLine(version: String): String = "version=" + version + def containsVersion(propFile: File, version: String): Boolean = IO.read(propFile).contains(versionLine(version)) + def lastCompilationTime(analysis: sbt.inc.Analysis): Long = + { + val lastCompilation = analysis.compilations.allCompilations.lastOption + lastCompilation.map(_.startTime) getOrElse 0L + } + + def generateVersionFile(version: String, dir: File, s: TaskStreams, analysis: sbt.inc.Analysis): Seq[File] = + { + import java.util.{ Date, TimeZone } + val formatter = new java.text.SimpleDateFormat("yyyyMMdd'T'HHmmss") + formatter.setTimeZone(TimeZone.getTimeZone("GMT")) + val timestamp = formatter.format(new Date) + val content = versionLine(version) + "\ntimestamp=" + timestamp + val f = dir / "xsbt.version.properties" + if (!f.exists || f.lastModified < lastCompilationTime(analysis) || !containsVersion(f, version)) { + s.log.info("Writing version information to " + f + " :\n" + content) + IO.write(f, content) + } + f :: Nil + } +}