123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- import java.text.SimpleDateFormat
- import org.ajoberstar.grgit.*
- buildscript {
- repositories {
- mavenCentral()
- }
- dependencies {
- classpath 'org.ajoberstar:gradle-git:1.2.0'
- }
- }
- ext {
- jmeRevision = 0
- jmeGitHash = ""
- jmeGitTag = ""
- jmeShortGitHash = ""
- jmeBuildDate = new SimpleDateFormat("yyyy-MM-dd").format(new Date())
- jmeBranchName = "unknown"
- jmeFullVersion = "${jmeVersion}-SNAPSHOT"
- jmeVersionTag="SNAPSHOT"
- }
- task configureVersionInfo {
- try {
- // Users can configure behavior by setting properties on the command
- // line:
- //
- // jmeVersionName:
- // If set this will override all automatic version detection.
- //
- // useCommitHashAsVersionName:
- // If there is no jmeVersionName set and the current commit has no
- // specific tag then setting this to 'true' will cause the version to
- // be the full commit ID.
- //
- // includeBranchInVersion:
- // Set to true if a non-master branch name should be included in the automatically
- // generated version.
- def grgit = Grgit.open(project.file('.'))
- def head = grgit.head()
- jmeRevision = grgit.log(includes: [head]).size()
- jmeGitHash = head.id
- jmeShortGitHash = head.abbreviatedId
- jmeBranchName = grgit.branch.current.name
- // This code will find an exact-match tag if the current
- // commit is the same as the tag commit.
- jmeGitTag = grgit.tag.list().find { it.commit == head }
- def latestTag;
- if( jmeGitTag ) {
- // Just use the name. We keep jmeGitTag separate because there
- // is some logic that wants to know if this specific commit has
- // a tag versus 'whatever tag we are a child of'... which is what
- // 'latestTag' will be.
- jmeGitTag = jmeGitTag.name
- latestTag = jmeGitTag;
- } else {
- // Use describe to find the most recent tag. Unfortunately,
- // in this version of grgit, we don't have the 'always' options
- // so we can't make as many assumptions about the format of the
- // string.
- // If the commit is an exact match then it will return just the
- // tag name... else it will be tagName-commitCount-abbreviatedId
- // We'll use some groovy regex magic to get the tag either way.
- def describe = grgit.describe()
- def fullDescribe = (describe =~/(.*?)-(\d+)-g$jmeShortGitHash/)
- latestTag = fullDescribe ? fullDescribe[0][1] : describe
- println "Latest tag:" + latestTag
- }
- // We could enhance this with some more regex if we wanted to sanity
- // check that it was formatted like our versions.
- def tagVersion = (latestTag =~/v?(.*)/)[0][1];
- // If the branch is not master then use the tag.
- if( jmeBranchName != "master" ) {
- jmeVersion = tagVersion
- }
- // Parse out just the base version part. -SNAPSHOT versions
- // shouldn't really include our release suffixes
- def baseVersion = (jmeVersion =~/(\d+\.\d+.\d+)/)
- baseVersion = baseVersion.size() > 0 ? baseVersion[0][0] : jmeVersion
- if( !jmeVersionName ) {
- // If there is a specific tag for the top commit then we always
- // use that.
- if( jmeGitTag ) {
- println "Using GIT tag as version"
- jmeFullVersion = tagVersion; // already cleaned up
- jmeVersionTag = "" // and no SNAPSHOT suffix for an exact version tag
- // Note: this will not automatically add SNAPSHOT if the user has
- // local changes that they haven't committed. Technically, only
- // real CI builds should be using non-SNAPSHOT versions so we may
- // eventually want to change the script to always use -SNAPSHOT with
- // a CI option to turn it off.
- // We could also check the grgit.status for unstaged modified/removed files.
- // def unstaged = grgit.status().unstaged;
- // def modCount = unstaged.modified.size() + unstaged.removed.size()
- // ...but that seems like a wasteful check considering only official
- // version builds should not have a -SNAPSHOT.
- } else if( useCommitHashAsVersionName == "true" && jmeGitHash ) {
- // The user has opted to use the hash... and we actually have
- // a hash.
- println "Using commit ID as version"
- jmeFullVersion = jmeGitHash;
- jmeVersionTag = ""
- } else {
- println "Auto-detecting version"
- jmeVersionTag = "SNAPSHOT"
- if( includeBranchInVersion == "true" && jmeBranchName != "master" ) {
- jmeFullVersion = baseVersion + "-" + jmeBranchName + "-" + jmeVersionTag;
- } else {
- jmeFullVersion = baseVersion + "-" + jmeVersionTag;
- }
- }
- } else {
- // Just use defaults
- println "Using user-defined version"
- jmeFullVersion=jmeVersionName
- jmeVersionTag = "SNAPSHOT"
- }
- println("Revision: ${jmeRevision}")
- println("Hash: ${jmeGitHash}")
- println("Short Hash: ${jmeShortGitHash}")
- println("Tag: ${jmeGitTag}")
- println("Build Date: ${jmeBuildDate}")
- println("Build Branch: ${jmeBranchName}")
- println("Use commit hash as version ${useCommitHashAsVersionName}")
- println("Base Version: ${baseVersion}")
- println("Build Suffix: ${jmeVersionTag}")
- println("Build Version: ${jmeFullVersion}")
- } catch (ex) {
- // Failed to get repo info
- logger.warn("Failed to get repository info: " + ex.message + ". " + \
- "Only partial build info will be generated.")
- }
- }
|