view scripts/release.groovy @ 208:f200b931ea9d

add release and hgflow scripts
author smith@nwoca.org
date Sat, 19 Dec 2015 14:26:46 +0000
parents
children 5bebb590b30e
line wrap: on
line source
#!groovy

/**
This script implements the SSDT branching strategy based on hg flow.  

The intension is to reduce dudgery 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.

The script does NOT "hg push --new-branch".  That step is left for you
if the branch was created correctly.

*/
	def project = new Properties()

	if (new File('gradle.properties').exists() ) {
		project.load(new File('gradle.properties').newInputStream())
	}	
	
	println "\nCurrent project:"
	println "\tversion: " + project.version ?: "Unknown"
	println "-" * 20
	
if (args.size() < 2) {
	println """	
	usage:  release.groovy {releaseVersion} {nextVersion}\n
	  e.g:  release.groovy 1.6.0 1.7.0    (SNAPSHOT will be added automatically)
	  
	If release ends in ".0", then will create 'release' stream, otherwise 'hotfix'.
	For hotfix, current working branch should be the release branch.
	
	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 
	   'latest.integration' changes.
"""	

	System.exit(0)
}

def releaseVersion = args[0]
def nextVersion = args[1]
def hotfix = !releaseVersion.endsWith('.0')
def stream = hotfix ? 'hotfix' : 'release'

println "Creating ${hotfix ? 'hotfix' : 'release'} branch for $releaseVersion"

checkForSnapshots()

println "hg flow $stream start v${releaseVersion} --dry-run".execute().text

println "Continue? Enter = Yes, ^C to cancel"
System.in.newReader().readLine()

updateVersion(releaseVersion)

println 'hg com -m "release: set release version"'.execute().text

println "hg flow ${stream} start v${releaseVersion} --dirty".execute().text

println "hg update default".execute().text

updateVersion(nextVersion + ".SNAPSHOT")

println 'hg com -m "release: set next release version"'.execute().text

println "hg update ${stream}/v${releaseVersion}".execute().text

println "Done! Created $releaseVersion $stream branch."
println "      Verify the branch created correctly then push the new branch."
println "      If any problems, then delete repo and clone fresh repository."

def updateVersion(String newVersion) {

	new File('gradle.properties').write(
		new File('gradle.properties').text.replaceAll(/version=(.*)/,"version=$newVersion")
	)
}

def checkForSnapshots() {
		def lines = new File('gradle.properties').readLines() + new File('build.gradle').readLines()
		def snapshots = lines.collect { it.trim() }.findAll{ 
			it.contains('.SNAPSHOT') && !it.startsWith('version=') ||
			it.contains('latest.') && (it.startsWith('compile') || it.startsWith('runtime'))
		}
		if (snapshots) {
			println "project contains SNAPSHOT dependencies: \n\t" + snapshots.join('\n\t')
			System.exit(1)
		}

}