#!/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. 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): allowlisted = "\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 """ % ( allowlisted, 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") creationflags = 0 if platform.system() == "Windows": creationflags = subprocess.CREATE_NEW_PROCESS_GROUP subprocess2.Popen( [sys.executable, UPLOADER] + sys.argv[1:], stdout=devnull, stderr=devnull, creationflags=creationflags, ) if __name__ == "__main__": sys.exit(main())