aboutsummaryrefslogblamecommitdiff
path: root/project/Release.scala
blob: a203262a871b2260d743d537e29db07dea404f1c (plain) (tree)
1
2
3
4
5
6
7
8
9







                                                         
                                                          




















































                                                                                                  
                            






                                                     





                                                      

                                                                      














                                                                                            
                                     

                                                         


                                                                                    
                                                                       










                                                                             
package flow

import sbt._
import sbtrelease._
import sbtrelease.ReleasePlugin.autoImport._
import sbtrelease.ReleaseStateTransformations._

import ch.jodersky.sbt.jni.plugins.JniNative.autoImport._
import ch.jodersky.sbt.jni.plugins.JniPackage.autoImport._

import com.typesafe.sbt.pgp.PgpKeys._

object Release {


  def settings: Seq[Setting[_]] = Seq(

    //sign git tags
    releaseVcs := Some(new SignedGit(Keys.baseDirectory.value)),

    //publish signed
    releasePublishArtifactsAction := publishSigned.value,

    //build for multiple scala versions,
    releaseCrossBuild := true,

    releaseProcess := Seq[ReleaseStep](

      //Check that there are no snapshot dependencies
      checkSnapshotDependencies,

      //During a release, only native libraries in lib_native will be packaged
      disableLocalBuild,

      //Check that there are native libraries in lib_native and list all
      //libraries that will be packaged
      checkNativeLibs,

      //Ask for release version and next development version
      inquireVersions,

      //Set version to release version and save
      setReleaseVersion,

      //Clean
      runClean,

      //Compile and test
      runTest,

      //If all tests pass, commit the updated version
      commitReleaseVersion,

      //Also create a tag
      tagRelease,

      //Publish artifacts, note that they will only be uploaded, not yet be released to the public
      publishArtifacts,

      //Bump version to next development
      setNextVersion,

      //TODO: update website

      //Commit
      commitNextVersion,

      //Push all changes (commits and tags) to GitHub
      pushChanges

    )
  )

  /** Set `enableNativeCompilations` to false. */
  lazy val disableLocalBuild = ReleaseStep(st => {
    val st1 = ReleaseStateTransformations.reapply(Seq(
      enableNativeCompilation in FlowBuild.native in Compile := false,
      enableNativeCompilation in FlowBuild.native in Test := false
    ), st)
    st1.log.info("Disabled compilation of native libraries during release process.")
    st1
  })

  /** Release step that prints all native libraries that will be packaged
    * and awaits approval from user. */
  lazy val checkNativeLibs = ReleaseStep(action = st0 => {
    val log = st0.log
    val project = FlowBuild.native

    val extracted = Project.extract(st0)
    val (st1, libs) = extracted.runTask(unmanagedNativeLibraries in project in Compile, st0)

    log.info("The following native libraries will be packaged:")
    log.info("---------------------")
    libs.toSeq.sortBy(_._2).foreach{ case (file, path) =>
      log.info(path)
    }
    SimpleReader.readLine("Are the all native libraries listed (y/n)? [n] ") match {
      case Some("y") => //do nothing
      case _ => sys.error("Missing native libaries. Aborting release.")
    }
    st1
  })

  /** A Git wrapper that signs tags. */
  class SignedGit(baseDir: File) extends Git(baseDir) {
    override def tag(name: String, comment: String, force: Boolean = false) =
      cmd("tag", "-s", name, "-m", comment, if(force) "-f" else "")
  }

}