From a9b69e4425ef4dd5f5c2801d69511959c0e9d42a Mon Sep 17 00:00:00 2001 From: Mark Harrah Date: Tue, 16 Feb 2010 12:30:15 -0500 Subject: [PATCH] make-pom test for added repositories --- .../make-pom/project/build.properties | 3 + .../make-pom/project/build/MakePomTest.scala | 55 +++++++++++++++++++ .../dependency-management/make-pom/test | 7 +++ 3 files changed, 65 insertions(+) create mode 100644 src/sbt-test/dependency-management/make-pom/project/build.properties create mode 100644 src/sbt-test/dependency-management/make-pom/project/build/MakePomTest.scala create mode 100644 src/sbt-test/dependency-management/make-pom/test diff --git a/src/sbt-test/dependency-management/make-pom/project/build.properties b/src/sbt-test/dependency-management/make-pom/project/build.properties new file mode 100644 index 000000000..2ca57b677 --- /dev/null +++ b/src/sbt-test/dependency-management/make-pom/project/build.properties @@ -0,0 +1,3 @@ +project.name=Make Pom Test +project.organization=test +project.version=1.0 \ No newline at end of file diff --git a/src/sbt-test/dependency-management/make-pom/project/build/MakePomTest.scala b/src/sbt-test/dependency-management/make-pom/project/build/MakePomTest.scala new file mode 100644 index 000000000..37325d933 --- /dev/null +++ b/src/sbt-test/dependency-management/make-pom/project/build/MakePomTest.scala @@ -0,0 +1,55 @@ +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 = + 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)) +} \ No newline at end of file diff --git a/src/sbt-test/dependency-management/make-pom/test b/src/sbt-test/dependency-management/make-pom/test new file mode 100644 index 000000000..d6cd7da32 --- /dev/null +++ b/src/sbt-test/dependency-management/make-pom/test @@ -0,0 +1,7 @@ +-> check-pom +-> check-extra + +> make-pom + +> check-pom +> check-extra \ No newline at end of file