diff options
Diffstat (limited to 'project/Release.scala')
-rw-r--r-- | project/Release.scala | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/project/Release.scala b/project/Release.scala new file mode 100644 index 0000000000..12461bee77 --- /dev/null +++ b/project/Release.scala @@ -0,0 +1,113 @@ +import sbt._ +import Keys._ +import _root_.com.jsuereth.git.GitRunner + +object Release { + + // TODO - move more of the dist project over here... + + + lazy val pushStarr = Command.command("push-starr") { (state: State) => + def f(s: Setting[_]): Setting[_] = s.key.key match { + case version.key => // TODO - use full version + s.asInstanceOf[Setting[String]].mapInit( (_,_) => timeFormat format (new java.util.Date)) + case organization.key => + s.asInstanceOf[Setting[String]].mapInit( (_,_) => "org.scala-lang.bootstrapp") + // TODO - Switch publish repo to be typesafe starr repo. + case publishTo.key => + s.asInstanceOf[Setting[Option[Resolver]]].mapInit((_,_) => Some("Starr Repo" at "http://typesafe.artifactoryonline.com/typesafe/starr-releases/")) + case _ => s + } + val extracted = Project.extract(state) + import extracted._ + // Swap version on projects + val transformed = session.mergeSettings map ( s => f(s) ) + val newStructure = Load.reapply(transformed, structure) + val newState = Project.setProject(session, newStructure, state) + // TODO - Run tasks. Specifically, push scala-compiler + scala-library. *Then* bump the STARR version locally. + // The final course of this command should be: + // publish-local + // Project.evaluateTask(publishLocal, newState) + // bump STARR version setting + // TODO - Define Task + // Rebuild quick + test to ensure it works + // Project.evaluateTask(test, newState) + // push STARR remotely + Project.evaluateTask(publish, newState) + // Revert to previous project state. + Project.setProject(session, structure, state) + } + + // TODO - Autocomplete + /*lazy val setStarrHome = Command.single("set-starr-home") { (state: State, homeDir: String) => + def f(s: Setting[_]): Setting[_] = + if(s.key.key == scalaInstance.key) { + s.asInstanceOf[Setting[ScalaInstance]] mapInit { (key, value) => + if(value.version == "starr") + scalaInstance <<= appConfiguration map { app => + val launcher = app.provider.scalaProvider.launcher + ScalaInstance("starr", new File(homeDir), launcher) + } + else value + } + } else s + val extracted = Project.extract(state) + import extracted._ + val transformed = session.mergeSettings map f + val newStructure = Load.reapply(transformed, structure) + Project.setProject(session, newStructure, state) + }*/ + + lazy val timeFormat = { + val formatter = new java.text.SimpleDateFormat("yyyyMMdd'T'HHmmss") + formatter.setTimeZone(java.util.TimeZone.getTimeZone("GMT")) + formatter + } + + /** This generates a properties file, if it does not already exist, with the maximum lastmodified timestamp + * of any source file. */ + def generatePropertiesFile(name: String)(baseDirectory: File, version: String, dir: File, git: GitRunner): Seq[File] = { + // TODO - We can probably clean this up by moving caching bits elsewhere perhaps.... + val target = dir / name + // TODO - Regenerate on triggers, like recompilation or something... + val fullVersion = makeFullVersionString(baseDirectory, version, git) + def hasSameVersion: Boolean = { + val props = new java.util.Properties + val in = new java.io.FileInputStream(target) + try props.load(in) finally in.close() + def withoutDate(s: String): String = s.reverse.dropWhile (_ != '.').reverse + withoutDate(fullVersion) == withoutDate(props getProperty "version.number") + } + if (!target.exists || !hasSameVersion) { + makePropertiesFile(target, fullVersion) + } + target :: Nil + } + + // This creates the *.properties file used to determine the current version of scala at runtime. TODO - move these somewhere utility like. + def makePropertiesFile(f: File, version: String): Unit = + IO.write(f, "version.number = "+version+"\ncopyright.string = Copyright 2002-2011, LAMP/EPFL") + + def makeFullVersionString(baseDirectory: File, baseVersion: String, git: GitRunner) = baseVersion+"."+getGitRevision(baseDirectory, git)+"."+currentDay + + // TODO - do we want this in the build number? + def currentDay = (new java.text.SimpleDateFormat("yyyyMMdd'T'HHmmss")) format (new java.util.Date) + + def getGitRevision(baseDirectory: File, git: GitRunner) = { + object outputStealer extends sbt.Logger { + private val stdout = new StringBuilder + private val stderr = new StringBuilder + def log (level: Level.Value, message: ⇒ String): Unit = stdout append message + def success (message: ⇒ String): Unit = () + def trace (t: ⇒ Throwable): Unit = () + def stdoutString = stdout.toString + } + val result = try { + git("describe", "HEAD", "--abbrev=7", "--match", "dev")(baseDirectory, outputStealer) + } catch { + case t => git("describe", "HEAD", "--abbrev=7", "--always")(baseDirectory, outputStealer) + } + result.trim + } + +} |