changed os system calls to subprocess calls

This commit is contained in:
Mr. Krabbs 2020-09-14 14:44:48 -07:00
commit 2a4b4ea6e6

View file

@ -9,11 +9,23 @@ def failed():
sys.exit(2) sys.exit(2)
def check_file_exists(path): def check_file_exists(path):
"""
Checks if a file exists or not.
"""
return os.path.isfile(path) return os.path.isfile(path)
def check_dir_exists(path): def check_dir_exists(path):
"""
Checks if a folder exists or not.
"""
return os.path.isdir(path) return os.path.isdir(path)
def run_command(*args, **kwargs):
"""
Runs an os command using subprocess module.
"""
return subprocess.call([*args], **kwargs)
import argparse import argparse
parser = argparse.ArgumentParser(description="Build a SWIG distribution tarball swig-x.y.z.tar.gz") 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("version", help="version string in format x.y.z")
@ -28,6 +40,13 @@ dirname = "swig-" + version
force_tag = args.force_tag force_tag = args.force_tag
skip_checks = args.skip_checks skip_checks = args.skip_checks
# Tools directory path $ENV/swig/Tools
toolsdir = os.path.dirname(os.path.abspath(__file__))
# Root directory path (swig) $ENV/swig
rootdir = os.path.abspath(os.path.join(toolsdir, os.pardir))
# version directory path $ENV/swig/<x.x.x>
dirpath = os.path.join(rootdir, dirname)
if sys.version_info[0:2] < (2, 7): if sys.version_info[0:2] < (2, 7):
print("Error: Python 2.7 or higher is required") print("Error: Python 2.7 or higher is required")
sys.exit(3) sys.exit(3)
@ -39,26 +58,26 @@ if dirname.lower() != dirname:
# If directory and tarball exist, remove it # If directory and tarball exist, remove it
print("Removing " + dirname) print("Removing " + dirname)
if check_dir_exists(dirname): if check_dir_exists(dirpath):
subprocess.call(["rm", "-rf", dirname]) run_command("rm", "-rf", dirpath)
print("Removing " + dirname + ".tar if exists") print("Removing " + dirname + ".tar if exists")
filename = dirname + ".tar" filename = dirpath + ".tar"
if check_file_exists(filename): if check_file_exists(filename):
subprocess.call(["rm", "-rf", filename]) run_command("rm", "-rf", filename)
print("Removing " + dirname + ".tar.gz if exists") print("Removing " + dirname + ".tar.gz if exists")
filename += ".gz" filename += ".gz"
if check_file_exists(filename): if check_file_exists(filename):
subprocess.call(["rm", "-rf", filename]) run_command("rm", "-rf", filename)
# Grab the code from git # Grab the code from git
print("Checking there are no local changes in git repo") print("Checking there are no local changes in git repo")
os.system("git remote update origin") == 0 or failed() run_command("git", "remote", "update", "origin") == 0 or failed()
command = ["git", "status", "--porcelain", "-uno"] command = ["git", "status", "--porcelain", "-uno"]
out = subprocess.check_output(command) out = subprocess.check_output(command)
if out.strip() != "": if out.strip():
print("Local git repository has modifications") print("Local git repository has modifications")
print(" ".join(command)) print(" ".join(command))
print(out) print(out)
@ -68,7 +87,7 @@ if not skip_checks:
print("Checking git repository is in sync with remote repository") print("Checking git repository is in sync with remote repository")
command = ["git", "log", "--oneline", branch + "..origin/" + branch] command = ["git", "log", "--oneline", branch + "..origin/" + branch]
out = subprocess.check_output(command) out = subprocess.check_output(command)
if out.strip() != "": if out.strip():
print("Remote repository has additional modifications to local repository") print("Remote repository has additional modifications to local repository")
print(" ".join(command)) print(" ".join(command))
print(out) print(out)
@ -76,7 +95,7 @@ if not skip_checks:
command = ["git", "log", "--oneline", "origin/" + branch + ".." + branch] command = ["git", "log", "--oneline", "origin/" + branch + ".." + branch]
out = subprocess.check_output(command) out = subprocess.check_output(command)
if out.strip() != "": if out.strip():
print("Local repository has modifications not pushed to the remote repository") 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("These should be pushed and checked that they pass Continuous Integration testing before continuing")
print(" ".join(command)) print(" ".join(command))
@ -84,31 +103,49 @@ if not skip_checks:
sys.exit(3) sys.exit(3)
print("Tagging release") print("Tagging release")
tag = "'v" + version + "'" tag = "v" + version
force = "-f " if force_tag else "" force = "-f " if force_tag else ""
os.system("git tag -a -m 'Release version " + version + "' " + force + tag) == 0 or failed() command = ["git", "tag", "-a", "-m", "'Release version " + version + "'"]
force and command.extend(force, tag)
not force and command.append(tag)
run_command(*command) == 0 or failed()
outdir = os.path.basename(os.getcwd()) + "/" + dirname + "/" outdir = dirname + "/"
print("Grabbing tagged release git repository using 'git archive' into " + outdir) print("Grabbing tagged release git repository using 'git archive' into " + outdir)
os.system("(cd .. && git archive --prefix=" + outdir + " " + tag + " . | tar -xf -)") == 0 or failed()
# using pipe operator without shell=True; split commands into individual ones.
# git archive command
command = ["git", "archive", "--prefix=" + outdir, tag, "."]
archive_ps = subprocess.Popen((*command, ), cwd=rootdir, stdout=subprocess.PIPE)
# tar -xf -
tar_ps = subprocess.Popen(("tar", "-xf", "-"), stdin=archive_ps.stdout, stdout=subprocess.PIPE)
archive_ps.stdout.close() # Allow archive_ps to receive a SIGPIPE if tar_ps exits.
output = tar_ps.communicate()
# Go build the system # Go build the system
print("Building system") print("Building system")
os.system("cd " + dirname + " && ./autogen.sh") == 0 or failed() run_command("./autogen.sh", cwd=dirpath) == 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() cmdpath = os.path.join(dirpath, "Source", "CParse")
run_command("bison", "-y", "-d", "parser.y", cwd=cmdpath) == 0 or failed()
run_command("mv", "y.tab.c", "parser.c", cwd=cmdpath) == 0 or failed()
run_command("mv", "y.tab.h", "parser.h", cwd=cmdpath) == 0 or failed()
run_command("make", "-f", "Makefile.in", "libfiles", "srcdir=./", cwd=dirpath) == 0 or failed()
# Remove autoconf files # Remove autoconf files
os.system("find " + dirname + " -name autom4te.cache -exec rm -rf {} \\;") run_command("find", dirname, "-name", "autom4te.cache", "-exec", "rm", "-rf", "{}", ";", cwd=rootdir)
# Build documentation # Build documentation
print("Building html documentation") print("Building html documentation")
os.system("cd " + dirname + "/Doc/Manual && make all clean-baks") == 0 or failed() # os.system("cd " + dirname + "/Doc/Manual && make all clean-baks") == 0 or failed()
docpath = os.path.join(dirpath, "Doc", "Manual")
run_command("make", "all", "clean-baks", cwd=docpath) == 0 or failed()
# Build the tar-ball # Build the tar-ball
os.system("tar -cf " + dirname + ".tar " + dirname) == 0 or failed() run_command("tar", "-cf", dirname + ".tar", dirname, stdout=open(dirname + ".tar", "w")) == 0 or failed()
os.system("gzip " + dirname + ".tar") == 0 or failed() run_command("gzip", dirname + ".tar", stdout=open(dirname + ".tar.gz", "w")) == 0 or failed()
print("Finished building " + dirname + ".tar.gz") print("Finished building " + dirname + ".tar.gz")