Skip to content

Instantly share code, notes, and snippets.

@grncdr
Created August 10, 2011 00:20
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save grncdr/1135614 to your computer and use it in GitHub Desktop.
Save grncdr/1135614 to your computer and use it in GitHub Desktop.
script to pack up a python project and all of it's dependencies in a tarfile using virtualenv
import subprocess
import shutil
import os
import sys
import tarfile
def get_version(project_root):
process = subprocess.Popen(
['git', 'describe'],
stdout=subprocess.PIPE,
cwd=project_root
)
process.wait()
if process.returncode == 0:
return process.stdout
else:
import setup
return setup.version
def clone_to_temp(project_root, project_name, version):
temp_folder = "%s-%s" % (project_name, version)
if os.path.isdir(temp_folder):
shutil.rmtree(temp_folder)
returncode = subprocess.call(['git', 'clone', project_root, temp_folder])
if returncode != 0:
raise SystemExit("Failed to clone a temp copy of the git repo")
return temp_folder
def bootstrap_project(project_base):
bootstrap_script = os.path.join(project_base, 'bootstrap.py')
subprocess.call(['python', bootstrap_script, project_base])
subprocess.call(['python', bootstrap_script, '--relocatable', project_base])
def patch_activate_file(project_base):
activate_path = os.path.join(project_base, 'bin', 'activate')
new_activate = []
with open(activate_path) as activate_file:
for line in activate_file:
if line.startswith('VIRTUAL_ENV'):
new_activate.append('VIRTUAL_ENV=`cd \$(dirname \$(readlink --canonicalize --no-newline \$BASH_SOURCE))\/.. \&\& pwd`')
else:
new_activate.append(line)
with open(activate_path, 'w') as activate_file:
activate_file.write("\n".join(new_activate))
def create_archive(temp_dir):
filename = temp_dir + ".tar.gz"
output = tarfile.open(filename, mode="w:gz")
output.add(temp_dir)
output.close()
return filename
def create_artifact(project_root):
version = get_version(project_root)
import setup
temp_dir = clone_to_temp(project_root, setup.project_name, version)
bootstrap_project(temp_dir)
patch_activate_file(temp_dir)
archive_name = create_archive(temp_dir)
shutil.rmtree(temp_dir)
print "All done, archive created: %s" % archive_name
if __name__ == '__main__':
if len(sys.argv) > 1:
sys.path.insert(0, sys.argv[1])
create_artifact(sys.argv[1])
else:
raise SystemExit("Must specify a project_root as first argument!")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment