#!/usr/bin/env python3 # Copyright 2018 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. from __future__ import print_function import json import os import platform import subprocess import sys import ninjalog_uploader import subprocess2 THIS_DIR = os.path.dirname(__file__) UPLOADER = os.path.join(THIS_DIR, 'ninjalog_uploader.py') CONFIG = os.path.join(THIS_DIR, 'ninjalog.cfg') VERSION = 3 def LoadConfig(): if os.path.isfile(CONFIG): with open(CONFIG, 'r') as f: try: config = json.load(f) except Exception: # Set default value when failed to load config. config = { 'is-googler': ninjalog_uploader.IsGoogler(), 'countdown': 10, 'version': VERSION, } if config['version'] == VERSION: config['countdown'] = max(0, config['countdown'] - 1) return config return { 'is-googler': ninjalog_uploader.IsGoogler(), 'countdown': 10, 'version': VERSION, } def SaveConfig(config): with open(CONFIG, 'w') as f: json.dump(config, f) def ShowMessage(countdown): whitelisted = '\n'.join( [' * %s' % config for config in ninjalog_uploader.ALLOWLISTED_CONFIGS]) print(""" Your ninjalog will be uploaded to build stats server. The uploaded log will be used to analyze user side build performance. The following information will be uploaded with ninjalog. * OS (e.g. Win, Mac or Linux) * number of cpu cores of building machine * build targets (e.g. chrome, browser_tests) * parallelism passed by -j flag * following build configs %s Uploading ninjalog will be started after you run autoninja another %d time(s). If you don't want to upload ninjalog, please run following command. $ python3 %s opt-out If you want to allow upload ninjalog from next autoninja run, please run the following command. $ python3 %s opt-in If you have questions about this, please send mail to infra-dev@chromium.org You can find a more detailed explanation in %s or https://chromium.googlesource.com/chromium/tools/depot_tools/+/main/ninjalog.README.md """ % (whitelisted, countdown, __file__, __file__, os.path.abspath(os.path.join(THIS_DIR, "ninjalog.README.md")))) def main(): config = LoadConfig() if len(sys.argv) == 2 and sys.argv[1] == 'opt-in': config['opt-in'] = True config['countdown'] = 0 SaveConfig(config) print('ninjalog upload is opted in.') return 0 if len(sys.argv) == 2 and sys.argv[1] == 'opt-out': config['opt-in'] = False SaveConfig(config) print('ninjalog upload is opted out.') return 0 if 'opt-in' in config and not config['opt-in']: # Upload is opted out. return 0 if not config.get("is-googler", False): # Not googler. return 0 if config.get("countdown", 0) > 0: # Need to show message. ShowMessage(config["countdown"]) # Only save config if something has meaningfully changed. SaveConfig(config) return 0 if len(sys.argv) == 1: # dry-run for debugging. print("upload ninjalog dry-run") return 0 # Run upload script without wait. devnull = open(os.devnull, "w") creationnflags = 0 if platform.system() == 'Windows': creationnflags = subprocess.CREATE_NEW_PROCESS_GROUP subprocess2.Popen([sys.executable, UPLOADER] + sys.argv[1:], stdout=devnull, stderr=devnull, creationflags=creationnflags) if __name__ == '__main__': sys.exit(main())