From 1891e222c34b430c569b451e4da699b413dce95c Mon Sep 17 00:00:00 2001 From: qwjyh Date: Sun, 9 Feb 2025 08:08:29 +0900 Subject: [PATCH] fix(CI): add env var to allow setting git global config --- .github/workflows/rust.yml | 1 + tests/cli.rs | 58 +++++++++++++++++++++++++++----------- 2 files changed, 42 insertions(+), 17 deletions(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 7cee19b..c307ec5 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -8,6 +8,7 @@ on: env: CARGO_TERM_COLOR: always + XDBM_ENABLE_OVERWRITE_GITCONFIG: true jobs: build-and-lint: diff --git a/tests/cli.rs b/tests/cli.rs index da2eaca..dc6337b 100644 --- a/tests/cli.rs +++ b/tests/cli.rs @@ -4,30 +4,57 @@ mod integrated_test { io::{self, BufWriter, Write}, }; - use anyhow::{Ok, Result}; + use anyhow::{anyhow, Context, Ok, Result}; use assert_cmd::{assert::OutputAssertExt, Command}; use git2::Repository; - use log::trace; + use log::{debug, trace}; use predicates::{boolean::PredicateBooleanExt, prelude::predicate}; + const IS_GIT_CONFIG_WRITABLE: &str = "XDBM_ENABLE_OVERWRITE_GITCONFIG"; + /// Setup global gitconfig if it doesn't exist. /// /// # Errors /// /// This function will return an error if it failed to get home directory. fn setup_gitconfig(path: &std::path::Path) -> Result<()> { - eprintln!("{:?}", git2::Config::find_global()); - eprintln!( - "{:?}", - git2::Config::open_default() - .expect("failed to get default") - .get_string("user.name") - ); - let git_dir = path.join(".git"); - if !git_dir.exists() { - fs::DirBuilder::new().create(git_dir.clone())? - } - let f = match File::create_new(git_dir.join("config")) { + let config = git2::Config::open_default().expect("failed to get default"); + if config.get_string("user.name").is_ok() && config.get_string("user.email").is_ok() { + return Ok(()); + }; + + match std::env::var_os(IS_GIT_CONFIG_WRITABLE) { + Some(_) => { + debug!( + "global git config not found & env var `{}` found", + IS_GIT_CONFIG_WRITABLE + ); + } + None => { + eprintln!("Failed to get git global config"); + eprintln!( + "Set env var `{}` to set automatically (mainly for CI)", + IS_GIT_CONFIG_WRITABLE + ); + return Err(anyhow!("failed to get git global config")); + } + }; + + let config_file = git2::Config::find_global().map_or_else( + |e| { + trace!("global git config file not found: {e:?}"); + Ok(dirs::home_dir() + .context("Failed to get home dir")? + .join(".gitconfig")) + }, + Ok, + )?; + let f = match File::options() + .create(true) + .truncate(true) + .write(true) + .open(config_file) + { io::Result::Ok(f) => f, io::Result::Err(_err) => return Ok(()), }; @@ -41,9 +68,6 @@ mod integrated_test { .as_bytes(), )?; - eprintln!("{:?}", fs::read_dir(path)?.collect::>()); - eprintln!("{:?}", fs::read_dir(git_dir)?.collect::>()); - Ok(()) }