#==============================================================================
# This is the hook called by GitHub as webhook. It updats the local repository, and then all the other mirrors.
-import sys, traceback
+import sys, traceback, json
from git_mirror import *
+def get_github_payload(repo, signature):
+ '''Return the github-style JSON encoded payload (as if we were called as a github webhook)'''
+ data = sys.stdin.buffer.read()
+ verify_signature = repo.compute_hmac(data)
+ if signature != "sha1="+verify_signature:
+ raise Exception("You are not GitHub!")
+ try:
+ data = json.loads(data.decode('utf-8'))
+ return data
+ except ValueError:
+ return {} # nothing read
+
+
if __name__ == "__main__":
# call this with: <reponame> <event name> <signature>
repo = None # we will try to use this during exception handling
repo = repos[reponame]
# now sync this repository
- data = get_github_payload()
+ data = get_github_payload(repo, githubSignature)
if githubEvent == 'ping':
# github sends this initially
print("Content-Type: text/plain")
mirror = repo.find_mirror_by_url(urls)
if mirror is None:
raise Exception("Could not find the mirror.")
- repo.update_ref_from_mirror(ref, oldsha, newsha, mirror, suppress_stderr = True)
+ stdout = repo.update_ref_from_mirror(ref, oldsha, newsha, mirror, suppress_stderr = True)
# print an answer
print("Content-Type: text/plain")
print()
print("Updated {0}:{1} from mirror {2} from {3} to {4}".format(reponame, ref, mirror, oldsha, newsha))
+ print(stdout)
else:
raise Exception("Unexpected github event {0}.".format(githubEvent))
except Exception as e: