2009-09-12 18:55:04 +02:00
/* sbt -- Simple Build Tool
* Copyright 2009 Mark Harrah
*/
import sbt._
import java.io.File
trait ReleaseProject extends ExecProject
{ self : SbtProject =>
def info : ProjectInfo
2009-09-12 19:45:41 +02:00
lazy val releaseChecks = javaVersionCheck && projectVersionCheck && fullyCheckedOut
lazy val fullyCheckedOut =
task
{
if ( svnArtifactsPath . exists ) None
else Some ( "You need a fully checked out sbt repository with commit rights to do a release." )
}
2009-09-12 18:55:04 +02:00
lazy val javaVersionCheck =
task
{
val javaVersion = System . getProperty ( "java.version" )
if ( ! javaVersion . startsWith ( "1.5." ) )
Some ( "Java version must be 1.5.x (was " + javaVersion + ")" )
else
None
}
lazy val projectVersionCheck =
task
{
def value ( a : Option [ Int ] ) = a . getOrElse ( 0 )
def lessThan ( a : Option [ Int ] , b : Option [ Int ] ) = value ( a ) < value ( b )
version match
{
case BasicVersion ( major , minor , micro , None ) =>
Version . fromString ( sbtVersion . value ) match
{
case Right ( BasicVersion ( builderMajor , builderMinor , builderMicro , None ) )
if ( builderMajor < major || ( builderMajor == major &&
lessThan ( builderMinor , minor ) || ( builderMinor == minor &&
lessThan ( builderMicro , micro ) ) ) ) =>
None
case _ => Some ( "Invalid builder sbt version. Must be a release version older than the project version. (was: " + sbtVersion . value + ")" )
}
case _ => Some ( "Invalid project version. Should be of the form #.#.# (was: " + version + ")" )
}
}
def svnURL = "https://simple-build-tool.googlecode.com/svn/"
def latestURL = svnURL + "artifacts/latest"
2009-09-12 19:45:41 +02:00
def svnArtifactsPath = Path . fromFile ( info . projectPath . asFile . getParentFile ) / "artifacts"
def svnArtifactPath = svnArtifactsPath / version . toString
2009-09-12 18:55:04 +02:00
def ivyLocalPath = Path . userHome / ".ivy2" / "local" / "sbt" / "simple-build-tool" / version . toString
def manualTasks =
( "Upload launcher jar: " + boot . outputJar . absolutePath ) : :
"Update, build, check and commit Hello Lift example" : :
Nil
2009-09-12 19:45:41 +02:00
2009-09-12 18:55:04 +02:00
lazy val copyDocs = main . copyTask ( ( main . mainDocPath # # ) ** "*" , svnArtifactPath / "api" ) dependsOn ( main . doc , releaseChecks )
lazy val copyIvysJars = main . copyTask ( ( ivyLocalPath # # ) ** "*" , svnArtifactPath ) dependsOn ( main . crossPublishLocal , releaseChecks )
2009-09-12 19:45:41 +02:00
lazy val release = manualTaskMessage dependsOn ( commitDocs , releaseArtifacts , releaseChecks )
2009-09-12 18:55:04 +02:00
lazy val releaseArtifacts = nextVersion dependsOn ( tag , latestLink , boot . proguard , releaseChecks )
lazy val manualTaskMessage = task { println ( "The following tasks must be done manually:\n\t" + manualTasks . mkString ( "\n\t" ) ) ; None }
2009-09-12 19:45:41 +02:00
import sbt.ProcessXML._
2009-09-12 18:55:04 +02:00
lazy val addArtifacts = execTask { < o > svn add { svnArtifactPath } </ o > } dependsOn ( copyIvysJars , copyDocs , releaseChecks )
lazy val commitArtifacts = execTask { < o > svn commit - m "Jars, Ivys, and API Docs for {version.toString}" { svnArtifactPath } </ o > } dependsOn ( addArtifacts , releaseChecks )
2009-09-12 19:45:41 +02:00
lazy val tag = execTask { < o > svn copy - m "Tagging {version.toString}" { svnURL } / trunk / { svnURL } / tags / { version . toString } </ o > } dependsOn ( releaseChecks )
2009-09-12 18:55:04 +02:00
lazy val latestLink = ( deleteLatestLink && makeLatestLink ) dependsOn ( commitArtifacts , releaseChecks )
2009-09-12 19:45:41 +02:00
lazy val makeLatestLink = execTask { < o > svn copy - m "Creating new latest link" { svnURL } / artifacts / { version . toString } / { latestURL } </ o > } dependsOn ( releaseChecks )
lazy val deleteLatestLink = execTask { < o > svn del - m "Deleting old latest link" { latestURL } </ o > } dependsOn ( releaseChecks )
lazy val commitProperties = execTask { < o > svn commit - m "Bumping versions" project / build . properties </ o > } dependsOn ( releaseChecks )
lazy val commitDocs = execTask { < o > svn commit - m "Updated documentation for {version.toString}" . . / wiki / </ o > } dependsOn ( releaseChecks )
2009-09-12 18:55:04 +02:00
2009-09-12 19:45:41 +02:00
lazy val nextVersion = ( incrementVersions && commitProperties ) dependsOn ( releaseChecks )
lazy val incrementVersions = task { incrementVersionNumbers ( ) ; None }
2009-09-18 20:23:35 +02:00
def incrementVersionNumbers ( ) : Unit =
2009-09-12 18:55:04 +02:00
for ( v <- projectVersion )
{
2009-09-12 19:45:41 +02:00
sbtVersion ( ) = v . toString
2009-09-12 18:55:04 +02:00
val incremented = v . asInstanceOf [ BasicVersion ] . incrementMicro // BasicVersion checked by releaseChecks
import incremented._
2009-09-18 20:23:35 +02:00
val newVersion = BasicVersion ( major , minor , micro , Some ( "SNAPSHOT" ) )
2009-09-12 18:55:04 +02:00
log . info ( "Changing version to " + newVersion )
projectVersion ( ) = newVersion
2009-09-12 19:45:41 +02:00
saveEnvironment
2009-09-12 18:55:04 +02:00
}
2009-09-12 19:45:41 +02:00
}
package sbt {
2009-09-18 20:23:35 +02:00
object ProcessXML {
2009-09-12 19:45:41 +02:00
implicit def elemToPB ( command : scala . xml . Elem ) : ProcessBuilder =
impl . CommandParser . parse ( command . text . trim ) . fold ( error , Function . tupled ( Process . apply ) )
}
2009-09-12 18:55:04 +02:00
}