From 051bf66f9a9a17be7ebcfb4589591c93ed55bd74 Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Sat, 1 Mar 2025 01:54:31 -0600 Subject: [PATCH] scripts: Tried to handle -d/--diff results consistently With this, we apply the same result modifiers (exprs/defines/hot/etc) to both the input results and -d/--diff results. So if both start with the same format, diffing/hotifying/etc should work as expected. This is really the only way I can seen -d/--diff results working with result modifiers in a way that makes sense. The downside of this is that you can't save results with some complex operation applied, and then diff while applying the same operation, since most of the newer operations (hotify) are _not_ idempotent. Fortunately the two alternatives are not unreasonable: 1. Save results _without_ the operation applied, since the operation will be applied to both the input and diff results. This is a bit asymmetric, but should work. 2. Apply the operation to the input and then pipe to csv.py for diffing. This used to "just work" when we did _not_ apply operations to output csv/json, but this was really just equivalent to 1.. I think the moral of the story is you can solve any problem with enough chained csv.py calls. --- scripts/code.py | 11 +++++++---- scripts/cov.py | 11 +++++++---- scripts/csv.py | 43 ++++++++++++++++++++++++++++++++----------- scripts/ctx.py | 18 +++++++++++++----- scripts/data.py | 11 +++++++---- scripts/perf.py | 17 +++++++++++++---- scripts/perfbd.py | 17 +++++++++++++---- scripts/stack.py | 17 +++++++++++++---- scripts/structs.py | 17 +++++++++++++---- 9 files changed, 118 insertions(+), 44 deletions(-) diff --git a/scripts/code.py b/scripts/code.py index 7cc06958..f2a1a5d5 100755 --- a/scripts/code.py +++ b/scripts/code.py @@ -801,10 +801,13 @@ def table(Result, results, diff_results=None, *, # figure out a good label if labels is not None: - label = ','.join(str(getattr(r, k) - if getattr(r, k) is not None - else '') - for k in labels) + label = next( + ','.join(str(getattr(r_, k) + if getattr(r_, k) is not None + else '') + for k in labels) + for r_ in [r, diff_r] + if r_ is not None) else: label = name diff --git a/scripts/cov.py b/scripts/cov.py index 48f23bd5..f512462c 100755 --- a/scripts/cov.py +++ b/scripts/cov.py @@ -662,10 +662,13 @@ def table(Result, results, diff_results=None, *, # figure out a good label if labels is not None: - label = ','.join(str(getattr(r, k) - if getattr(r, k) is not None - else '') - for k in labels) + label = next( + ','.join(str(getattr(r_, k) + if getattr(r_, k) is not None + else '') + for k in labels) + for r_ in [r, diff_r] + if r_ is not None) else: label = name diff --git a/scripts/csv.py b/scripts/csv.py index ce73603d..4d0919b5 100755 --- a/scripts/csv.py +++ b/scripts/csv.py @@ -1338,7 +1338,7 @@ def openio(path, mode='r', buffering=-1): else: return open(path, mode, buffering) -def collect(csv_paths, *, +def collect_csv(csv_paths, *, depth=1, children=None, notes=None, @@ -1944,10 +1944,13 @@ def table(Result, results, diff_results=None, *, # figure out a good label if labels is not None: - label = ','.join(str(getattr(r, k) - if getattr(r, k) is not None - else '') - for k in labels) + label = next( + ','.join(str(getattr(r_, k) + if getattr(r_, k) is not None + else '') + for k in labels) + for r_ in [r, diff_r] + if r_ is not None) else: label = name @@ -2221,7 +2224,7 @@ def main(csv_paths, *, sys.exit(1) # collect info - fields_, results = collect(csv_paths, + fields_, results = collect_csv(csv_paths, depth=depth, children=children, notes=notes, @@ -2229,7 +2232,7 @@ def main(csv_paths, *, else: # use is just an alias but takes priority - fields_, results = collect([args['use']], + fields_, results = collect_csv([args['use']], depth=depth, children=children, notes=notes, @@ -2307,21 +2310,39 @@ def main(csv_paths, *, # find previous results? diff_results = None if args.get('diff') or args.get('percent'): + # note! don't use read_csv here + # + # it's tempting now that we have a Result type, but we want to + # make sure all the defines/exprs/mods/etc are evaluated in the + # same order try: - diff_results = read_csv( - args.get('diff') or args.get('percent'), - Result, + _, diff_results = collect_csv( + [args.get('diff') or args.get('percent')], depth=depth, + children=children, + notes=notes, **args) except FileNotFoundError: diff_results = [] + # homogenize + diff_results = homogenize(Result, diff_results, + enumerates=enumerates, + defines=defines, + depth=depth) + # fold diff_results = fold(Result, diff_results, by=by, - defines=defines, depth=depth) + # hotify? + if hot: + diff_results = hotify(Result, diff_results, + enumerates=enumerates, + depth=depth, + hot=hot) + # print table if not args.get('quiet'): table(Result, results, diff_results, diff --git a/scripts/ctx.py b/scripts/ctx.py index c85d4152..5d2b6060 100755 --- a/scripts/ctx.py +++ b/scripts/ctx.py @@ -995,7 +995,6 @@ def table(Result, results, diff_results=None, *, def table_recurse(results_, diff_results_, depth_, prefixes=('', '', '', '')): - # build the children table at each layer table_ = { ','.join(str(getattr(r, k) @@ -1060,10 +1059,13 @@ def table(Result, results, diff_results=None, *, # figure out a good label if labels is not None: - label = ','.join(str(getattr(r, k) - if getattr(r, k) is not None - else '') - for k in labels) + label = next( + ','.join(str(getattr(r_, k) + if getattr(r_, k) is not None + else '') + for k in labels) + for r_ in [r, diff_r] + if r_ is not None) else: label = name @@ -1337,6 +1339,12 @@ def main(obj_paths, *, defines=defines, depth=depth) + # hotify? + if hot: + diff_results = hotify(CtxResult, diff_results, + depth=depth, + hot=hot) + # print table if not args.get('quiet'): table(CtxResult, results, diff_results, diff --git a/scripts/data.py b/scripts/data.py index a1cbc573..bcab260c 100755 --- a/scripts/data.py +++ b/scripts/data.py @@ -801,10 +801,13 @@ def table(Result, results, diff_results=None, *, # figure out a good label if labels is not None: - label = ','.join(str(getattr(r, k) - if getattr(r, k) is not None - else '') - for k in labels) + label = next( + ','.join(str(getattr(r_, k) + if getattr(r_, k) is not None + else '') + for k in labels) + for r_ in [r, diff_r] + if r_ is not None) else: label = name diff --git a/scripts/perf.py b/scripts/perf.py index fde71e8d..96861330 100755 --- a/scripts/perf.py +++ b/scripts/perf.py @@ -1163,10 +1163,13 @@ def table(Result, results, diff_results=None, *, # figure out a good label if labels is not None: - label = ','.join(str(getattr(r, k) - if getattr(r, k) is not None - else '') - for k in labels) + label = next( + ','.join(str(getattr(r_, k) + if getattr(r_, k) is not None + else '') + for k in labels) + for r_ in [r, diff_r] + if r_ is not None) else: label = name @@ -1557,6 +1560,12 @@ def report(perf_paths, *, defines=defines, depth=depth) + # hotify? + if hot: + diff_results = hotify(PerfResult, diff_results, + depth=depth, + hot=hot) + # print table if not args.get('quiet'): if (args.get('annotate') diff --git a/scripts/perfbd.py b/scripts/perfbd.py index 8408c169..d81ee937 100755 --- a/scripts/perfbd.py +++ b/scripts/perfbd.py @@ -1133,10 +1133,13 @@ def table(Result, results, diff_results=None, *, # figure out a good label if labels is not None: - label = ','.join(str(getattr(r, k) - if getattr(r, k) is not None - else '') - for k in labels) + label = next( + ','.join(str(getattr(r_, k) + if getattr(r_, k) is not None + else '') + for k in labels) + for r_ in [r, diff_r] + if r_ is not None) else: label = name @@ -1554,6 +1557,12 @@ def report(paths, *, defines=defines, depth=depth) + # hotify? + if hot: + diff_results = hotify(PerfBdResult, diff_results, + depth=depth, + hot=hot) + # print table if not args.get('quiet'): if (args.get('annotate') diff --git a/scripts/stack.py b/scripts/stack.py index c1a28fb9..e9c16903 100755 --- a/scripts/stack.py +++ b/scripts/stack.py @@ -805,10 +805,13 @@ def table(Result, results, diff_results=None, *, # figure out a good label if labels is not None: - label = ','.join(str(getattr(r, k) - if getattr(r, k) is not None - else '') - for k in labels) + label = next( + ','.join(str(getattr(r_, k) + if getattr(r_, k) is not None + else '') + for k in labels) + for r_ in [r, diff_r] + if r_ is not None) else: label = name @@ -1082,6 +1085,12 @@ def main(ci_paths, defines=defines, depth=depth) + # hotify? + if hot: + diff_results = hotify(StackResult, diff_results, + depth=depth, + hot=hot) + # print table if not args.get('quiet'): table(StackResult, results, diff_results, diff --git a/scripts/structs.py b/scripts/structs.py index c52c50a2..74c3b3dd 100755 --- a/scripts/structs.py +++ b/scripts/structs.py @@ -879,10 +879,13 @@ def table(Result, results, diff_results=None, *, # figure out a good label if labels is not None: - label = ','.join(str(getattr(r, k) - if getattr(r, k) is not None - else '') - for k in labels) + label = next( + ','.join(str(getattr(r_, k) + if getattr(r_, k) is not None + else '') + for k in labels) + for r_ in [r, diff_r] + if r_ is not None) else: label = name @@ -1156,6 +1159,12 @@ def main(obj_paths, *, defines=defines, depth=depth) + # hotify? + if hot: + diff_results = hotify(StructResult, diff_results, + depth=depth, + hot=hot) + # print table if not args.get('quiet'): table(StructResult, results, diff_results,