diff --git a/modules/gerrit/files/change-merged b/modules/gerrit/files/change-merged index a21165e256..61e8610ae2 100755 --- a/modules/gerrit/files/change-merged +++ b/modules/gerrit/files/change-merged @@ -1,179 +1,3 @@ -#!/usr/bin/env python -# -# Gerrit-Launchpad Hook, inspired by https://github.com/hobbs/jirret -# -# Copyright (C) 2011 Catalyst IT (http://www.catalyst.net.nz) -# Copyright (C) 2011 Rackspace US, Inc. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . +#!/bin/sh -# Changed by James E. Blair to add -# config file parsing, and signed email with commands. - -# Some parts: -# Copyright 2009-2011 Canonical Ltd. This software is licensed under the -# GNU Affero General Public License version 3 (see the file LICENSE). - -from email.mime.text import MIMEText -from getopt import getopt -import re -import smtplib -import subprocess -import sys, os -import pyme, pyme.core -import StringIO -import ConfigParser - -TO_ADDRESS_SUFFIX = '@bugs.launchpad.net' -BASE_DIR = '/home/gerrit2/review_site' -GERRIT_CONFIG = os.environ.get('GERRIT_CONFIG','/home/gerrit2/review_site/etc/gerrit.config') - -def get_broken_config(filename): - """ gerrit config ini files are broken and have leading tabs """ - text = "" - with open(filename,"r") as conf: - for line in conf.readlines(): - text = "%s%s" % (text, line.lstrip()) - - fp = StringIO.StringIO(text) - c=ConfigParser.ConfigParser() - c.readfp(fp) - return c - -gerrit_config = get_broken_config(GERRIT_CONFIG) -FROM_ADDRESS = gerrit_config.get('user', 'email') - - -# From Launchpad: lib/lp/services/mail/incoming.py -# Match '\n' and '\r' line endings. That is, all '\r' that are not -# followed by a '\n', and all '\n' that are not preceded by a '\r'. -non_canonicalised_line_endings = re.compile('((?>> canonicalise_line_endings('\n\nfoo\nbar\rbaz\r\n') - '\r\n\r\nfoo\r\nbar\r\nbaz\r\n' - - >>> canonicalise_line_endings('\r\rfoo\r\nbar\rbaz\n') - '\r\n\r\nfoo\r\nbar\r\nbaz\r\n' - - >>> canonicalise_line_endings('\r\nfoo\r\nbar\nbaz\r') - '\r\nfoo\r\nbar\r\nbaz\r\n' - """ - if non_canonicalised_line_endings.search(text): - text = non_canonicalised_line_endings.sub('\r\n', text) - if trailing_whitespace.search(text): - text = trailing_whitespace.sub('', text) - return text -# End code from Launchpad: lib/lp/services/mail/incoming.py - -def email_tracker(change_url, project, branch, submitter, commit): - # Extract git log of all merged commits - git_log = subprocess.Popen(['git', '--git-dir=' + BASE_DIR + '/git/' + project + '.git', 'log', '--no-merges', commit + '^1..' + commit], stdout=subprocess.PIPE).communicate()[0] - - # Find bug numbers referenced in the git log - bug_regexp = r'([Bb]ug|[Ll][Pp])\s*[#:]?\s*(\d+)' - tokens = re.split(bug_regexp, git_log) - - # Extract unique bug numbers - bugs = [] - for token in tokens: - if re.match('^\d+$', token) and (token not in bugs): - bugs.append(token) - send_bug_mail(token, change_url, project, commit, submitter, branch, git_log) - -def send_bug_mail(bug_number, change_url, project, commit, submitter, branch, git_log): - - to_address = bug_number + TO_ADDRESS_SUFFIX - - gitorious_url = 'http://github.com/%s/commit/%s' % (project, commit) - body = '''Reviewed: %s -Committed: %s -Submitter: %s -Branch: %s\n''' % (change_url, gitorious_url, submitter, branch) - - if branch == 'master': - body = body + '\n status fixcommitted\n done\n' - else: - branch_name = branch.replace('/','-') - if branch_name.replace('-','').isalnum(): - body = body + '\n tag in-%s\n done\n' % branch_name - - body = body + '\n' + git_log - - bodypart = MIMEText(body) - bodystring = bodypart.as_string() - bodystring = canonicalise_line_endings(bodystring) - - plain = pyme.core.Data(bodystring) - cipher = pyme.core.Data() - gpg = pyme.core.Context() - gpg.set_armor(1) - - gpg.op_keylist_start(FROM_ADDRESS, 0) - gpg.op_sign(plain, cipher, pyme.pygpgme.GPGME_SIG_MODE_DETACH) - cipher.seek(0,0) - signature = cipher.read() - - from email.mime.multipart import MIMEMultipart - from email.mime.base import MIMEBase - msg = MIMEMultipart(_subtype='signed',protocol='application/pgp-signature') - short_project = project.split("/")[-1] - msg['Subject'] = 'Fix merged to %s (%s)' % (short_project, branch) - msg['From'] = FROM_ADDRESS - msg['To'] = to_address - - msg.attach(bodypart) - signpart = MIMEBase('application','pgp-signature') - signpart.set_payload(signature) - msg.attach(signpart) - - #print msg.as_string() - s = smtplib.SMTP() - s.connect() - s.sendmail(FROM_ADDRESS, [to_address], msg.as_string()) - s.quit() - -def main(): - # https://gerrit.googlecode.com/svn/documentation/2.1.6/config-hooks.html#change-merged - gerrit_args = ['change=', 'change-url=', 'project=', 'branch=', 'submitter=', 'commit='] - args, unused = getopt(sys.argv[1:], '', gerrit_args) - - change_url = project = branch = submitter = commit = None - for argname, argv in args: - if argname == '--change-url': - change_url = argv - elif argname == '--project': - project = argv - elif argname == '--branch': - branch = argv - elif argname == '--submitter': - submitter = argv - elif argname == '--commit': - commit = argv - - if change_url and project and branch and submitter and commit: - email_tracker(change_url, project, branch, submitter, commit) - else: - print 'Missing arguments' - return 1 - - return 0; - -if __name__ == '__main__': - sys.exit(main()) +python ~/openstack-ci/gerrit/update_bug.py change-merged "$@" diff --git a/modules/gerrit/files/patchset-created b/modules/gerrit/files/patchset-created index 150a8ce531..68d66fc444 100755 --- a/modules/gerrit/files/patchset-created +++ b/modules/gerrit/files/patchset-created @@ -1,3 +1,4 @@ #!/bin/sh python ~/openstack-ci/gerrit/update_blueprint.py patchset-created "$@" +python ~/openstack-ci/gerrit/update_bug.py patchset-created "$@"