diff options
Diffstat (limited to 'python/mozperftest/mozperftest/fzf/preview.py')
-rw-r--r-- | python/mozperftest/mozperftest/fzf/preview.py | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/python/mozperftest/mozperftest/fzf/preview.py b/python/mozperftest/mozperftest/fzf/preview.py new file mode 100644 index 0000000000..d6441becbd --- /dev/null +++ b/python/mozperftest/mozperftest/fzf/preview.py @@ -0,0 +1,90 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +""" +This file is executed by fzf through the command line and needs to +work in a standalone way on any Python 3 environment. + +This is why it alters PATH,making the assumption it's executed +from within a source tree. Do not add dependencies unless they +are in the source tree and added in SEARCH_PATHS. +""" +import argparse +import importlib.util +import json +import sys +from pathlib import Path + +HERE = Path(__file__).parent.resolve() +SRC_ROOT = (HERE / ".." / ".." / ".." / "..").resolve() +# make sure esprima is in the path +SEARCH_PATHS = [ + ("third_party", "python", "esprima"), +] + +for path in SEARCH_PATHS: + path = Path(SRC_ROOT, *path) + if path.exists(): + sys.path.insert(0, str(path)) + + +def get_test_objects(): + """Loads .perftestfuzzy and returns its content. + + The cache file is produced by the main fzf script and is used + as a way to let the preview script grab test_objects from the + mach command + """ + cache_file = Path(Path.home(), ".mozbuild", ".perftestfuzzy") + with cache_file.open() as f: + return json.loads(f.read()) + + +def plain_display(taskfile): + """Preview window display. + + Returns the reST summary for the perf test script. + """ + # Lame way to catch the ScriptInfo class without loading mozperftest + script_info = HERE / ".." / "script.py" + spec = importlib.util.spec_from_file_location( + name="script.py", location=str(script_info) + ) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + ScriptInfo = module.ScriptInfo + + with open(taskfile) as f: + tasklist = [line.strip() for line in f] + + tags, script_name, __, location = tasklist[0].split(" ") + script_path = Path(SRC_ROOT, location, script_name).resolve() + + for ob in get_test_objects(): + if ob["path"] == str(script_path): + print(ScriptInfo(ob["path"])) + return + + +def process_args(args): + """Process preview arguments.""" + argparser = argparse.ArgumentParser() + argparser.add_argument( + "-t", + "--tasklist", + type=str, + default=None, + help="Path to temporary file containing the selected tasks", + ) + return argparser.parse_args(args=args) + + +def main(args=None): + if args is None: + args = sys.argv[1:] + args = process_args(args) + plain_display(args.tasklist) + + +if __name__ == "__main__": + main() |