#!/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])