diff --git a/script/release.py b/script/release.py new file mode 100755 index 0000000..07602b3 --- /dev/null +++ b/script/release.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python3 +######################################################################## +# Generates a new release. +######################################################################## +import sys +import re +import subprocess +import io +import os +import fileinput +if sys.version_info < (3, 0): + sys.stdout.write("Sorry, requires Python 3.x or better\n") + sys.exit(1) + +def colored(r, g, b, text): + return "\033[38;2;{};{};{}m{} \033[38;2;255;255;255m".format(r, g, b, text) + +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) +print("Calling git rev-parse --abbrev-ref HEAD") +pipe = subprocess.Popen(["git", "rev-parse", "--abbrev-ref", "HEAD"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) +branchresult = pipe.communicate()[0].decode().strip() + +if(branchresult != "main"): + print(colored(255, 0, 0, "We recommend that you release on main, you are on '"+branchresult+"'")) + +ret = subprocess.call(["git", "remote", "update"]) + +if(ret != 0): + sys.exit(ret) +print("Calling git log HEAD.. --oneline") +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() +scriptlocation = os.path.dirname(os.path.abspath(__file__)) + +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]) + print(newversion) +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 + +atleastminor= (currentv[0] != newversion[0]) or (currentv[1] != newversion[1]) + + + +newmajorversionstring = str(newversion[0]) +mewminorversionstring = str(newversion[1]) +newrevversionstring = str(newversion[2]) +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('project\(fast_float VERSION \d+\.\d+\.\d+ LANGUAGES CXX\)','project(fast_float VERSION '+newmajorversionstring+'.'+mewminorversionstring+'.'+newrevversionstring+" LANGUAGES CXX)", line.rstrip()) + print(line) + +print("modified "+cmakefile+", a backup was made") + + +readmefile = maindir + os.sep + "README.md" + + +for line in fileinput.input(readmefile, inplace=1, backup='.bak'): + line = re.sub('https://github.com/fastfloat/fast_float/releases/download/v(\d+\.\d+\.\d+)/fast_float.h','https://github.com/fastfloat/fast_float/releases/download/v'+newmajorversionstring+'.'+mewminorversionstring+'.'+newrevversionstring+'/fast_float.h', line.rstrip()) + print(line) + +print("modified "+readmefile+", a backup was made") +print("Please run the tests before issuing a release. \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") + + +