#!/usr/bin/env python import sys import os import subprocess def failed(): print("mkdist.py failed to complete") sys.exit(2) import argparse parser = argparse.ArgumentParser(description="Build a SWIG distribution tarball swig-x.y.z.tar.gz") parser.add_argument("version", help="version string in format x.y.z") parser.add_argument("-b", "--branch", required=False, default="master", help="git branch name to create tarball from [master]") parser.add_argument("-f", "--force-tag", required=False, action="store_true", help="force tag (replace git tag if it already exists)") parser.add_argument("-s", "--skip-checks", required=False, action="store_true", help="skip checks (that local and remote repos are in sync)") args = parser.parse_args() version = args.version branch = args.branch dirname = "swig-" + version force_tag = args.force_tag skip_checks = args.skip_checks if sys.version_info[0:2] < (2, 7): print("Error: Python 2.7 or higher is required") sys.exit(3) # Check name matches normal unix conventions if dirname.lower() != dirname: print("directory name (" + dirname + ") should be in lowercase") sys.exit(3) # If directory and tarball exist, remove it print("Removing " + dirname) os.system("rm -rf " + dirname) print("Removing " + dirname + ".tar if exists") os.system("rm -f " + dirname + ".tar.gz") print("Removing " + dirname + ".tar.gz if exists") os.system("rm -f " + dirname + ".tar") # Grab the code from git print("Checking there are no local changes in git repo") os.system("git remote update origin") == 0 or failed() command = ["git", "status", "--porcelain", "-uno"] out = subprocess.check_output(command) if out.strip() != "": print("Local git repository has modifications") print(" ".join(command)) print(out) sys.exit(3) if not skip_checks: print("Checking git repository is in sync with remote repository") command = ["git", "log", "--oneline", branch + "..origin/" + branch] out = subprocess.check_output(command) if out.strip() != "": print("Remote repository has additional modifications to local repository") print(" ".join(command)) print(out) sys.exit(3) command = ["git", "log", "--oneline", "origin/" + branch + ".." + branch] out = subprocess.check_output(command) if out.strip() != "": print("Local repository has modifications not pushed to the remote repository") print("These should be pushed and checked that they pass Continuous Integration testing before continuing") print(" ".join(command)) print(out) sys.exit(3) print("Tagging release") tag = "'v" + version + "'" force = "-f " if force_tag else "" os.system("git tag -a -m 'Release version " + version + "' " + force + tag) == 0 or failed() outdir = os.path.basename(os.getcwd()) + "/" + dirname + "/" print("Grabbing tagged release git repository using 'git archive' into " + outdir) os.system("(cd .. && git archive --prefix=" + outdir + " " + tag + " . | tar -xf -)") == 0 or failed() # Go build the system print("Building system") os.system("cd " + dirname + " && ./autogen.sh") == 0 or failed() os.system("cd " + dirname + "/Source/CParse && bison -y -d parser.y && mv y.tab.c parser.c && mv y.tab.h parser.h") == 0 or failed() os.system("cd " + dirname + " && make -f Makefile.in libfiles srcdir=./") == 0 or failed() # Remove autoconf files os.system("find " + dirname + " -name autom4te.cache -exec rm -rf {} \\;") # Build documentation print("Building html documentation") os.system("cd " + dirname + "/Doc/Manual && make all clean-baks") == 0 or failed() # Build the tar-ball os.system("tar -cf " + dirname + ".tar " + dirname) == 0 or failed() os.system("gzip " + dirname + ".tar") == 0 or failed() print("Finished building " + dirname + ".tar.gz")