fn watch_bep_json_file()

in agent/src/artifact/upload.rs [49:123]


fn watch_bep_json_file(
    dry: bool,
    debug: bool,
    build_event_json_file: &Path,
    mode: Mode,
    delay: Option<Duration>,
    monitor_flaky_tests: bool,
) -> Result<()> {
    if let Some(delay) = delay {
        sleep(delay);
    }
    let status = ["FAILED", "TIMEOUT", "FLAKY"];
    let mut parser = BepJsonParser::new(build_event_json_file);
    let max_retries = 5;
    let mut retries = max_retries;
    let mut last_offset = 0;
    let mut uploader = Uploader::new();

    'parse_loop: loop {
        match parser.parse() {
            Ok(_) => {
                if parser.offset != last_offset {
                    // We have made progress, reset the retry counter
                    retries = max_retries;
                    last_offset = parser.offset;

                    let local_exec_root = parser.local_exec_root.as_ref().map(|str| Path::new(str));
                    for test_summary in parser
                        .test_summaries
                        .iter()
                        .filter(|test_result| status.contains(&test_result.overall_status.as_str()))
                    {
                        for failed_test in test_summary.failed.iter() {
                            if let Err(error) = upload_test_log(
                                &mut uploader,
                                dry,
                                local_exec_root,
                                &failed_test.uri,
                                mode,
                            ) {
                                error!("{:?}", error);
                            }
                        }
                    }
                    parser.test_summaries.clear();
                }

                if parser.done {
                    break 'parse_loop;
                }
            }
            Err(error) => {
                retries -= 1;
                // Abort since we keep getting errors
                if retries == 0 {
                    return Err(error);
                }

                error!("{:?}", error);
            }
        }

        sleep(Duration::from_secs(1));
    }

    let should_upload_bep_json_file =
        debug || (monitor_flaky_tests && parser.has_overall_test_status("FLAKY"));
    if should_upload_bep_json_file {
        if let Err(error) = upload_bep_json_file(&mut uploader, dry, build_event_json_file, mode) {
            error!("{:?}", error);
        }
    }

    Ok(())
}