From 9894b2c9bcfe9cec0a6853b69148e0c8b5a2508d Mon Sep 17 00:00:00 2001 From: Josh Suereth Date: Tue, 3 Apr 2012 11:09:48 -0400 Subject: Fixed build for 0.11.x again. Working on bringing version properties file up to par. --- project/Build.scala | 2 +- project/Partest.scala | 2 +- project/Versions.scala | 109 ++++++++++++++++++++++++++++++++++++++++++++ project/project/Build.scala | 2 +- 4 files changed, 112 insertions(+), 3 deletions(-) create mode 100644 project/Versions.scala (limited to 'project') diff --git a/project/Build.scala b/project/Build.scala index 9f73563f8e..dd9f9f6c04 100644 --- a/project/Build.scala +++ b/project/Build.scala @@ -111,7 +111,7 @@ object ScalaBuild extends Build with Layers { ) // Settings for root project. These are aggregate tasks against the rest of the build. - def projectSettings: Seq[Setting[_]] = publishSettings ++ Seq( + def projectSettings: Seq[Setting[_]] = publishSettings ++ Versions.settings ++ Seq( doc in Compile <<= (doc in documentation in Compile).identity, // These next two aggregate commands on several projects and return results that are to be ignored by remaining tasks. compile in Compile <<= compiledProjects.map(p => compile in p in Compile).join.map(_.head), diff --git a/project/Partest.scala b/project/Partest.scala index ad8047fa00..bbc160a41d 100644 --- a/project/Partest.scala +++ b/project/Partest.scala @@ -115,7 +115,7 @@ object partest { } } - def partestRunnerTask(classpath: ScopedTask[Classpath], javacOptions: ScopedTask[Seq[String]]): Project.Initialize[Task[PartestRunner]] = + def partestRunnerTask(classpath: ScopedTask[Classpath], javacOptions: SettingKey[Seq[String]]): Project.Initialize[Task[PartestRunner]] = (classpath, javacOptions) map ((cp, opts) => new PartestRunner(Build.data(cp), opts mkString " ")) } diff --git a/project/Versions.scala b/project/Versions.scala new file mode 100644 index 0000000000..fdfc6304fd --- /dev/null +++ b/project/Versions.scala @@ -0,0 +1,109 @@ +import sbt._ +import Keys._ +import java.util.Properties +import scala.util.control.Exception.catching +import java.lang.{NumberFormatException => NFE} +import java.io.FileInputStream +import com.jsuereth.git.GitRunner +import com.jsuereth.git.GitKeys.gitRunner + + + +object Versions { + val buildNumberFile = SettingKey[File]("scala-build-number-file") + // TODO - Make this a setting? + val buildNumberProps = TaskKey[BaseBuildNumber]("scala-build-number-props") + val buildRelease = SettingKey[Boolean]("scala-build-release", "This is set to true if we're building a release.") + val mavenSuffix = SettingKey[String]("scala-maven-suffix", "This is set to whatever maven suffix is required.") + + val gitSha = TaskKey[String]("scala-git-sha", "The sha of the current git commit.") + val gitDate = TaskKey[String]("scala-git-date", "The date of the current git commit.") + + val mavenVersion = TaskKey[String]("scala-maven-version", "The maven version number.") + val osgiVersion = TaskKey[String]("scala-osgi-version", "The OSGi version number.") + val canonicalVersion = TaskKey[String]("scala-canonical-version", "The canonical version number.") + + + def settings: Seq[Setting[_]] = Seq( + buildNumberFile <<= baseDirectory apply (_ / "build.number"), + buildNumberProps <<= buildNumberFile map loadBuildNumberProps, + buildRelease := Option(System.getProperty("build.release")) map (!_.isEmpty) getOrElse false, + mavenSuffix <<= buildRelease apply pickMavenSuffix, + mavenVersion <<= (buildNumberProps, mavenSuffix) map makeMavenVersion, + gitSha <<= (gitRunner, baseDirectory, streams) map getGitSha, + gitDate <<= (gitRunner, baseDirectory, streams) map getGitDate, + osgiVersion <<= (buildNumberProps, gitDate, gitSha) map makeOsgiVersion, + canonicalVersion <<= (buildRelease, mavenVersion, buildNumberProps, gitDate, gitSha) map makeCanonicalVersion + ) + + def makeCanonicalVersion(isRelease: Boolean, mvnVersion: String, base: BaseBuildNumber, gitDate: String, gitSha: String): String = + if(isRelease) mvnVersion + else { + val suffix = if(base.bnum > 0) "-%d".format(base.bnum) else "" + "%s.%s.%s%s-%s-%s" format (base.major, base.minor, base.patch, suffix, gitDate, gitSha) + } + + def makeMavenVersion(base: BaseBuildNumber, suffix: String): String = { + val firstSuffix = if(base.bnum > 0) "-%d".format(base.bnum) else "" + "%d.%d.%d%s%s" format (base.major, base.minor, base.patch, firstSuffix, suffix) + } + + def makeOsgiVersion(base: BaseBuildNumber, gitDate: String, gitSha: String): String = { + val suffix = if(base.bnum > 0) "-%d".format(base.bnum) else "" + "%s.%s.%s.v%s%s-%s" format (base.major, base.minor, base.patch, gitDate, suffix, gitSha) + } + + /** Determines what the maven sufffix should be for this build. */ + def pickMavenSuffix(isRelease: Boolean): String = { + def default = if(isRelease) "" else "-SNAPSHOT" + Option(System.getProperty("maven.version.suffix")) getOrElse default + } + + /** Loads the build.number properties file into SBT. */ + def loadBuildNumberProps(file: File): BaseBuildNumber = { + val fin = new FileInputStream(file) + try { + val props = new Properties() + props.load(fin) + def getProp(name: String): Int = + (for { + v <- Option(props.getProperty(name)) + v2 <- catching(classOf[NFE]) opt v.toInt + } yield v2) getOrElse sys.error("Could not convert %s to integer!" format (name)) + + BaseBuildNumber( + major=getProp("version.major"), + minor=getProp("version.minor"), + patch=getProp("version.patch"), + bnum =getProp("version.bnum") + ) + } finally fin.close() + } + + + def getGitDate(git: GitRunner, baseDirectory: File, s: TaskStreams): String = { + val lines = getGitLines("log","-1","--format=\"%ci\"")(git,baseDirectory, s) + val line = if(lines.isEmpty) sys.error("Could not retreive git commit sha!") else lines.head + // Lines *always* start with " for some reason... + line drop 1 split "\\s+" match { + case Array(date, time, _*) => "%s-%s" format (date.replaceAll("\\-", ""), time.replaceAll(":","")) + case _ => sys.error("Could not parse git date: " + line) + } + } + + def getGitSha(git: GitRunner, baseDirectory: File, s: TaskStreams): String = { + val lines = getGitLines("log","-1","--format=\"%H\"", "HEAD")(git,baseDirectory, s) + val line = if(lines.isEmpty) sys.error("Could not retreive git commit sha!") else lines.head + val noquote = if(line startsWith "\"") line drop 1 else line + val nog = if(noquote startsWith "g") noquote drop 1 else noquote + nog take 10 + } + + def getGitLines(args: String*)(git: GitRunner, baseDirectory: File, s: TaskStreams): Seq[String] = + git(args: _*)(baseDirectory, s.log) split "[\r\n]+" +} + + +case class BaseBuildNumber(major: Int, minor: Int, patch: Int, bnum: Int) { + override def toString = "BaseBuildNumber(%d.%d.%d-%d)" format (major, minor, patch, bnum) +} diff --git a/project/project/Build.scala b/project/project/Build.scala index 1ceb7e2ef2..bd1250fc39 100644 --- a/project/project/Build.scala +++ b/project/project/Build.scala @@ -2,6 +2,6 @@ import sbt._ object PluginDef extends Build { override def projects = Seq(root) lazy val root = Project("plugins", file(".")) dependsOn(proguard, git) - lazy val proguard = uri("git://github.com/jsuereth/xsbt-proguard-plugin.git") + lazy val proguard = uri("git://github.com/jsuereth/xsbt-proguard-plugin.git#sbt-0.11") lazy val git = uri("git://github.com/sbt/sbt-git-plugin.git#scala-build") } -- cgit v1.2.3