work on dependency management tests

This commit is contained in:
Mark Harrah 2011-04-16 14:40:13 -04:00
parent 7acfad0234
commit 5806dbaab0
41 changed files with 180 additions and 253 deletions

View File

@ -26,7 +26,7 @@ final class PublishConfiguration(val ivyFile: Option[File], val resolverName: St
final class UpdateConfiguration(val retrieve: Option[RetrieveConfiguration], val missingOk: Boolean, val logging: UpdateLogging.Value)
final class RetrieveConfiguration(val retrieveDirectory: File, val outputPattern: String)
final class MakePomConfiguration(val file: File, val configurations: Option[Iterable[Configuration]] = None, val extra: NodeSeq = NodeSeq.Empty, val process: Node => Node = n => n, val filterRepositories: MavenRepository => Boolean = _ => true)
final case class MakePomConfiguration(file: File, configurations: Option[Iterable[Configuration]] = None, extra: NodeSeq = NodeSeq.Empty, process: Node => Node = n => n, filterRepositories: MavenRepository => Boolean = _ => true)
/** Configures logging during an 'update'. `level` determines the amount of other information logged.
* `Full` is the default and logs the most.

View File

@ -21,7 +21,7 @@ object ScalaArtifacts
import ScalaArtifacts._
final class IvyScala(val scalaVersion: String, val configurations: Iterable[Configuration], val checkExplicit: Boolean, val filterImplicit: Boolean, val overrideScalaVersion: Boolean)
final case class IvyScala(scalaVersion: String, configurations: Iterable[Configuration], checkExplicit: Boolean, filterImplicit: Boolean, overrideScalaVersion: Boolean)
{
// otherwise, Ivy produces the error: "impossible to get artifacts when data has not been loaded"
// which may be related to sbt's custom conflict manager, to IVY-987, or both

View File

@ -606,9 +606,10 @@ object Classpaths
/*}
f(module.owner.configuration :+: module.moduleSettings :+: config :+: HNil)*/
}*/
def makePomConfigurationTask(file: File, configurations: Option[Iterable[Configuration]] = None, extra: NodeSeq = NodeSeq.Empty, process: XNode => XNode = n => n, filterRepositories: MavenRepository => Boolean = _ => true) =
def makePomConfigurationTask(file: File, configurations: Option[Iterable[Configuration]] = None, extra: NodeSeq = NodeSeq.Empty, process: XNode => XNode = n => n, filterRepositories: MavenRepository => Boolean = defaultRepositoryFilter) =
new MakePomConfiguration(file, configurations, extra, process, filterRepositories)
def defaultRepositoryFilter = (repo: MavenRepository) => !repo.root.startsWith("file:")
def getPublishTo(repo: Option[Resolver]): Resolver = repo getOrElse error("Repository for publishing is not specified.")
def deliverConfig(outputDirectory: File, status: String = "release", logging: UpdateLogging.Value = UpdateLogging.DownloadOnly) =

View File

@ -1,11 +1,6 @@
ivyPaths <<= baseDirectory( dir => new IvyPaths(dir, Some(dir / "ivy-home")))
seq(externalIvySettings(), externalIvyFile())
TaskKey("check") <<= update map { report =>
TaskKey("check") <<= (baseDirectory, update) map { (base, report) =>
val files = report.matching( moduleFilter(organization = "org.scalacheck", name = "scalacheck", revision = "1.5") )
if(shouldExist)
assert(!files.isEmpty, "ScalaCheck module not found in update report")
else
assert(files.isEmpty, "ScalaCheck module found in update report unexpectedly")
assert(!files.isEmpty, "ScalaCheck module not found in update report")
}

View File

@ -1,4 +0,0 @@
#Project properties
#Sun Feb 01 13:49:30 EST 2009
project.name=Ivy Settings Test
project.version=1.0.0

View File

@ -1,7 +0,0 @@
import sbt._
class TestProject(info: ProjectInfo) extends DefaultProject(info)
{
override def ivyCacheDirectory = Some(outputPath / "ivy-cache")
override def disableCrossPaths = true
}

View File

@ -2,8 +2,6 @@
$ copy-file changes/scalacheck-ivy.xml ivy.xml
-> update
$ absent lib_managed/default/scalacheck-1.5.jar
$ copy-file changes/scala-tools-ivysettings.xml ivysettings.xml
> update
$ exists lib_managed/default/scalacheck-1.5.jar
> check

View File

@ -0,0 +1,8 @@
externalIvySettings()
libraryDependencies += "org.scalacheck" % "scalacheck" % "1.5"
TaskKey("check") <<= (baseDirectory, update) map { (base, report) =>
val files = report.matching( moduleFilter(organization = "org.scalacheck", name = "scalacheck", revision = "1.5") )
assert(!files.isEmpty, "ScalaCheck module not found in update report")
}

View File

@ -1,4 +0,0 @@
#Project properties
#Sun Feb 01 15:33:35 EST 2009
project.name=Ivy Settings Test B
project.version=1.0.1

View File

@ -1,8 +0,0 @@
import sbt._
class UpdateTestProject(info: ProjectInfo) extends DefaultProject(info)
{
val sc = "org.scalacheck" % "scalacheck" % "1.5"
override def ivyCacheDirectory = Some(outputPath / "ivy-cache")
override def disableCrossPaths = true
}

View File

@ -1,6 +1,4 @@
-> update
$ absent lib_managed/compile/scalacheck-1.5.jar
$ copy-file changes/scala-tools-ivysettings.xml ivysettings.xml
> update
$ exists lib_managed/compile/scalacheck-1.5.jar
> check

View File

@ -0,0 +1,5 @@
ivyPaths <<= baseDirectory( dir => new IvyPaths(dir, Some(dir / "ivy-home")))
resolvers += JavaNet1Repository
libraryDependencies += "javax.ejb" % "ejb-api" % "3.0"

View File

@ -1,2 +0,0 @@
project.name=test
project.version=1.0.0

View File

@ -1,8 +0,0 @@
import sbt._
class TestProject(info: ProjectInfo) extends DefaultProject(info)
{
override def ivyCacheDirectory = Some(outputPath / "ivy-cache")
val javaNet = JavaNet1Repository
val ejb = "javax.ejb" % "ejb-api" % "3.0"
}

View File

@ -0,0 +1,59 @@
import sbt.{Node =>_,_}
import Keys._
import scala.xml._
object MakePomTest extends Build
{
lazy val projects = Seq(root)
lazy val root = Project("root", file(".")) settings(
readPom <<= makePom map XML.loadFile,
TaskKey("check-pom") <<= checkPom,
TaskKey("check-extra") <<= checkExtra,
makePomConfiguration ~= { _.copy(extra = <extra-tag/>) }
)
val readPom = TaskKey[Elem]("read-pom")
val fakeName = "fake"
val fakeURL = "http://example.org"
val fakeRepo = fakeName at fakeURL
def extraTagName = "extra-tag"
def checkProject(pom: Elem) = if(pom.label != "project") error("Top level element was not 'project': " + pom.label)
def withRepositories[T](pomXML: Elem)(f: NodeSeq => T) =
{
val repositoriesElement = pomXML \ "repositories"
if(repositoriesElement.size == 1) f(repositoriesElement) else error("'repositories' element not found in generated pom")
}
lazy val checkExtra = readPom map { pomXML =>
checkProject(pomXML)
val extra = pomXML \ extraTagName
if(extra.isEmpty) error("'" + extraTagName + "' not found in generated pom.xml.")
}
lazy val checkPom = (readPom, fullResolvers) map { (pomXML, ivyRepositories) =>
checkProject(pomXML)
withRepositories(pomXML) { repositoriesElement =>
val repositories = repositoriesElement \ "repository"
val writtenRepositories = repositories.map(read).distinct
val mavenStyleRepositories = ivyRepositories.collect { case x: MavenRepository if x.name != "public" => normalize(x) } distinct;
lazy val explain = (("Written:" +: writtenRepositories) ++ ("Declared:" +: mavenStyleRepositories)).mkString("\n\t")
if( writtenRepositories != mavenStyleRepositories )
error("Written repositories did not match declared repositories.\n\t" + explain)
}
}
def read(repository: Node): MavenRepository =
(repository \ "name").text at normalize((repository \ "url").text)
def normalize(url: String): String =
{
val base = uri( url ).normalize.toString
if(base.endsWith("/")) base else (base + "/")
}
def normalize(repo: MavenRepository): MavenRepository = new MavenRepository(repo.name, normalize(repo.root))
}

View File

@ -1,3 +0,0 @@
project.name=Make Pom Test
project.organization=test
project.version=1.0

View File

@ -1,55 +0,0 @@
import sbt._
import scala.xml._
class MakePomTest(info: ProjectInfo) extends DefaultProject(info)
{
val fakeName = "fake"
val fakeURL = "http://example.org"
val fakeRepo = fakeName at fakeURL
def extraTagName = "extra-tag"
override def pomExtra = <extra-tag/>
def readPom = XML.loadFile(pomPath.asFile)
def checkProject(pom: Elem): Either[String, Elem] = if(pom.label == "project") Right(pom) else Left("Top level element was not 'project': " + pom.label)
def withPom(f: Elem => Either[String, Unit]) = task {
checkProject(readPom).right.flatMap(f).left.toOption
}
def withRepositories[T](pomXML: Elem)(f: NodeSeq => Either[String, T]) =
{
val repositoriesElement = pomXML \ "repositories"
if(repositoriesElement.size == 1) f(repositoriesElement) else Left("'repositories' element not found in generated pom")
}
lazy val checkExtra = withPom { pomXML =>
val extra = pomXML \ extraTagName
if(extra.isEmpty) Left("'" + extraTagName + "' not found in generated pom.xml.") else Right(())
}
lazy val checkPom = withPom { pomXML =>
withRepositories(pomXML) { repositoriesElement =>
val repositories = repositoriesElement \ "repository"
val writtenRepositories = Set() ++ repositories.map(read)
val mavenStyleRepositories = Set() ++ ivyRepositories.filter(x => x.isInstanceOf[MavenRepository] && x.name != "public").map(normalize)
lazy val explain = ("Written:" :: writtenRepositories.toList ::: "Declared:" :: mavenStyleRepositories.toList).mkString("\n\t")
if( writtenRepositories == mavenStyleRepositories ) Right(())
else Left("Written repositories did not match declared repositories.\n\t" + explain)
}
}
def read(repository: Node): MavenRepository =
(repository \ "name").text at normalize((repository \ "url").text)
def normalize(url: String): String =
{
val base = (new java.net.URI( url )).normalize.toString
if(base.endsWith("/")) base else (base + "/")
}
def normalize(repo: Resolver): Resolver = repo match { case mr: MavenRepository => normalize(mr); case _ => repo }
def normalize(repo: MavenRepository): MavenRepository = new MavenRepository(repo.name, normalize(repo.root))
}

View File

@ -1,7 +1,2 @@
-> check-pom
-> check-extra
> make-pom
> check-pom
> check-extra

View File

@ -0,0 +1,7 @@
{
def snapshotPattern = "http://scala-tools.org/repo-snapshots/[organization]/[module]/2.10.0-SNAPSHOT/[artifact]-[revision].[ext]"
def scalaSnapshots = Resolver.url("Scala Tools Snapshots") artifacts(snapshotPattern) ivys(snapshotPattern) mavenStyle()
moduleConfigurations += ModuleConfiguration("org.scala-lang", "*", "2.10.0-.*", scalaSnapshots)
}
libraryDependencies += "org.scala-lang" % "scala-compiler" % "2.10.0-20110412.015459-16"

View File

@ -0,0 +1,7 @@
{
def snapshotPattern = "http://scala-tools.org/repo-snapshots/[organization]/[module]/2.10.0-SNAPSHOT/[artifact]-[revision].[ext]"
def scalaSnapshots = Resolver.url("Scala Tools Snapshots") artifacts(snapshotPattern) ivys(snapshotPattern) mavenStyle()
moduleConfigurations += ModuleConfiguration("org.not-scala-lang", "*", "2.10.0-.*", scalaSnapshots)
}
libraryDependencies += "org.scala-lang" % "scala-compiler" % "2.10.0-20110412.015459-16"

View File

@ -1,13 +0,0 @@
import sbt._
class Test(info: ProjectInfo) extends DefaultProject(info)
{
override def ivyCacheDirectory = Some(outputPath / "ivy-cache")
def snapshotPattern = "http://scala-tools.org/repo-snapshots/[organization]/[module]/2.8.0-SNAPSHOT/[artifact]-[revision].[ext]"
def scalaSnapshots = Resolver.url("Scala Tools Snapshots") artifacts(snapshotPattern) ivys(snapshotPattern) mavenStyle()
val scOnly = ModuleConfiguration("org.not-scala-lang", "*", "2.8.0-.*", scalaSnapshots)
val uniqueScala = "org.scala-lang" % "scala-compiler" % "2.8.0-20100115.022156-304"
val otherDep = "org.scala-tools.sxr" % "sxr_2.7.5" % "0.2.3"
}

View File

@ -0,0 +1,7 @@
{
def snapshotPattern = "http://scala-tools.org/repo-snapshots/[organization]/[module]/2.10.a-SNAPSHOT/[artifact]-[revision].[ext]"
def scalaSnapshots = Resolver.url("Scala Tools Snapshots") artifacts(snapshotPattern) ivys(snapshotPattern) mavenStyle()
moduleConfigurations += ModuleConfiguration("org.scala-lang", "*", "2.10.0-.*", scalaSnapshots)
}
libraryDependencies += "org.scala-lang" % "scala-compiler" % "2.10.0-20110412.015459-16"

View File

@ -1,13 +0,0 @@
import sbt._
class Test(info: ProjectInfo) extends DefaultProject(info)
{
override def ivyCacheDirectory = Some(outputPath / "ivy-cache")
def snapshotPattern = "http://scala-tools.org/repo-snapshots/[organization]/[module]/2.8.a-SNAPSHOT/[artifact]-[revision].[ext]"
def scalaSnapshots = Resolver.url("Scala Tools Snapshots") artifacts(snapshotPattern) ivys(snapshotPattern) mavenStyle()
val scOnly = ModuleConfiguration("org.scala-lang", "*", "2.8.0-.*", scalaSnapshots)
val uniqueScala = "org.scala-lang" % "scala-compiler" % "2.8.0-20100115.022156-304"
val otherDep = "org.scala-tools.sxr" % "sxr_2.7.5" % "0.2.3"
}

View File

@ -0,0 +1,7 @@
{
def snapshotPattern = "http://scala-tools.org/repo-snapshots/[organization]/[module]/2.10.0-SNAPSHOT/[artifact]-[revision].[ext]"
def scalaSnapshots = Resolver.url("Scala Tools Snapshots") artifacts(snapshotPattern) ivys(snapshotPattern) mavenStyle()
moduleConfigurations += ModuleConfiguration("org.scala-lang", "*", "2.10.0-.*", scalaSnapshots)
}
libraryDependencies += "org.scala-lang" % "scala-compiler" % "2.10.0-20110412.015459-17"

View File

@ -1,13 +0,0 @@
import sbt._
class Test(info: ProjectInfo) extends DefaultProject(info)
{
override def ivyCacheDirectory = Some(outputPath / "ivy-cache")
def snapshotPattern = "http://scala-tools.org/repo-snapshots/[organization]/[module]/2.8.0-SNAPSHOT/[artifact]-[revision].[ext]"
def scalaSnapshots = Resolver.url("Scala Tools Snapshots") artifacts(snapshotPattern) ivys(snapshotPattern) mavenStyle()
val scOnly = ModuleConfiguration("org.scala-lang", "*", "2.8.0-.*", scalaSnapshots)
val uniqueScala = "org.scala-lang" % "scala-compiler" % "2.8.0-20100115.022156-305"
val otherDep = "org.scala-tools.sxr" % "sxr_2.7.5" % "0.2.3"
}

View File

@ -0,0 +1,5 @@
ivyScala ~= { (is: Option[IvyScala]) => is.map(_.copy(checkExplicit = false, overrideScalaVersion = false)) }
ivyPaths <<= baseDirectory( dir => new IvyPaths(dir, Some(dir / "ivy-home")))
libraryDependencies += "junit" % "junit" % "4.8"

View File

@ -1,2 +0,0 @@
project.name=Test Module Configurations
project.version=1.0

View File

@ -1,15 +0,0 @@
import sbt._
class Test(info: ProjectInfo) extends DefaultProject(info)
{
override def ivyCacheDirectory = Some(outputPath / "ivy-cache")
def snapshotPattern = "http://scala-tools.org/repo-snapshots/[organization]/[module]/2.8.0-SNAPSHOT/[artifact]-[revision].[ext]"
def scalaSnapshots = Resolver.url("Scala Tools Snapshots") artifacts(snapshotPattern) ivys(snapshotPattern) mavenStyle()
val scOnly = ModuleConfiguration("org.scala-lang", "*", "2.8.0-.*", scalaSnapshots)
val uniqueScala = "org.scala-lang" % "scala-compiler" % "2.8.0-20100511.013550-380"
val otherDep = "org.scala-tools.sxr" % "sxr_2.7.5" % "0.2.3"
override def checkExplicitScalaDependencies = false
}

View File

@ -1,14 +1,16 @@
> update
> clean
$ copy-file changes/WrongOrg.scala project/build/Test.scala
$ copy-file changes/WrongOrg.sbt Test.sbt
> reload
-> update
> clean
$ copy-file changes/WrongVersion.scala project/build/Test.scala
$ copy-file changes/WrongVersion.sbt Test.sbt
> reload
-> update
> clean
$ copy-file changes/WrongPattern.scala project/build/Test.scala
$ copy-file changes/WrongPattern.sbt Test.sbt
> reload
-> update

View File

@ -1,2 +0,0 @@
project.name=Publish Test
project.version=1.0

View File

@ -1,33 +0,0 @@
import sbt._
class Test(info: ProjectInfo) extends DefaultProject(info)
{
override def ivyCacheDirectory = Some(outputPath / "ivy-cache")
override def managedStyle = ManagedStyle.Maven
def testRepoPath = path("test-repo")
val publishTo = Resolver.file("test repo", testRepoPath asFile)
def srcExt = "-sources.jar"
def srcFilter = extFilter(srcExt)
def docExt = "-javadoc.jar"
def docFilter = extFilter(docExt)
def extFilter(ext: String) = "*" + ext
override def packageDocsJar = defaultJarPath(docExt)
override def packageSrcJar= defaultJarPath(srcExt)
val sourceArtifact = Artifact(artifactID, "src", "jar", "sources")
val docsArtifact = Artifact(artifactID, "docs", "jar", Some("javadoc"), Nil, None)
override def packageToPublishActions = super.packageToPublishActions ++ Seq(packageDocs, packageSrc)
lazy val check = task { check0 }
def check0 = checkPom orElse checkBin orElse checkSource orElse checkDoc
def checkPom = exists("pom", "*.pom")
def checkDoc = exists("javadoc", docFilter)
def checkSource = exists("sources", srcFilter)
def checkBin = exists("binary", "*.jar" - (srcFilter | docFilter))
def exists(label: String, filter: sbt.NameFilter) =
if( (testRepoPath ** filter).get.isEmpty) Some("No " + label + " published") else None
}

View File

@ -1,3 +0,0 @@
-> check
> publish
> check

View File

@ -0,0 +1,17 @@
import sbt._
import Keys._
object SettingsTest extends Build
{
lazy val projects = Seq(parent, sub, configgy)
lazy val parent: Project = Project("Parent", file(".")) aggregate(sub) settings(
externalIvySettings(),
ivyPaths <<= baseDirectory( dir => new IvyPaths(dir, Some(dir / "ivy-home")))
)
lazy val sub: Project = Project("Sub", file("sub"), delegates = parent :: Nil) dependsOn(configgy) aggregate(configgy) settings(
externalIvySettings()
)
lazy val configgy = Project("Configgy", file("configgy"), delegates = sub :: Nil) settings(
libraryDependencies += "net.lag" % "configgy" % "1.1"
)
}

View File

@ -1,13 +1,13 @@
-> update
> clean-lib
> clean
$ copy-file changes/ivysettings.xml sub/ivysettings.xml
> update
> clean-lib
> clean
$ delete sub/ivysettings.xml
-> update
> clean-lib
> clean
$ copy-file changes/ivysettings.xml ivysettings.xml
> update

View File

@ -0,0 +1,10 @@
import sbt._
object ParentTest extends Build
{
lazy val projects = Seq(parent, core, reporters, jfreechart)
lazy val parent: Project = Project("Flowmodel", file(".")) aggregate(core, reporters)
lazy val core: Project = Project("Flowmodel core", file("core"), delegates = parent :: Nil)
lazy val reporters: Project = Project("Extra reporters", file("reporters"), delegates = parent :: Nil) aggregate(jfreechart) dependsOn(jfreechart)
lazy val jfreechart: Project = Project("JFreeChart reporters", file("jfreechart"), delegates = reporters :: Nil) dependsOn(core)
}

View File

@ -1,2 +0,0 @@
project.version=1.0
project.name=Parent Test

View File

@ -1,12 +0,0 @@
import sbt._
class FlowmodelProject(info: ProjectInfo) extends ParentProject(info)
{
lazy val core = project("core", "Flowmodel core")
lazy val reporters = project("reporters", "Extra reporters", new Reporters(_))
class Reporters(info: ProjectInfo) extends ParentProject(info)
{
lazy val jfreechart = project("jfreechart", "JFreeChart reporters", core)
}
}

View File

@ -0,0 +1,32 @@
import sbt._
import Keys._
import complete.DefaultParsers._
object PomRepoTest extends Build
{
lazy val projects = Seq(root)
lazy val root = Project("root", file(".")) settings(
resolvers ++= Seq(local, ScalaToolsSnapshots),
InputKey("check-pom") <<= InputTask(_ => spaceDelimited("<args>")) { result => (makePom, result, streams) map checkPomRepositories },
makePomConfiguration <<= (makePomConfiguration, baseDirectory) { (conf, base) =>
conf.copy(filterRepositories = pomIncludeRepository(base, conf.filterRepositories) )
},
ivyPaths <<= baseDirectory( dir => new IvyPaths(dir, Some(dir / "ivy-home")))
)
val local = "local-maven-repo" at "file://" + (Path.userHome / ".m2" /"repository").absolutePath
def pomIncludeRepository(base: File, prev: MavenRepository => Boolean) = (r: MavenRepository) =>
if(base / "repo.none" exists) false else if(base / "repo.all" exists) true else prev(r)
def checkPomRepositories(file: File, args: Seq[String], s: TaskStreams)
{
val repositories = scala.xml.XML.loadFile(file) \\ "repository"
val extracted = repositories.map { repo => MavenRepository(repo \ "name" text, repo \ "url" text) }
val expected = args.map(GlobFilter.apply)
s.log.info("Extracted: " + extracted.mkString("\n\t", "\n\t", "\n"))
s.log.info("Expected: " + args.mkString("\n\t", "\n\t", "\n"))
extracted.find { e => !expected.exists(_.accept(e.root)) } map { "Repository should not be exported: " + _ } orElse
(expected.find { e => !extracted.exists(r => e.accept(r.root)) } map { "Repository should be exported: " + _ } ) foreach error
}
}

View File

@ -1,2 +0,0 @@
project.name=Pom Repository Filter
project.version=1.0

View File

@ -1,24 +0,0 @@
import sbt._
class PomRepoTest(info: ProjectInfo) extends DefaultProject(info)
{
val local = "local-maven-repo" at "file://" + (Path.userHome / ".m2" /"repository").absolutePath
val remote = ScalaToolsSnapshots
override def pomIncludeRepository(r: MavenRepository) =
if("repo.none".asFile.exists) false else if("repo.all".asFile.exists) true else super.pomIncludeRepository(r)
lazy val checkPom =
task { args => task { checkPomRepositories(args.toList) } dependsOn(makePom) }
def checkPomRepositories(args: List[String]): Option[String] =
{
val repositories = scala.xml.XML.loadFile(pomPath asFile) \\ "repository"
val extracted = repositories.map { repo => MavenRepository(repo \ "name" text, repo \ "url" text) }
val expected = args.map(GlobFilter.apply)
log.info("Extracted: " + extracted.mkString("\n\t", "\n\t", "\n"))
log.info("Expected: " + args.mkString("\n\t", "\n\t", "\n"))
(extracted.find { e => !expected.exists(_.accept(e.root)) } map { "Repository should not be exported: " + _ }) orElse
(expected.find { e => !extracted.exists(r => e.accept(r.root)) } map { "Repository should be exported: " + _ } )
}
}