diff options
Diffstat (limited to 'tools/server-side/svnpubsub/commit-hook.py')
-rwxr-xr-x | tools/server-side/svnpubsub/commit-hook.py | 93 |
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]) |