diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2024-08-08 22:33:23 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2024-08-08 22:33:23 -0400 |
commit | fd3dc4545d5a6e75897eef5b92c420c6c4f00905 (patch) | |
tree | 096d6194bc52d5cf711c7b29508b5763b0bbe112 | |
parent | afcf019c85279afbd213cf67690cb7bf03f3b0d6 (diff) |
gen-job-list: better error handling fetching remotes
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-rw-r--r-- | src/bin/gen-job-list.rs | 71 |
1 files changed, 36 insertions, 35 deletions
diff --git a/src/bin/gen-job-list.rs b/src/bin/gen-job-list.rs index 3bcf86e..16ab3bd 100644 --- a/src/bin/gen-job-list.rs +++ b/src/bin/gen-job-list.rs @@ -6,7 +6,7 @@ use std::io::prelude::*; use std::path::{Path, PathBuf}; use std::process; use std::process::Stdio; -use ci_cgi::{CiConfig, Userrc, RcTestGroup, ciconfig_read, git_get_commit, commitdir_get_results, lockfile_exists, commit_update_results_from_fs, subtest_full_name, test_stats}; +use ci_cgi::{CiConfig, Userrc, RcTestGroup, ciconfig_read, git_get_commit, commitdir_get_results, lockfile_exists, commit_update_results_from_fs, subtest_full_name, test_stats, users::RcBranch}; use ci_cgi::TestResultsMap; use file_lock::{FileLock, FileOptions}; use memmap::MmapOptions; @@ -236,36 +236,32 @@ fn write_test_jobs(rc: &CiConfig, jobs_in: Vec<TestJob>, verbose: bool) -> anyho } fn fetch_remotes(rc: &CiConfig, repo: &git2::Repository) -> anyhow::Result<bool> { - fn fetch_remotes_locked(rc: &CiConfig, repo: &git2::Repository) -> Result<(), git2::Error> { - for userconfig in rc.users.iter().filter_map(|u| u.1.as_ref().ok()) { - for (branch, branchconfig) in &userconfig.branch { - let fetch = branchconfig.fetch - .split_whitespace() - .map(|i| OsStr::new(i)); - - let status = std::process::Command::new("git") - .arg("-C") - .arg(&rc.ktest.linux_repo) - .arg("fetch") - .args(fetch) - .stdout(Stdio::piped()) - .stderr(Stdio::piped()) - .status() - .expect(&format!("failed to execute fetch")); - if !status.success() { - eprintln!("fetch error for {}: {}", branchconfig.fetch, status); - continue; - } - - let fetch_head = repo.revparse_single("FETCH_HEAD") - .map_err(|e| { eprintln!("error parsing FETCH_HEAD: {}", e); e})? - .peel_to_commit() - .map_err(|e| { eprintln!("error getting FETCH_HEAD: {}", e); e})?; - - repo.branch(branch, &fetch_head, true)?; - } + fn fetch_branch(rc: &CiConfig, repo: &git2::Repository, + branch: &str, branchconfig: &RcBranch) -> Result<(), git2::Error> { + let fetch = branchconfig.fetch + .split_whitespace() + .map(|i| OsStr::new(i)); + + let status = std::process::Command::new("git") + .arg("-C") + .arg(&rc.ktest.linux_repo) + .arg("fetch") + .args(fetch) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .status() + .expect(&format!("failed to execute fetch")); + if !status.success() { + eprintln!("fetch error for {}: {}", branchconfig.fetch, status); + return Ok(()); } + let fetch_head = repo.revparse_single("FETCH_HEAD") + .map_err(|e| { eprintln!("error parsing FETCH_HEAD: {}", e); e})? + .peel_to_commit() + .map_err(|e| { eprintln!("error getting FETCH_HEAD: {}", e); e})?; + + repo.branch(branch, &fetch_head, true)?; Ok(()) } @@ -284,7 +280,11 @@ fn fetch_remotes(rc: &CiConfig, repo: &git2::Repository) -> anyhow::Result<bool> let mut filelock = FileLock::lock(lockfile, false, FileOptions::new().create(true).write(true))?; eprint!("Fetching remotes..."); - fetch_remotes_locked(rc, repo)?; + for userconfig in rc.users.iter().filter_map(|u| u.1.as_ref().ok()) { + for (branch, branchconfig) in &userconfig.branch { + fetch_branch(rc, repo, branch, branchconfig).ok(); + } + } eprintln!(" done"); filelock.file.write_all(b"ok")?; /* update lockfile mtime */ @@ -295,8 +295,8 @@ fn fetch_remotes(rc: &CiConfig, repo: &git2::Repository) -> anyhow::Result<bool> Ok(true) } -fn update_jobs(rc: &CiConfig, repo: &git2::Repository, verbose: bool) -> anyhow::Result<()> { - if !fetch_remotes(rc, repo)? { +fn update_jobs(rc: &CiConfig, args: &Args, repo: &git2::Repository) -> anyhow::Result<()> { + if fetch_remotes(rc, repo).ok() == Some(false) && !args.force_update_jobs { eprintln!("remotes unchanged, skipping updating joblist"); return Ok(()); } @@ -309,7 +309,7 @@ fn update_jobs(rc: &CiConfig, repo: &git2::Repository, verbose: bool) -> anyhow: let filelock = FileLock::lock(lockfile, true, FileOptions::new().create(true).write(true))?; let jobs_in = rc_test_jobs(rc, durations, repo, false); - write_test_jobs(rc, jobs_in, verbose)?; + write_test_jobs(rc, jobs_in, args.verbose)?; drop(filelock); @@ -320,7 +320,8 @@ fn update_jobs(rc: &CiConfig, repo: &git2::Repository, verbose: bool) -> anyhow: #[command(author, version, about, long_about = None)] struct Args { #[arg(short, long)] - verbose: bool, + verbose: bool, + force_update_jobs: bool, } fn main() { @@ -341,7 +342,7 @@ fn main() { } let repo = repo.unwrap(); - if let Err(e) = update_jobs(&rc, &repo, args.verbose) { + if let Err(e) = update_jobs(&rc, &args, &repo) { eprintln!("update_jobs() error: {}", e); } } |