Files
zulip/tools/post-receive
Keegan McAllister 75704ad1e8 Consistently use #!/usr/bin/env python
At Ksplice we used /usr/bin/python because we shipped dependencies as Debian /
Red Hat packages, which would be installed against the system Python.  We were
also very careful to use only Python 2.3 features so that even old system
Python would still work.

None of that is true at Humbug.  We expect users to install dependencies
themselves, so it's more likely that the Python in $PATH is correct.  On OS X
in particular, it's common to have five broken Python installs and there's no
expectation that /usr/bin/python is the right one.

The files which aren't marked executable are not interesting to run as scripts,
so we just remove the line there.  (In general it's common to have libraries
that can also be executed, to run test cases or whatever, but that's not the
case here.)

(imported from commit 437d4aee2c6e66601ad3334eefd50749cce2eca6)
2013-02-20 16:02:30 -05:00

68 lines
2.7 KiB
Python
Executable File

#!/usr/bin/env python
#
# Humbug's post-receive hook. There is a symlink
# from /srv/git/humbug.git/hooks/post-receive
# to ~humbug/humbug/tools/post-receive
# on git.humbughq.com. So to deploy changes to this script, run
#
# ssh humbug@git.humbughq.com 'cd humbug; git pull'
#
# To send the Humbug notices, this script calls out to our
# for-distribution git hook (under api/integrations/); since the git
# hook needs to be in the same directory as the configuration script
# for the git hook, this means that we need to have a shared directory
# containing (a symlink to) both the the for-distribution git hook and
# the Humbug configuration; for the moment those are
# bots/githook-post-receive and bots/humbug_git_config.py,
# respectively. We need the intermediate symlink because the git hook
# looks for its configuration in the directory that it sits in, and
# api/integrations/git/ has the example configuration.
#
#
# The "post-receive" script is run after receive-pack has accepted a pack
# and the repository has been updated. It is passed arguments in through
# stdin in the form
# <oldrev> <newrev> <refname>
# For example:
# aa453216d1b3e49e7f6f98441fa56946ddcd6a20 68f7abf4e6f922807889f52bc043ecd31b79f814 refs/heads/master
#
# see contrib/hooks/ for a sample
import sys
import subprocess
# check_output is backported from subprocess.py in Python 2.7
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
def update_deployment(server, oldrev, newrev, refname):
subprocess.check_call(["ssh", server, "--", "env", "-u", "GIT_DIR",
"/home/humbug/humbug/tools/update-deployment",
oldrev, newrev, refname])
deployments = {
'refs/heads/prod': ('humbughq.com', 'prod'),
'refs/heads/master': ('staging.humbughq.com', 'master'),
'refs/heads/test-post-receive': ('staging.humbughq.com', 'master'),
}
for ln in sys.stdin:
oldrev, newrev, refname = ln.strip().split()
if refname in deployments:
(server, branch) = deployments[refname]
p = subprocess.Popen("/home/humbug/humbug/bots/githook-post-receive",
stdin=subprocess.PIPE)
p.communicate(input=ln)
update_deployment(server, oldrev, newrev, "origin/" + branch)