Skip to content
Snippets Groups Projects
Commit 04e80b58 authored by Haibo Huang's avatar Haibo Huang Committed by android-build-merger
Browse files

[Updater] Generates change and include in the email am: 39287b12

am: c4fbebee

Change-Id: I5ca296e75f50fa951d82639023d34aabf14e0860
parents 49758a4f c4fbebee
No related branches found
No related tags found
No related merge requests found
......@@ -164,7 +164,12 @@ def update(args):
_do_update(args)
except subprocess.CalledProcessError as err:
msg = _message_for_calledprocesserror(err)
print('{}\n{}'.format(msg, color_string('Failed to upgrade.', 'ERROR')))
print(
'{}\n{}'.format(
msg,
color_string(
'Failed to upgrade.',
'ERROR')))
TMP_BRANCH_NAME = 'tmp_auto_upgrade'
......@@ -192,11 +197,15 @@ def _do_update(args):
if args.branch_and_commit:
msg = 'Upgrade {} to {}\n\nTest: None'.format(
args.path, updater.get_latest_version())
git_utils.add_file(full_path, '*')
git_utils.commit(full_path, msg)
if args.push_change:
git_utils.push(full_path, args.remote_name)
if args.branch_and_commit:
git_utils.checkout(full_path, 'aosp/master')
def parse_args():
"""Parses commandline arguments."""
......
......@@ -15,14 +15,16 @@
Example usage:
external_updater_notifier \
--result_file ~/updater/new_result \
--history ~/updater/history \
--recipients xxx@xxx.xxx
--generate_change \
--recipients xxx@xxx.xxx \
googletest
"""
import argparse
import json
import os
import re
import subprocess
import time
......@@ -32,9 +34,6 @@ def parse_args():
parser = argparse.ArgumentParser(
description='Check updates for third party projects in external/.')
parser.add_argument(
'--result_file',
help='Json check result generated by external updater.')
parser.add_argument(
'--history',
help='Path of history file. If doesn'
......@@ -42,24 +41,39 @@ def parse_args():
parser.add_argument(
'--recipients',
help='Comma separated recipients of notification email.')
parser.add_argument(
'--generate_change',
help='If set, an upgrade change will be uploaded to Gerrit.',
action='store_true', required=False)
parser.add_argument(
'paths', nargs='*',
help='Paths of the project.')
return parser.parse_args()
def _send_email(proj, latest_ver, recipient):
CHANGE_URL_PATTERN = r'(https:\/\/[^\s]*android-review[^\s]*) Upgrade'
CHANGE_URL_RE = re.compile(CHANGE_URL_PATTERN)
def _send_email(proj, latest_ver, recipient, upgrade_log):
print('Sending email for {}: {}'.format(proj, latest_ver))
msg = """New version: {}
msg = "New version: {}".format(latest_ver)
match = CHANGE_URL_RE.search(upgrade_log)
if match is not None:
msg += '\n\nAn upgrade change is generated at:\n{}'.format(
match.group(1))
msg += '\n\n'
msg += upgrade_log
To upgrade:
tools/external_updater/updater.sh update {}""".format(
latest_ver, proj)
subprocess.run(['sendgmr', '--to=' + recipient,
'--subject=' + proj], check=True,
stdout=subprocess.PIPE, stderr=subprocess.PIPE,
input=msg, encoding='ascii')
def _process_results(history, results, recipient):
def _process_results(args, history, results):
for proj, res in results.items():
if 'latest' not in res:
continue
......@@ -69,8 +83,9 @@ def _process_results(history, results, recipient):
continue
proj_history = history.setdefault(proj, {})
if latest_ver not in proj_history:
upgrade_log = _upgrade(proj) if args.generate_change else ""
try:
_send_email(proj, latest_ver, recipient)
_send_email(proj, latest_ver, args.recipients, upgrade_log)
proj_history[latest_ver] = int(time.time())
except subprocess.CalledProcessError as err:
msg = """Failed to send email for {} ({}).
......@@ -79,10 +94,13 @@ stderr: {}""".format(proj, latest_ver, err.stdout, err.stderr)
print(msg)
RESULT_FILE_PATH = '/tmp/update_check_result.json'
def send_notification(args):
"""Compare results and send notification."""
results = {}
with open(args.result_file, 'r') as f:
with open(RESULT_FILE_PATH, 'r') as f:
results = json.load(f)
history = {}
try:
......@@ -91,16 +109,45 @@ def send_notification(args):
except FileNotFoundError:
pass
_process_results(history, results, args.recipients)
_process_results(args, history, results)
with open(args.history, 'w') as f:
json.dump(history, f, sort_keys=True)
def _upgrade(proj):
out = subprocess.run(['out/soong/host/linux-x86/bin/external_updater',
'update', '--branch_and_commit', '--push_change',
proj],
stdout=subprocess.PIPE, stderr=subprocess.PIPE,
cwd=os.environ['ANDROID_BUILD_TOP'])
stdout = out.stdout.decode('utf-8')
stderr = out.stderr.decode('utf-8')
return """
====================
| Debug Info |
====================
-=-=-=-=stdout=-=-=-=-
{}
-=-=-=-=stderr=-=-=-=-
{}
""".format(stdout, stderr)
def _check_updates(args):
subprocess.run(['out/soong/host/linux-x86/bin/external_updater',
'check',
'--json_output', RESULT_FILE_PATH,
'--delay', '0'] + args.paths,
cwd=os.environ['ANDROID_BUILD_TOP'])
def main():
"""The main entry."""
args = parse_args()
_check_updates(args)
send_notification(args)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment