summaryrefslogtreecommitdiff
path: root/tools/server-side/svnpubsub/commit-hook.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/server-side/svnpubsub/commit-hook.py')
-rwxr-xr-xtools/server-side/svnpubsub/commit-hook.py93
1 files changed, 93 insertions, 0 deletions
diff --git a/tools/server-side/svnpubsub/commit-hook.py b/tools/server-side/svnpubsub/commit-hook.py
new file mode 100755
index 0000000..4a1a3f3
--- /dev/null
+++ b/tools/server-side/svnpubsub/commit-hook.py
@@ -0,0 +1,93 @@
+#!/usr/local/bin/python
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+SVNLOOK="/usr/local/svn-install/current/bin/svnlook"
+#SVNLOOK="/usr/local/bin/svnlook"
+
+HOST="127.0.0.1"
+PORT=2069
+
+import sys
+import subprocess
+try:
+ import simplejson as json
+except ImportError:
+ import json
+
+import urllib2
+
+def svncmd(cmd):
+ return subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
+
+def svncmd_uuid(repo):
+ cmd = "%s uuid %s" % (SVNLOOK, repo)
+ p = svncmd(cmd)
+ return p.stdout.read().strip()
+
+def svncmd_info(repo, revision):
+ cmd = "%s info -r %s %s" % (SVNLOOK, revision, repo)
+ p = svncmd(cmd)
+ data = p.stdout.read().split("\n")
+ #print data
+ return {'author': data[0].strip(),
+ 'date': data[1].strip(),
+ 'log': "\n".join(data[3:]).strip()}
+
+def svncmd_changed(repo, revision):
+ cmd = "%s changed -r %s %s" % (SVNLOOK, revision, repo)
+ p = svncmd(cmd)
+ changed = {}
+ while True:
+ line = p.stdout.readline()
+ if not line:
+ break
+ line = line.strip()
+ (flags, filename) = (line[0:3], line[4:])
+ changed[filename] = {'flags': flags}
+ return changed
+
+def do_put(body):
+ opener = urllib2.build_opener(urllib2.HTTPHandler)
+ request = urllib2.Request("http://%s:%d/commits" %(HOST, PORT), data=body)
+ request.add_header('Content-Type', 'application/json')
+ request.get_method = lambda: 'PUT'
+ url = opener.open(request)
+
+
+def main(repo, revision):
+ revision = revision.lstrip('r')
+ i = svncmd_info(repo, revision)
+ data = {'type': 'svn',
+ 'format': 1,
+ 'id': int(revision),
+ 'changed': {},
+ 'repository': svncmd_uuid(repo),
+ 'committer': i['author'],
+ 'log': i['log'],
+ 'date': i['date'],
+ }
+ data['changed'].update(svncmd_changed(repo, revision))
+ body = json.dumps(data)
+ do_put(body)
+
+if __name__ == "__main__":
+ if len(sys.argv) not in (3, 4):
+ sys.stderr.write("invalid args\n")
+ sys.exit(0)
+
+ main(*sys.argv[1:3])