#!/usr/bin/python2.7 import requests import argparse import json import os import re import sys import subprocess data = sys.stdin.readline().strip().split() OLDREV = data[0] NEWREV = data[1] REF = data[2] REGEX = "bug\s*(?:#|)\s*(?P\d+)" parser = argparse.ArgumentParser( description='Git commit hook for updating bugzilla') parser.add_argument('--apikey', "-u", help="Bugzilla REST API Key") parser.add_argument('--base', "-b", help="Bugzilla url base (https://bugs.linaro.org)", default="https://bugs.linaro.org") args = parser.parse_args() HEADERS = {"Content-Type": "application/json", "Accept": "application/json"} BUGZILLA_REST = "%s/rest" % args.base BUGZILLA_LINK_BASE = "%s/show_bug.cgi?id=" % args.base GIT_URL_BASE = "https://git.linaro.org" GIT_DIR_BASE = "/srv/repositories" def generate_web_url(rev): pwd = os.getcwd() if re.match(GIT_DIR_BASE, pwd): dir = pwd.split(GIT_DIR_BASE)[1] else: dir = pwd return "%s%s/commit/%s" % (GIT_URL_BASE, dir, rev) def do_put(url, data): requests.put(url, data=json.dumps(data), headers=HEADERS) def set_resolved_fixed(id): print "Updating bug at %s%i to: RESOLVED_FIXED" % (BUGZILLA_LINK_BASE, id) url = "%s/bug/%i?api_key=%s" % (BUGZILLA_REST, id, args.apikey) data = {"status": "RESOLVED", "resolution": "FIXED"} result = requests.put(url, json.dumps(data), headers=HEADERS) if result.status_code == 200: data = json.loads(result.content) changes = data["bugs"][0]["changes"] if len(changes) > 0: return True return False def add_comment(comment, id): url = "%s/bug/%i/comment?api_key=%s" % (BUGZILLA_REST, id, args.apikey) data = {"comment": comment} requests.post(url, json.dumps(data), headers=HEADERS) def generate_comment(rev): return "Updated automatically due to git commit\n" \ " %s\n" \ "Status changed to: RESOLVED_FIXED" % generate_web_url(rev) def get_git_revlist(): output = subprocess.check_output(["git", "rev-list", "%s..%s" % (OLDREV, NEWREV)]) return output.split() def get_commit_log(rev): log = subprocess.check_output(["git", "log", '--format=%B', "-n", "1", rev.strip()]) return log def update_if_bug(log, rev): reg = re.compile(REGEX, re.IGNORECASE | re.MULTILINE | re.DOTALL) result = re.search(reg, log) if result: for bug in result.groups(): changed = set_resolved_fixed(int(bug)) if changed: add_comment(generate_comment(rev), int(bug)) if OLDREV != 0000000000000000000000000000000000000000: revs = get_git_revlist() for rev in revs: commit_log = get_commit_log(rev) update_if_bug(commit_log, rev)