From 718fa9177254e6067cafdc1ee6a744ba5c325921 Mon Sep 17 00:00:00 2001 From: Mark Harrah Date: Fri, 8 Mar 2013 20:11:53 -0500 Subject: [PATCH] Publish test artifacts in Test configuration and corrects classifier to 'tests'. Fixes #683 --- ivy/src/main/scala/sbt/Artifact.scala | 11 ++++-- main/src/main/scala/sbt/Defaults.scala | 18 +++++----- .../cache-resolver/changes/use/Use.scala | 3 -- .../test-artifact/cache.sbt | 10 ++++++ .../test-artifact/changes/def/Def.java | 4 +++ .../test-artifact/changes/def/build.sbt | 9 +++++ .../test-artifact/changes/use/Use.java | 3 ++ .../test-artifact/changes/use/build.sbt | 7 ++++ .../test-artifact/changes/use/local.sbt | 2 ++ .../test-artifact/changes/use/pom.sbt | 3 ++ .../dependency-management/test-artifact/test | 36 +++++++++++++++++++ 11 files changed, 92 insertions(+), 14 deletions(-) delete mode 100644 sbt/src/sbt-test/dependency-management/cache-resolver/changes/use/Use.scala create mode 100644 sbt/src/sbt-test/dependency-management/test-artifact/cache.sbt create mode 100644 sbt/src/sbt-test/dependency-management/test-artifact/changes/def/Def.java create mode 100644 sbt/src/sbt-test/dependency-management/test-artifact/changes/def/build.sbt create mode 100644 sbt/src/sbt-test/dependency-management/test-artifact/changes/use/Use.java create mode 100644 sbt/src/sbt-test/dependency-management/test-artifact/changes/use/build.sbt create mode 100644 sbt/src/sbt-test/dependency-management/test-artifact/changes/use/local.sbt create mode 100644 sbt/src/sbt-test/dependency-management/test-artifact/changes/use/pom.sbt create mode 100644 sbt/src/sbt-test/dependency-management/test-artifact/test diff --git a/ivy/src/main/scala/sbt/Artifact.scala b/ivy/src/main/scala/sbt/Artifact.scala index 987a1f8ca..5bd17ef0d 100644 --- a/ivy/src/main/scala/sbt/Artifact.scala +++ b/ivy/src/main/scala/sbt/Artifact.scala @@ -11,7 +11,7 @@ final case class Artifact(name: String, `type`: String, extension: String, class def extra(attributes: (String,String)*) = Artifact(name, `type`, extension, classifier, configurations, url, extraAttributes ++ ModuleID.checkE(attributes)) } - import Configurations.{config, Docs, Optional, Pom, Sources} + import Configurations.{config, Docs, Optional, Pom, Sources, Test} object Artifact { @@ -36,6 +36,7 @@ object Artifact val DocType = "doc" val SourceType = "src" val PomType = "pom" + val TestsClassifier = "tests" def extract(url: URL, default: String): String = extract(url.toString, default) def extract(name: String, default: String): String = @@ -64,8 +65,12 @@ object Artifact val classifierConfMap = Map(SourceClassifier -> Sources, DocClassifier -> Docs) val classifierTypeMap = Map(SourceClassifier -> SourceType, DocClassifier -> DocType) - def classifierConf(classifier: String): Configuration = classifierConfMap.getOrElse(classifier, Optional) - def classifierType(classifier: String): String = classifierTypeMap.getOrElse(classifier.stripPrefix("test-"), DefaultType) + def classifierConf(classifier: String): Configuration = + if(classifier.startsWith(TestsClassifier)) + Test + else + classifierConfMap.getOrElse(classifier, Optional) + def classifierType(classifier: String): String = classifierTypeMap.getOrElse(classifier.stripPrefix(TestsClassifier + "-"), DefaultType) def classified(name: String, classifier: String): Artifact = Artifact(name, classifierType(classifier), DefaultExtension, Some(classifier), classifierConf(classifier) :: Nil, None) } diff --git a/main/src/main/scala/sbt/Defaults.scala b/main/src/main/scala/sbt/Defaults.scala index ac3e9629e..a029cbc2d 100755 --- a/main/src/main/scala/sbt/Defaults.scala +++ b/main/src/main/scala/sbt/Defaults.scala @@ -520,7 +520,11 @@ object Defaults extends BuildCommon t / toString(ScalaVersion(sv, sbv), module, a) asFile } def artifactSetting = ((artifact, artifactClassifier).identity zipWith configuration.?) { case ((a,classifier),cOpt) => - val cPart = cOpt flatMap { c => if(c == Compile) None else Some(c.name) } + val cPart = cOpt flatMap { + case Compile => None + case Test => Some(Artifact.TestsClassifier) + case c => Some(c.name) + } val combined = cPart.toList ++ classifier.toList if(combined.isEmpty) a.copy(classifier = None, configurations = cOpt.toList) else { val classifierString = combined mkString "-" @@ -529,13 +533,11 @@ object Defaults extends BuildCommon } } def artifactConfigurations(base: Artifact, scope: Configuration, classifier: Option[String]): Iterable[Configuration] = - if(base.configurations.isEmpty) - classifier match { - case Some(c) => Artifact.classifierConf(c) :: Nil - case None => scope :: Nil - } - else - base.configurations + classifier match { + case Some(c) => Artifact.classifierConf(c) :: Nil + case None => scope :: Nil + } + @deprecated("Use `Util.pairID` instead", "0.12.0") def pairID = Util.pairID diff --git a/sbt/src/sbt-test/dependency-management/cache-resolver/changes/use/Use.scala b/sbt/src/sbt-test/dependency-management/cache-resolver/changes/use/Use.scala deleted file mode 100644 index 5db377100..000000000 --- a/sbt/src/sbt-test/dependency-management/cache-resolver/changes/use/Use.scala +++ /dev/null @@ -1,3 +0,0 @@ -object Use { - val x = Def.x -} diff --git a/sbt/src/sbt-test/dependency-management/test-artifact/cache.sbt b/sbt/src/sbt-test/dependency-management/test-artifact/cache.sbt new file mode 100644 index 000000000..2d6e4d174 --- /dev/null +++ b/sbt/src/sbt-test/dependency-management/test-artifact/cache.sbt @@ -0,0 +1,10 @@ +ivyPaths := { + val base = baseDirectory.value + new IvyPaths(base, Some(base / "ivy-cache")) +} + +managedScalaInstance := false + +autoScalaLibrary := false + +crossPaths := false diff --git a/sbt/src/sbt-test/dependency-management/test-artifact/changes/def/Def.java b/sbt/src/sbt-test/dependency-management/test-artifact/changes/def/Def.java new file mode 100644 index 000000000..dcabe1e58 --- /dev/null +++ b/sbt/src/sbt-test/dependency-management/test-artifact/changes/def/Def.java @@ -0,0 +1,4 @@ +public final class Def { + public static final int x = 3; +} + diff --git a/sbt/src/sbt-test/dependency-management/test-artifact/changes/def/build.sbt b/sbt/src/sbt-test/dependency-management/test-artifact/changes/def/build.sbt new file mode 100644 index 000000000..0138592a3 --- /dev/null +++ b/sbt/src/sbt-test/dependency-management/test-artifact/changes/def/build.sbt @@ -0,0 +1,9 @@ +organization := "org.example" + +name := "def" + +version := "2.0" + +publishTo := Some(Resolver.file("example", baseDirectory.value / "ivy-repo")) + +publishArtifact in Test := true diff --git a/sbt/src/sbt-test/dependency-management/test-artifact/changes/use/Use.java b/sbt/src/sbt-test/dependency-management/test-artifact/changes/use/Use.java new file mode 100644 index 000000000..0c2746e2d --- /dev/null +++ b/sbt/src/sbt-test/dependency-management/test-artifact/changes/use/Use.java @@ -0,0 +1,3 @@ +public final class Use { + public static final int x = Def.x; +} diff --git a/sbt/src/sbt-test/dependency-management/test-artifact/changes/use/build.sbt b/sbt/src/sbt-test/dependency-management/test-artifact/changes/use/build.sbt new file mode 100644 index 000000000..8fda41b55 --- /dev/null +++ b/sbt/src/sbt-test/dependency-management/test-artifact/changes/use/build.sbt @@ -0,0 +1,7 @@ +name := "use" + +organization := "org.example" + +version := "1.0" + +libraryDependencies += "org.example" % "def" % "2.0" diff --git a/sbt/src/sbt-test/dependency-management/test-artifact/changes/use/local.sbt b/sbt/src/sbt-test/dependency-management/test-artifact/changes/use/local.sbt new file mode 100644 index 000000000..4d7605f2d --- /dev/null +++ b/sbt/src/sbt-test/dependency-management/test-artifact/changes/use/local.sbt @@ -0,0 +1,2 @@ +libraryDependencies += "org.example" % "def" % "2.0" % "compile->test" + diff --git a/sbt/src/sbt-test/dependency-management/test-artifact/changes/use/pom.sbt b/sbt/src/sbt-test/dependency-management/test-artifact/changes/use/pom.sbt new file mode 100644 index 000000000..562c488f9 --- /dev/null +++ b/sbt/src/sbt-test/dependency-management/test-artifact/changes/use/pom.sbt @@ -0,0 +1,3 @@ +libraryDependencies += "org.example" % "def" % "2.0" classifier("tests") + +externalResolvers := Seq("example" at (baseDirectory.value / "ivy-repo").toURI.toString) diff --git a/sbt/src/sbt-test/dependency-management/test-artifact/test b/sbt/src/sbt-test/dependency-management/test-artifact/test new file mode 100644 index 000000000..fbb326ff1 --- /dev/null +++ b/sbt/src/sbt-test/dependency-management/test-artifact/test @@ -0,0 +1,36 @@ +# define a test jar and publish locally as ivy.xml +# and to a file repository as pom.xml + +$ copy-file changes/def/build.sbt build.sbt +$ copy-file changes/def/Def.java src/test/java/Def.java +> reload +> publish-local +> publish +> clean + +$ delete build.sbt +$ delete src/test/java/Def.java + +# use the test jar from the maven repository +# by requesting the "tests" classifier + +$ copy-file changes/use/build.sbt build.sbt +$ copy-file changes/use/Use.java Use.java +$ copy-file changes/use/pom.sbt pom.sbt +> reload +> compile +> clean + +# necessary because the cache can't deal with two different types of metadata +$ delete ivy-cache/cache + + +# then, use the test jar via the Ivy repository +# by requesting the "test" configuration + +$ delete pom.sbt +$ copy-file changes/use/local.sbt local.sbt +> reload +> show update +> export dependencyClasspath +> compile