From 9ddc8d6ba67cf22d8c683bd89f458a748901985d Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Tue, 26 Feb 2019 17:08:00 -0500 Subject: [PATCH] Adding release script. --- tools/release.py | 115 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100755 tools/release.py diff --git a/tools/release.py b/tools/release.py new file mode 100755 index 000000000..3775d47fd --- /dev/null +++ b/tools/release.py @@ -0,0 +1,115 @@ +#!/usr/bin/env python3 +######################################################################## +# Generates a new release. +######################################################################## +import sys +import re +import subprocess +import io +import os + + +def extractnumbers(s): + return tuple(map(int,re.findall("(\d+)\.(\d+)\.(\d+)",str(s))[0])) + +def toversionstring(major, minor, rev): + return str(major)+"."+str(minor)+"."+str(rev) + +def topaddedversionstring(major, minor, rev): + return str(major)+str(minor).zfill(3)+str(rev).zfill(3) + +pipe = subprocess.Popen(["git", "rev-parse", "--abbrev-ref", "HEAD"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) +branchresult = pipe.communicate()[0].decode().strip() + +if(branchresult != "master"): + print("release on master, you are on '"+branchresult+"'") + sys.exit(-1) + + +ret = subprocess.call(["git", "remote", "update"]) + +if(ret != 0): + sys.exit(ret) + + + +pipe = subprocess.Popen(["git", "log", "HEAD..", "--oneline"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) +uptodateresult = pipe.communicate()[0].decode().strip() + +if(len(uptodateresult) != 0): + print(uptodateresult) + sys.exit(-1) + +pipe = subprocess.Popen(["git", "rev-parse", "--show-toplevel"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) +maindir = pipe.communicate()[0].decode().strip() + + +print("repository: "+maindir) + +pipe = subprocess.Popen(["git", "describe", "--abbrev=0", "--tags"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) +versionresult = pipe.communicate()[0].decode().strip() + +print("last version: "+versionresult ) +try: + currentv = extractnumbers(versionresult) +except: + currentv = [0,0,0] +if(len(sys.argv) != 2): + nextv = (currentv[0],currentv[1], currentv[2]+1) + print ("please specify version number, e.g. "+toversionstring(*nextv)) + sys.exit(-1) +try: + newversion = extractnumbers(sys.argv[1]) +except: + print("can't parse version number "+sys.argv[1]) + sys.exit(-1) + +print("checking that new version is valid") + +if(newversion[0] != currentv[0]): + assert newversion[0] == currentv[0] + 1 + assert newversion[1] == 0 + assert newversion[2] == 0 +elif (newversion[1] != currentv[1]): + assert newversion[1] == currentv[1] + 1 + assert newversion[2] == 0 +else : + assert newversion[2] == currentv[2] + 1 + + + +versionfilerel = os.sep + "include" + os.sep + "simdjson" + os.sep + "simdjson_version.h" +versionfile = maindir + versionfilerel + +with open(versionfile, 'w') as file: + file.write("// "+versionfilerel+" automatically generated by release.py, do not change by hand \n") + file.write("#ifndef SIMDJSON_INCLUDE_SIMDJSON_VERSION \n") + file.write("#define SIMDJSON_INCLUDE_SIMDJSON_VERSION \n") + file.write("#define SIMDJSON_VERSION = "+toversionstring(*newversion)+", \n") + file.write("enum { \n") + file.write(" SIMDJSON_VERSION_MAJOR = "+str(newversion[0])+", \n") + file.write(" SIMDJSON_VERSION_MINOR = "+str(newversion[1])+", \n") + file.write(" SIMDJSON_VERSION_REVISION = "+str(newversion[2])+" \n") + file.write("}; \n") + file.write("#endif // SIMDJSON_INCLUDE_SIMDJSON_VERSION \n") + + +print(versionfile + " modified") + +import fileinput +import re + +newversionstring = str(newversion[0]) + "." + str(newversion[1]) + "." + str(newversion[2]) +cmakefile = maindir + os.sep + "CMakeLists.txt" +for line in fileinput.input(cmakefile, inplace=1, backup='.bak'): + line = re.sub('SIMDJSON_LIB_VERSION "\d+\.\d+\.\d+','SIMDJSON_LIB_VERSION "'+newversionstring, line.rstrip()) + line = re.sub('SIMDJSON_LIB_SOVERSION "\d+\.\d+\.\d+','SIMDJSON_LIB_SOVERSION "'+newversionstring, line) + print(line) + +print("modified "+cmakefile+", a backup was made") + +scriptlocation = os.path.dirname(os.path.abspath(__file__)) + + +print("Please run the tests before issuing a release, do make test && make amalgamate \n") +print("to issue release, enter \n git commit -a && git push && git tag -a v"+toversionstring(*newversion)+" -m \"version "+toversionstring(*newversion)+"\" && git push --tags \n")