Created
August 10, 2011 00:20
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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