project/VersionInfo.scala (68 lines of code) (raw):
package com.gu.versioninfo
import java.net.InetAddress
import org.joda.time.{DateTimeZone, DateTime}
import sbt._
import Keys._
import org.eclipse.jgit.storage.file.FileRepositoryBuilder
object VersionInfo extends AutoPlugin {
val branch = SettingKey[String]("version-branch")
val buildNumber = SettingKey[String]("version-build-number")
val vcsNumber = SettingKey[String]("version-vcs-number")
private def getRepo(repo: java.io.File) = {
try {
val gitRepo = new FileRepositoryBuilder().findGitDir(repo)
if (gitRepo.build.getConfig.getString("remote", "origin", "url") == "git@github.com:guardian/frontend.git") {
Some(gitRepo)
} else {
None
}
} catch {
case _: Throwable => None
}
}
override val projectSettings = Seq(
buildNumber := System.getenv().getOrDefault("BUILD_NUMBER", "DEV"),
branch := baseDirectory(baseDir => {
getRepo(baseDir)
.map(gitRepo => {
val branchName = gitRepo.build.getBranch
gitRepo.build.close()
branchName
})
.getOrElse("DEV")
}).value,
vcsNumber := baseDirectory(baseDir => {
getRepo(baseDir)
.map(gitRepo => {
val commitHash = gitRepo.build.resolve("HEAD").getName
gitRepo.build.close()
commitHash
})
.getOrElse("DEV")
}).value,
Compile / resourceGenerators += Def.task {
buildFile(
(Compile / resourceManaged).value,
branch.value,
buildNumber.value,
vcsNumber.value,
streams.value,
)
},
)
def buildFile(outDir: File, branch: String, buildNum: String, vcsNum: String, s: TaskStreams): Seq[File] = {
val versionInfo = Map(
"Revision" -> vcsNum,
"Branch" -> branch,
"Build" -> buildNum.replace("\"", "").trim,
"Date" -> new DateTime(DateTimeZone.UTC).toString(),
"Built-By" -> System.getProperty("user.name", "<unknown>"),
"Built-On" -> InetAddress.getLocalHost.getHostName,
)
val versionFileContents = (versionInfo map { case (x, y) => x + ": " + y }).toList.sorted
val versionFile = outDir / "version.txt"
s.log.debug("Writing to " + versionFile + ":\n " + versionFileContents.mkString("\n "))
IO.write(versionFile, versionFileContents mkString "\n")
Seq(versionFile)
}
}