self.name = name
self.local = conf['local']
self.owner = conf['owner'] # email address to notify in case of problems
- self.hmac_secret = conf['hmac-secret'].encode('utf-8')
+ self.hmac_secret = conf['hmac-secret'].encode('utf-8') if 'hmac-secret' in conf else None
self.deploy_key = conf['deploy-key'] # the SSH ky used for authenticating against remote hosts
self.mirrors = {} # maps mirrors to their URLs
mirror_prefix = 'mirror-'
send_mail("git-mirror {}".format(self.name), msg, recipients = [self.owner], sender = mail_sender)
def compute_hmac(self, data):
+ assert self.hmac_secret is not None
h = hmac.new(self.hmac_secret, digestmod = hashlib.sha1)
h.update(data)
return h.hexdigest()
if len(local_state):
raise Exception("Something went wrong getting the local state of {}.".format(ref))
local_sha = git_nullsha
- assert local_sha in (oldsha, newsha), "Someone lied about the old SHA."
+ # some sanity checking, but deal gracefully with new branches appearing
+ assert local_sha in (git_nullsha, oldsha, newsha), "Someone lied about the old SHA: Local ({}) is neither old ({}) nor new ({})".format(local_sha, oldsha, newsha)
# if we are already at newsha locally, we also ran the local hooks, so we do not have to do anything
if local_sha == newsha:
return "Local repository is already up-to-date."
# Now run the post-receive hooks. This will *also* push the changes to all mirrors, as we
# are one of these hooks!
os.putenv("GIT_MIRROR_SOURCE", mirror) # tell ourselves which repo we do *not* have to update
- with subprocess.Popen(['/bin/sh', 'hooks/post-receive'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) as p:
+ with subprocess.Popen(['hooks/post-receive'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) as p:
(stdout, stderr) = p.communicate("{} {} {}\n".format(oldsha, newsha, ref).encode('utf-8'))
stdout = stdout.decode('utf-8')
if p.returncode: