| #!/usr/bin/env python3 | 
 | # Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file | 
 | # for details. All rights reserved. Use of this source code is governed by a | 
 | # BSD-style license that can be found in the LICENSE file. | 
 |  | 
 | import utils | 
 |  | 
 | import datetime | 
 | import os | 
 |  | 
 | CHOICES = ["all", "failing", "past-failing", "outstanding"] | 
 | DEFAULT_REPORTS_ROOT = os.path.join(utils.BUILD, "testing-state") | 
 |  | 
 |  | 
 | def set_up_test_state(gradle_args, testing_state_mode, testing_state_path): | 
 |     if not testing_state_mode: | 
 |         return | 
 |     if not testing_state_path: | 
 |         testing_state_path = os.path.join(DEFAULT_REPORTS_ROOT, | 
 |                                           utils.get_HEAD_branch()) | 
 |     testing_state_path = os.path.abspath(testing_state_path) | 
 |     gradle_args.append('-Ptesting-state-mode=%s' % testing_state_mode) | 
 |     gradle_args.append('-Ptesting-state-path=%s' % testing_state_path) | 
 |     prepare_testing_index(testing_state_mode, testing_state_path) | 
 |  | 
 |  | 
 | def fresh_testing_index(testing_state_dir): | 
 |     number = 0 | 
 |     while True: | 
 |         freshIndex = os.path.join(testing_state_dir, "index.%d.html" % number) | 
 |         number += 1 | 
 |         if not os.path.exists(freshIndex): | 
 |             return freshIndex | 
 |  | 
 |  | 
 | def prepare_testing_index(testing_state_mode, testing_state_dir): | 
 |     if not os.path.exists(testing_state_dir): | 
 |         os.makedirs(testing_state_dir) | 
 |     index_path = os.path.join(testing_state_dir, "index.html") | 
 |     parent_report = None | 
 |     resuming = os.path.exists(index_path) | 
 |     mode = testing_state_mode if resuming else f"starting (flag: {testing_state_mode})" | 
 |     if (resuming): | 
 |         parent_report = fresh_testing_index(testing_state_dir) | 
 |         os.rename(index_path, parent_report) | 
 |     index = open(index_path, "a") | 
 |     title = f"Testing: {os.path.basename(testing_state_dir)}" | 
 |     # Print a console link to the test report for easy access. | 
 |     print("=" * 70) | 
 |     print("Test report written to:") | 
 |     print(f"  file://{index_path}") | 
 |     print("=" * 70) | 
 |     # Print the new index content. | 
 |     index.write(f"<html><head><title>{title}</title>") | 
 |     index.write("<style> * { font-family: monospace; }</style>") | 
 |     index.write("<meta http-equiv='refresh' content='10' />") | 
 |     index.write(f"</head><body><h1>{title}</h1>") | 
 |     index.write(f"<h2>Mode: {mode}</h2>") | 
 |     # write index links first to avoid jumping when browsing. | 
 |     if parent_report: | 
 |         index.write( | 
 |             f"<p><a href=\"file://{parent_report}\">Previous result index</a></p>" | 
 |         ) | 
 |     index.write( | 
 |         f"<p><a href=\"file://{index_path}\">Most recent result index</a></p>") | 
 |     index.write( | 
 |         f"<p><a href=\"file://{testing_state_dir}\">Test directories</a></p>") | 
 |     # git branch/hash and diff for future reference | 
 |     index.write(f"<p>Run on: {datetime.datetime.now()}</p>") | 
 |     index.write(f"<p>State path: {testing_state_dir}</p>") | 
 |     index.write(f"<p>Git branch: {utils.get_HEAD_branch()}") | 
 |     index.write(f"</br>Git SHA: {utils.get_HEAD_sha1()}") | 
 |     index.write(f'</br>Git diff summary:\n') | 
 |     index.write( | 
 |         f'<pre style="background-color: lightgray">{utils.get_HEAD_diff_stat()}</pre></p>' | 
 |     ) | 
 |     # header for the failing tests | 
 |     index.write( | 
 |         "<h2>Failing tests (refreshing automatically every 10 seconds)</h2><ul>" | 
 |     ) |