changeset 215:5bebb590b30e

DEP-11: determine project version based on branch
author smith@nwoca.org
date Tue, 28 Jun 2016 23:01:21 +0100
parents 0ca4f3c952b7
children b628d49d2891
files init20.gradle scripts/release.groovy
diffstat 2 files changed, 84 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/init20.gradle	Mon Jun 27 19:50:00 2016 +0100
+++ b/init20.gradle	Tue Jun 28 23:01:21 2016 +0100
@@ -1,5 +1,7 @@
 import groovy.sql.Sql
+import groovy.transform.Sortable
 import groovy.transform.ToString
+import groovy.transform.TupleConstructor
 
 buildscript {
     repositories {
@@ -73,8 +75,7 @@
 gradle.ext.branchName = gradle.branch.name
 gradle.ext.branchStream = gradle.branch.stream
 gradle.ext.branchHash = gradle.branch.hash
-println "${gradle.hgRepositoryUrl} ${gradle.branch} ${gradle.branch.imageId} ${gradle.branch.deployName}" 
-println "$gradle.runtimeInfo"
+println "${gradle.hgRepositoryUrl} ${gradle.branch} ${gradle.branch.version}"
 
 loadEnvironments()
 
@@ -344,23 +345,33 @@
     def void projectsEvaluated(Gradle gradle) {
         def ssdtArtifactory = 'http://repos.ssdt.nwoca.org/artifactory'
         Project root = gradle.getRootProject()
+
+
+        def branchVersioning = gradle.rootProject.version == 'unspecified'
+
         root.allprojects {
 
             def thisProject = delegate
             thisProject.status = 'integration'
             if (gradle.branchStream) {
-                thisProject.status = 'integration'
-                def fixupVersion = thisProject.version - ".SNAPSHOT"
-                if (gradle.branchStream == 'feature') {
-                    fixupVersion = fixupVersion + ".SNAPSHOT"
+                if (branchVersioning) {
+                    thisProject.version = gradle.branch.version
+                    thisProject.status = gradle.branch.defaultDependencyStatus
+                } else {
+
+                    thisProject.status = 'integration'
+                    def fixupVersion = thisProject.version - ".SNAPSHOT"
+                    if (gradle.branchStream == 'feature') {
+                        fixupVersion = fixupVersion + ".SNAPSHOT"
+                    }
+                    if (gradle.branchStream == 'develop') {
+                        fixupVersion = fixupVersion + ".SNAPSHOT"
+                    }
+                    if (gradle.branchStream in ['production', 'release', 'hotfix']) {
+                        thisProject.status = 'release'
+                    }
+                    thisProject.version = fixupVersion
                 }
-                 if (gradle.branchStream == 'develop') {
-                    fixupVersion = fixupVersion + ".SNAPSHOT"
-                }
-                if (gradle.branchStream in ['production', 'release','hotfix']) {
-                    thisProject.status = 'release'
-                }
-                thisProject.version = fixupVersion
             }
 
             configurations.all {
@@ -582,12 +593,33 @@
 }
 
 
+@TupleConstructor
+@Sortable
+class Version {
+
+    Integer major = 0
+    Integer minor = 0
+    Integer patch = 0
+    Boolean snapshot = true
+
+    Version nextVersion() {
+        new Version(major, minor + 1, 0)
+    }
+
+    String toString() {
+        "${major}.${minor}.${patch}${snapshot ? '.SNAPSHOT' : ''}"
+    }
+
+}
+
+
 @ToString(includes=['name','shortName','buildVersion','imageId','deployName'],includeNames= true)
 class BranchInfo {
     def name
     def stream = "none"
 	def buildNumber = ""	
 	def changeset = ""
+    def version
 
     BranchInfo(name) {
         this.name = name
@@ -598,22 +630,37 @@
         determineStream()
 		buildNumber = System.getenv('bamboo_buildNumber') ?: ""
 		changeset = System.getenv('bamboo_planRepository_revision') ?: ""
-
 	}
 	
 	String getDefaultDependencyStatus() {
-		return stream in ['release','hotfix'] ? 'release' : 'integration'
+		return isRelease() ? 'release' : 'integration'
 	}
-	
-	def getShortName() {
+
+    private boolean isRelease() {
+        return stream in ['release', 'hotfix']
+    }
+
+    def getShortName() {
 		def result = name.contains('/') ? name.split('/')[1] : name 
 	} 
 	
-	def getBuildVersion() {
-		stream in ['release','hotfix'] ? shortName - "v": ""
+	String getBuildVersion() {
+		def v = isRelease() ? shortName - "v": ""
+        return v
 	}
-	
-	def getImageId() {
+
+    def Version getVersion() {
+        if (!version) {
+            if (isRelease()) {
+                version = new Version(*getBuildVersion().split('\\.')*.toInteger(), false)
+            } else {
+                version = findSnapshotVersion()
+            }
+        }
+        return version
+    }
+
+    def getImageId() {
 		(buildVersion ?:  shortName.take(25)) + (buildNumber ? "-${buildNumber}" : "-0")
 	}
 
@@ -632,6 +679,20 @@
         new BigInteger(1, digest.digest()).toString(16).padLeft(32, '0')
     }
 
+    private findSnapshotVersion() {
+        def versions = "hg branches --closed".execute().text.split('\n').findAll {
+            it.startsWith( 'release') || it.startsWith( 'hotfix')
+        }.collect {
+            it.replaceAll('\\s+',' ').split(' ')[0].split('/')[1] - 'v'
+        }.collect {
+            new Version(*it.split('\\.')*.toInteger())
+        }.sort { v1, v2 -> v2 <=> v1 }
+
+        return versions ?  versions.first().nextVersion() : new Version().nextVersion()
+
+    }
+
+
     def determineName()  {
         try {
             def branch = "hg branch".execute().text.trim()
--- a/scripts/release.groovy	Mon Jun 27 19:50:00 2016 +0100
+++ b/scripts/release.groovy	Tue Jun 28 23:01:21 2016 +0100
@@ -3,7 +3,7 @@
 /**
 This script implements the SSDT branching strategy based on hg flow.  
 
-The intension is to reduce dudgery of creating release branches.  The 
+The intention is to reduce drudgery of creating release branches.  The
 script tries to do the right thing based on standard SSDT project structures, 
 but it is the user's responsibility to ensure it's correct.
 
@@ -32,7 +32,7 @@
 	Recommend that this script be executed in a fresh clone of the repo.
 	
 	** Any uncommitted changes in the working directory will be committed with
-	   the initial setting of the version. This are assumed to be 
+	   the initial setting of the version. These are assumed to be
 	   'latest.integration' changes.
 """