compensate for the gitolite mirror script not to be a proper executable
[git-mirror.git] / webhook-core.py
index d4c1ab7c68bcf9a6455ed7270f1697f267b3184e..dcb72502de11d409f6a960247ffaba0388735492 100755 (executable)
 #==============================================================================
 
 # 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
@@ -42,7 +55,7 @@ if __name__ == "__main__":
         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")
@@ -63,11 +76,12 @@ if __name__ == "__main__":
             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: