#!/usr/bin/env python3 import argparse import csv import logging from pathlib import Path from typing import List, Optional, Tuple # isort: off from github import Github # isort: on from commit_status_helper import get_commit, post_commit_status from get_robot_token import get_best_robot_token from pr_info import PRInfo from report import ERROR, SUCCESS, TestResult, TestResults from s3_helper import S3Helper from upload_result_helper import upload_results def parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser() parser.add_argument("files", nargs="+", type=Path, help="Path to status files") return parser.parse_args() def post_commit_status_from_file(file_path: Path) -> List[str]: with open(file_path, "r", encoding="utf-8") as f: res = list(csv.reader(f, delimiter="\t")) if len(res) < 1: raise Exception(f'Can\'t read from "{file_path}"') if len(res[0]) != 3: raise Exception(f'Can\'t read from "{file_path}"') return res[0] # Returns (is_ok, test_results, error_message) def process_result(file_path: Path) -> Tuple[bool, TestResults, Optional[str]]: test_results = [] # type: TestResults state, report_url, description = post_commit_status_from_file(file_path) prefix = file_path.parent.name if description.strip() in [ "Invalid check_status.tsv", "Not found test_results.tsv", "Empty test_results.tsv", ]: status = ( f'Check failed (Report)' if report_url != "null" else "Check failed" ) return False, [TestResult(f"{prefix}: {description}", status)], "Check failed" is_ok = state == SUCCESS if is_ok and report_url == "null": return is_ok, test_results, None status = ( f'OK: Bug reproduced (Report)' if is_ok else f'Bug is not reproduced (Report)' ) test_results.append(TestResult(f"{prefix}: {description}", status)) return is_ok, test_results, None def process_all_results( file_paths: List[Path], ) -> Tuple[bool, TestResults, Optional[str]]: any_ok = False all_results = [] error = None for status_path in file_paths: is_ok, test_results, error = process_result(status_path) any_ok = any_ok or is_ok if test_results is not None: all_results.extend(test_results) return any_ok and error is None, all_results, error def main(): logging.basicConfig(level=logging.INFO) args = parse_args() status_files = args.files # type: List[Path] check_name_with_group = "Bugfix validate check" is_ok, test_results, error = process_all_results(status_files) description = "" if error: description = error elif not is_ok: description = "Changed tests don't reproduce the bug" pr_info = PRInfo() if not test_results: description = "No results to upload" report_url = "" logging.info("No results to upload") else: report_url = upload_results( S3Helper(), pr_info.number, pr_info.sha, test_results, status_files, check_name_with_group, ) gh = Github(get_best_robot_token(), per_page=100) commit = get_commit(gh, pr_info.sha) post_commit_status( commit, SUCCESS if is_ok else ERROR, report_url, description, check_name_with_group, pr_info, dump_to_file=True, ) if __name__ == "__main__": main()