--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hooks-queue.py Sun Jul 17 22:38:03 2016 +0800
+from argparse import ArgumentParser, FileType, SUPPRESS
+from tornado.ioloop import IOLoop
+from tornado.options import define, options
+from tornado.web import Application, RequestHandler, URLSpec
+from candolint.utils import lookup_option, timestamp
+define('listen', metavar='IP', default='127.0.0.1')
+define('port', metavar='PORT', default=8034, type=int)
+define('xheaders', metavar='True|False', default=False, type=bool)
+class BitbucketHookHandler(RequestHandler):
+ payload = json.loads(self.request.body)
+ 'url': payload['repository']['links']['html']['href'],
+ 'scm': payload['repository']['scm'],
+ 'repo': payload['repository']['name'],
+ 'timestamp': timestamp(),
+ 'source': 'bitbucket.org'
+ for change in payload['push']['changes']:
+ for head in change['new']['heads']:
+ item.update(change=head['hash'])
+ data = json.dumps(item)
+ logging.debug('Pushing %s', data)
+ self.rconn.rpush('candolint:queue:changes', data)
+ logging.info('Pushed a change for %s', data['repo'])
+ self.finish({'message': 'OK, added {}'.format(len(items))})
+ return self.application.rconn
+class CandolintHooks(Application):
+ def __init__(self, rconn, debug):
+ URLSpec(r'/bb', BitbucketHookHandler),
+ super(CandolintHooks, self).__init__(handlers, debug=debug)
+ def listen(self, port, address='', **kwargs):
+ name = self.__class__.__name__
+ logging.info('%s is serving on %s:%d', name, address, port)
+ super(CandolintHooks, self).listen(port, address, **kwargs)
+ parser = ArgumentParser(argument_default=SUPPRESS)
+ '-c', '--config', type=FileType('r'),
+ help='configuration file (YAML)')
+ '-d', '--debug', action='store_true', default=False,
+ help='enable debugging output')
+ group = parser.add_argument_group(
+ 'these options that can also be specified in the configuration file')
+ group.add_argument('--redis-host', help='(default: 127.0.0.1)')
+ group.add_argument('--redis-port', type=int, help='(default: 6379)')
+ group.add_argument('--redis-password')
+ args, extra = parser.parse_known_args()
+ options.parse_command_line(extra)
+ config = yaml.safe_load(args.config) if hasattr(args, 'config') else {}
+ rhost = lookup_option('redis-host', args, config, default='127.0.0.1')
+ rport = lookup_option('redis-port', args, config, default=6379)
+ rpass = lookup_option('redis-password', args, config)
+ level=logging.DEBUG if args.debug else logging.INFO,
+ format='%(asctime)s %(levelname)-8s %(message)s')
+ logging.debug('Connecting to Redis server')
+ rconn = redis.StrictRedis(host=rhost, port=rport, password=rpass, db=0)
+ logging.info('Connected to Redis server')
+ application = CandolintHooks(rconn, args.debug)
+ application.listen(options.port, options.listen, xheaders=options.xheaders)
+ IOLoop.instance().start()
+if __name__ == '__main__':