#!/usr/bin/python import os import sys import subprocess import pylibmc import traceback def check_output(*popenargs, **kwargs): if 'stdout' in kwargs: raise ValueError('stdout argument not allowed, it will be overridden.') process = subprocess.Popen(stdout=subprocess.PIPE, *popenargs, **kwargs) output, unused_err = process.communicate() retcode = process.poll() if retcode: cmd = kwargs.get("args") if cmd is None: cmd = popenargs[0] raise subprocess.CalledProcessError(retcode, cmd, output=output) return output subprocess.check_output = check_output # Color codes OKBLUE = '\033[94m' OKGREEN = '\033[92m' WARNING = '\033[93m' FAIL = '\033[91m' ENDC = '\033[0m' os.chdir("/home/humbug/humbug") if len(sys.argv) > 1: oldrev = sys.argv[1] newrev = sys.argv[2] refname = sys.argv[3] try: if not pylibmc.Client(['127.0.0.1']).flush_all(): print "%sflush_all returned False%s" % (WARNING, ENDC) # There doesn't seem to be a method to close a pylibmc Client object. except: print "%sCould not flush cache:%s" % (WARNING, ENDC) traceback.print_exc() subprocess.check_call(["git", "fetch"], stdout=open('/dev/null', 'w')) subprocess.check_call(["git", "reset", "--hard", refname], stdout=open('/dev/null', 'w')) #subprocess.check_call(["python", "manage.py", "syncdb"], stdout=open('/dev/null', 'w')) # Restart the FastCGI process, which is running in a shell loop in screen. # TODO: real daemonization for cmd in ('runfcgi', 'runtornado'): try: subprocess.check_call(["pkill", "-f", "python manage.py " + cmd]) except subprocess.CalledProcessError: print "%sCould not kill %s; is it running?%s" % (WARNING, cmd, ENDC) print OKGREEN + "Updated deployed version of humbug application!" + ENDC if newrev == '0000000000000000000000000000000000000000': # 0000000000000000000000000000000000000000 means we're deleting the ref commits = '' else: commits = subprocess.check_output(["git", "log", "%s..%s" % (oldrev, newrev)]) if '[schema]' in commits: print print FAIL + "Schema change detected! Please make the appropriate changes manually." + ENDC print