[Buildroot] [PATCH buildroot-test 4/4] utils/daily-mail: add multiple argument to ease modularity of the script

Victor Huesca victor.huesca at bootlin.com
Mon Jul 8 08:14:06 UTC 2019


Options added:
- Include out-to-date packages
- Specify a custom date instead of today
- Enable/disable a header for tables displayed
- Specify branches to include instead of reading the 'branches' file
- Allow to send emails to developers only / to the maillist only

Signed-off-by: Victor Huesca <victor.huesca at bootlin.com>
---
 utils/daily-mail | 66 +++++++++++++++++++++++++++++++++---------------
 1 file changed, 45 insertions(+), 21 deletions(-)

diff --git a/utils/daily-mail b/utils/daily-mail
index 85a1c4e..9c64645 100755
--- a/utils/daily-mail
+++ b/utils/daily-mail
@@ -14,11 +14,13 @@ from collections import defaultdict
 import json
 from packaging import version
 import re
+import argparse
 
 sys.path.append(os.path.join(localconfig.brbase, "utils"))
 import getdeveloperlib
 
 RE_HASH_40 = re.compile(r'.*[a-fA-F0-9]{40}.*')
+RE_DATE = re.compile(r'^\d\d\d\d-\d\d-\d\d$')
 
 baseurl = "autobuild.buildroot.net"
 http_baseurl = "http://" + baseurl
@@ -237,7 +239,7 @@ def show_outdated(packages, show_orphan=False, show_header=False):
     return contents
 
 # Send the e-mails to the individual developers
-def developers_email(smtp, branches, notifications, datestr, dry_run):
+def developers_email(smtp, branches, notifications, datestr, dry_run, show_header=False):
     for dev, notif in notifications.iteritems():
         to = dev.name
         email_from = localconfig.fromaddr
@@ -265,18 +267,18 @@ def developers_email(smtp, branches, notifications, datestr, dry_run):
 
             if len(archs) != 0:
                 contents += "Build failures related to your architectures:\n\n"
-                contents += show_results(archs, show_status=False, show_orphan=False)
+                contents += show_results(archs, show_status=False, show_orphan=False, show_header=show_header)
                 contents += "\n\n"
             if len(packages) != 0:
                 contents += "Build failures related to your packages:\n\n"
-                contents += show_results(packages, show_status=False, show_orphan=show_orphan)
+                contents += show_results(packages, show_status=False, show_orphan=show_orphan, show_header=show_header)
 
             contents += "\n"
 
         outdated = notif.package_version_notification
         if len(outdated) != 0:
             contents += "Packages you maintain that have a new upstream version:\n\n"
-            contents += show_outdated(outdated, show_orphan=show_orphan)
+            contents += show_outdated(outdated, show_orphan=show_orphan, show_header=show_header)
             contents += '\n'
 
         contents += "-- \n"
@@ -298,11 +300,14 @@ def developers_email(smtp, branches, notifications, datestr, dry_run):
             smtp.sendmail(email_from, to, msg.as_string())
             print "To: %s" % dev.name
 
-def global_email_branch_result(results, results_by_reason, branch):
+def global_email_branch_result(results, results_by_reason, branch, show_header=False):
     contents = "Results for branch '%s'\n" % branch
     contents += "=====================" + "=" * len(branch) + "\n\n"
     contents += "Classification of failures by reason\n"
     contents += "------------------------------------\n\n"
+    if show_header:
+        contents += "{:>30} | {:<2}\n".format('reason', 'n')
+        contents += "{0:-^30}-+-{0:-^2}\n".format('')
     for r in results_by_reason:
         reason = r['reason']
         if len(reason) > 30:
@@ -312,35 +317,37 @@ def global_email_branch_result(results, results_by_reason, branch):
     contents += "\n\n"
     contents += "Detail of failures\n"
     contents += "------------------\n\n"
-    contents += show_results(results, show_status=True, show_orphan=True)
+    contents += show_results(results, show_status=True, show_orphan=True, show_header=show_header)
     contents += "\n"
     return contents
 
 # Send the global e-mail to the mailing list
-def global_email(smtp, results, results_by_reason, datestr, overall, dry_run, outdated=None):
+def global_email(smtp, results, results_by_reason, datestr, overall, outdated, dry_run, show_header=False):
     to = "buildroot at buildroot.org"
     email_from = localconfig.fromaddr
     subject = "[%s] Build results for %s" % (baseurl, datestr)
     contents = "Hello,\n\n"
     contents += "Build statistics for %s\n" % datestr
     contents += "===============================\n\n"
-    contents += "      branch |  OK | NOK | TIM | TOT |\n"
+    contents += "      branch |  OK | NOK | TIM | TOT\n"
+    if show_header:
+        contents += "-------------+-----+-----+-----+-----\n"
     for branch in sorted(overall.iterkeys()):
         stats = overall[branch]
         if stats[3] == 0:
             continue
-        contents += "  %10s | %3d | %3d | %3d | %3d |\n" % \
+        contents += "  %10s | %3d | %3d | %3d | %3d\n" % \
                     (branch, stats[0], stats[1], stats[2], stats[3])
     contents += "\n"
     for branch in results.keys():
         if len(results[branch]) == 0:
             continue
-        contents += global_email_branch_result(results[branch], results_by_reason[branch], branch)
+        contents += global_email_branch_result(results[branch], results_by_reason[branch], branch, show_header=show_header)
     if outdated:
         contents += '\n\n'
         contents += "Packages having a newer version\n"
         contents += "===============================\n\n"
-        contents += show_outdated(outdated, show_orphan=True)    
+        contents += show_outdated(outdated, show_orphan=True, show_header=show_header)
     contents += "\n"
     contents += "-- \n"
     contents += http_baseurl
@@ -413,10 +420,29 @@ def get_outdated_pkg(path):
                         'from': 'MAPPING' if status == 2 else 'NAME' } )
     return sorted(s, key=lambda pkg: pkg['name'])
 
+def parse_args():
+    parser = argparse.ArgumentParser()
+    parser.add_argument('--dry-run', action='store_true', help='Do not send email, only show output')
+    parser.add_argument('--outdated', action='store_true', help='Include outdated packages in emails')
+    parser.add_argument('--date', action='store', help='Use this date instead of today')
+    parser.add_argument('--no-header', dest='header', action='store_false', help='Dont not print header for the different tables')
+    parser.add_argument('--branches', dest='branches', action='store', help='List of branches (comma separated)')
+    group = parser.add_mutually_exclusive_group()
+    group.add_argument('--global-only', dest='dev_email', action='store_false', help='Only send global email')
+    group.add_argument('--dev-only', dest='global_email', action='store_false', help='Only send developers email')
+    args = parser.parse_args()
+    if args.date and not RE_DATE.match(args.date):
+        parser.error('date must be in format YYYY-MM-DD')
+    return args
+
 def __main__():
-    yesterday = date.today() - timedelta(1)
-    yesterday_str = yesterday.strftime('%Y-%m-%d')
-    branches = get_branches()
+    args = parse_args()
+    if not args.date:
+        yesterday = date.today() - timedelta(1)
+        yesterday_str = yesterday.strftime('%Y-%m-%d')
+    else:
+        yesterday_str = args.date
+    branches = get_branches() if not args.branches else args.branches.split(',')
 
     db = _mysql.connect(host=localconfig.host,
                         user=localconfig.user,
@@ -425,17 +451,15 @@ def __main__():
     overall_stats = get_overall_stats(db, yesterday_str, branches)
     results = get_build_results(db, yesterday_str, branches)
     results_by_reason = get_build_results_grouped_by_reason(db, yesterday_str, branches)
-    outdated_pkg = get_outdated_pkg(localconfig.pkg_stats)
+    outdated_pkg = get_outdated_pkg(localconfig.pkg_stats) if args.outdated else []
     notifications = calculate_notifications(results, outdated_pkg)
-    dry_run = False
-    if len(sys.argv) == 2 and sys.argv[1] == "--dry-run":
-        dry_run = True
     smtp = smtplib.SMTP(localconfig.smtphost, localconfig.smtpport)
     smtp.starttls()
     smtp.login(localconfig.smtpuser, localconfig.smtppass)
-    developers_email(smtp, branches, notifications, yesterday_str, dry_run)
-    global_email(smtp, results, results_by_reason, yesterday_str,
-                 overall_stats, dry_run)
+    if args.dev_email:
+        developers_email(smtp, branches, notifications, yesterday_str, args.dry_run, args.header)
+    if args.global_email:
+        global_email(smtp, results, results_by_reason, yesterday_str, overall_stats, outdated_pkg, args.dry_run, args.header)
     smtp.quit()
 
 __main__()
-- 
2.21.0




More information about the buildroot mailing list