#!/usr/bin/env python3 # ex:ts=4:sw=4:sts=4:et # -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- # # patchtest: execute all unittest test cases discovered for a single patch # Note that this script is currently under development and has been # hard-coded with default values for testing purposes. This script # should not be used without changing the default recipient, at minimum. # # Copyright (C) 2023 BayLibre Inc. # # SPDX-License-Identifier: GPL-2.0-only # import argparse import boto3 import configparser import mailbox import os import sys greeting = """Thank you for your submission. Patchtest identified one or more issues with the patch. Please see the log below for more information:\n\n---\n""" suggestions = """\n---\n\nPlease address the issues identified and submit a new revision of the patch, or alternatively, reply to this email with an explanation of why the patch format should be accepted. Note that patchtest may report failures in the merge-on-head test for patches that are part of a series if they rely on changes from preceeding entries. If you believe these results are due to an error in patchtest, please submit a bug at https://bugzilla.yoctoproject.org/ (use the 'Patchtest' category under 'Yocto Project Subprojects'). Thank you!""" parser = argparse.ArgumentParser(description="Send patchtest results to a submitter for a given patch") parser.add_argument("-p", "--patch", dest="patch", required=True, help="The patch file to summarize") args = parser.parse_args() if not os.path.exists(args.patch): print(f"Patch '{args.patch}' not found - did you provide the right path?") sys.exit(1) elif not os.path.exists(args.patch + ".testresult"): print(f"Found patch '{args.patch}' but '{args.patch}.testresult' was not present. Have you run patchtest on the patch?") sys.exit(1) result_file = args.patch + ".testresult" result_basename = os.path.basename(args.patch) testresult = None with open(result_file, "r") as f: testresult = f.read() reply_contents = greeting + testresult + suggestions subject_line = f"Patchtest results for {result_basename}" if "FAIL" in testresult: ses_client = boto3.client('ses', region_name='us-west-2') response = ses_client.send_email( Source='patchtest@automation.yoctoproject.org', Destination={ 'ToAddresses': ['test-list@lists.yoctoproject.org'], }, ReplyToAddresses=['test-list@lists.yoctoproject.org'], Message={ 'Subject': { 'Data': subject_line, 'Charset': 'utf-8' }, 'Body': { 'Text': { 'Data': reply_contents, 'Charset': 'utf-8' } } } ) else: print(f"No failures identified for {args.patch}.")