diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ca4918545..fed9ef6e0 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,6 +2,7 @@ Steps to publish ================ ``` +$ sbt -Dsbt.build.version=1.0.0-M1 > universal:publish > debian:publish > rpm:publish diff --git a/build.sbt b/build.sbt index 5362bc778..39514c050 100644 --- a/build.sbt +++ b/build.sbt @@ -4,15 +4,21 @@ import util.control.Exception.catching import _root_.bintray.InternalBintrayKeys._ import _root_.bintray.{BintrayRepo, Bintray} +lazy val sbtVersionToRelease = sys.props.getOrElse("sbt.build.version", sys.env.getOrElse("sbt.build.version", { + sys.error("-Dsbt.build.version must be set") + })) +lazy val isExperimental = (sbtVersionToRelease contains "RC") || (sbtVersionToRelease contains "M") val sbtLaunchJarUrl = SettingKey[String]("sbt-launch-jar-url") val sbtLaunchJarLocation = SettingKey[File]("sbt-launch-jar-location") val sbtLaunchJar = TaskKey[File]("sbt-launch-jar", "Resolves SBT launch jar") -val moduleID = (organization, sbtVersion) apply { (o,v) => ModuleID(o,"sbt",v) } +val moduleID = (organization) apply { (o) => ModuleID(o, "sbt", sbtVersionToRelease) } val bintrayLinuxPattern = "[module]/[revision]/[module]-[revision].[ext]" val bintrayGenericPattern = "[module]/[revision]/[module]/[revision]/[module]-[revision].[ext]" val bintrayDebianUrl = "https://api.bintray.com/content/sbt/debian/" +val bintrayDebianExperimentalUrl = "https://api.bintray.com/content/sbt/debian-experimental/" val bintrayRpmUrl = "https://api.bintray.com/content/sbt/rpm/" +val bintrayRpmExperimentalUrl = "https://api.bintray.com/content/sbt/rpm-experimental/" val bintrayGenericPackagesUrl = "https://api.bintray.com/content/sbt/native-packages/" val bintrayReleaseAllStaged = TaskKey[Unit]("bintray-release-all-staged", "Release all staged artifacts on bintray.") val windowsBuildId = settingKey[Int]("build id for Windows installer") @@ -20,9 +26,6 @@ val windowsBuildId = settingKey[Int]("build id for Windows installer") // This build creates a SBT plugin with handy features *and* bundles the SBT script for distribution. val root = (project in file(".")). settings( - sbtVersion <<= sbtVersion apply { v => - sys.props.getOrElse("sbt.build.version", sys.env.getOrElse("sbt.build.version", v)) - }, organization := "org.scala-sbt", name := "sbt-launcher-packaging", version := "0.1.0", @@ -32,7 +35,7 @@ val root = (project in file(".")). mapGenericFilesToLinux, mapGenericFilesToWindows, publishToSettings, - sbtLaunchJarUrl <<= sbtVersion apply downloadUrlForVersion, + sbtLaunchJarUrl := downloadUrlForVersion(sbtVersionToRelease), sbtLaunchJarLocation <<= target apply (_ / "sbt-launch.jar"), sbtLaunchJar <<= (sbtLaunchJarUrl, sbtLaunchJarLocation) map { (uri, file) => import dispatch.classic._ @@ -53,7 +56,7 @@ val root = (project in file(".")). a build tool for Scala and more.""", // Here we remove the jar file and launch lib from the symlinks: linuxPackageSymlinks <<= linuxPackageSymlinks map { links => - for { + for { link <- links if !(link.destination endsWith "sbt-launch-lib.bash") if !(link.destination endsWith "sbt-launch.jar") @@ -61,7 +64,7 @@ val root = (project in file(".")). }, // DEBIAN SPECIFIC name in Debian := "sbt", - version in Debian <<= sbtVersion, + version in Debian := sbtVersionToRelease, debianPackageDependencies in Debian ++= Seq("java6-runtime-headless", "bash (>= 2.05a-11)"), debianPackageRecommends in Debian += "git", linuxPackageMappings in Debian <+= (sourceDirectory) map { bd => @@ -69,28 +72,35 @@ val root = (project in file(".")). (bd / "debian/changelog") -> "/usr/share/doc/sbt/changelog.gz" ) withUser "root" withGroup "root" withPerms "0644" gzipped) asDocs() }, - + // RPM SPECIFIC name in Rpm := "sbt", - version in Rpm <<= sbtVersion apply { sv => (sv split "[^\\d]" filterNot (_.isEmpty) mkString ".") }, + version in Rpm := { + val stable = (sbtVersionToRelease split "[^\\d]" filterNot (_.isEmpty) mkString ".") + if (isExperimental) ((sbtVersionToRelease split "[^\\d]" filterNot (_.isEmpty)).toList match { + case List(a, b, c, d) => List(0, 99, c, d).mkString(".") + }) + else stable + }, rpmRelease := "1", rpmVendor := "typesafe", rpmUrl := Some("http://github.com/sbt/sbt-launcher-package"), rpmLicense := Some("BSD"), rpmRequirements :=Seq("java","java-devel","jpackage-utils"), rpmProvides := Seq("sbt"), - + // WINDOWS SPECIFIC name in Windows := "sbt", windowsBuildId := 1, - version in Windows <<= (sbtVersion, windowsBuildId) apply { (sv, bid) => + version in Windows <<= (windowsBuildId) apply { (bid) => + val sv = sbtVersionToRelease (sv split "[^\\d]" filterNot (_.isEmpty)) match { case Array(major,minor,bugfix, _*) => Seq(major, minor, bugfix, bid.toString) mkString "." case Array(major,minor) => Seq(major, minor, "0", bid.toString) mkString "." case Array(major) => Seq(major, "0", "0", bid.toString) mkString "." } }, - maintainer in Windows := "Typesafe, Inc.", + maintainer in Windows := "Lightbend, Inc.", packageSummary in Windows := "sbt " + (version in Windows).value, packageDescription in Windows := "The interactive build tool.", wixProductId := "ce07be71-510d-414a-92d4-dff47631848a", @@ -99,7 +109,7 @@ val root = (project in file(".")). // Universal ZIP download install. name in Universal := "sbt", - version in Universal <<= sbtVersion, + version in Universal := sbtVersionToRelease, mappings in Universal <+= sbtLaunchJar map { _ -> "bin/sbt-launch.jar" }, // Misccelaneous publishing stuff... @@ -116,6 +126,7 @@ def downloadUrlForVersion(v: String) = (v split "[^\\d]" flatMap (i => catching( case Array(0, 11, 3, _*) => "http://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/sbt-launch/0.11.3-2/sbt-launch.jar" case Array(0, 11, x, _*) if x >= 3 => "http://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/sbt-launch/"+v+"/sbt-launch.jar" case Array(0, y, _*) if y >= 12 => "http://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/sbt-launch/"+v+"/sbt-launch.jar" + case Array(1, _, _*) => "http://repo.scala-sbt.org/scalasbt/maven-releases/org/scala-sbt/sbt-launch/"+v+"/sbt-launch.jar" case _ => "http://repo.typesafe.com/typesafe/ivy-releases/org.scala-tools.sbt/sbt-launch/"+v+"/sbt-launch.jar" } @@ -127,11 +138,14 @@ def makePublishTo(id: String, url: String, pattern: String): Setting[_] = { } def makePublishToForConfig(config: Configuration) = { + val v = sbtVersionToRelease val (id, url, pattern) = config.name match { + case Debian.name if isExperimental => ("debian-experimental", bintrayDebianExperimentalUrl, bintrayLinuxPattern) case Debian.name => ("debian", bintrayDebianUrl, bintrayLinuxPattern) - case Rpm.name => ("rpm", bintrayRpmUrl, bintrayLinuxPattern) - case _ => ("native-packages", bintrayGenericPackagesUrl, bintrayGenericPattern) + case Rpm.name if isExperimental => ("rpm-experimental", bintrayRpmExperimentalUrl, bintrayLinuxPattern) + case Rpm.name => ("rpm", bintrayRpmUrl, bintrayLinuxPattern) + case _ => ("native-packages", bintrayGenericPackagesUrl, bintrayGenericPattern) } // Add the publish to and ensure global resolvers has the resolver we just configured. inConfig(config)(Seq( @@ -155,7 +169,7 @@ def makePublishToForConfig(config: Configuration) = { ) } -def publishToSettings: Seq[Setting[_]] = +def publishToSettings = Seq[Configuration](Debian, Universal, Windows, Rpm) flatMap makePublishToForConfig def bintrayRelease(repo: BintrayRepo, pkg: String, version: String, log: Logger): Unit =