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/CHANGELOG.md b/CHANGELOG.md index 77119fe..4a1a66f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## [Unreleased] + +### Fixed +- Git local config is now looked up. (#20) +- Git global config will not be polluted in test by default. (#20) + ## [0.3.0] - 2024-12-02 ### Added diff --git a/tests/cli.rs b/tests/cli.rs index 5041385..06e3890 100644 --- a/tests/cli.rs +++ b/tests/cli.rs @@ -4,23 +4,58 @@ 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<()> { - 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")) { + /// This function will return an error if it failed to get git global config and environment + /// variable [XDBM_ENABLE_OVERWRITE_GITCONFIG](`IS_GIT_CONFIG_WRITABLE`) is not set. + fn setup_gitconfig() -> Result<()> { + 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(()), }; @@ -34,16 +69,13 @@ mod integrated_test { .as_bytes(), )?; - eprintln!("{:?}", fs::read_dir(path)?.collect::>()); - eprintln!("{:?}", fs::read_dir(git_dir)?.collect::>()); - Ok(()) } #[test] fn single_device() -> Result<()> { let config_dir = assert_fs::TempDir::new()?; - setup_gitconfig(&config_dir)?; + setup_gitconfig()?; // init let mut cmd = Command::cargo_bin("xdbm")?; cmd.arg("-c") @@ -139,7 +171,7 @@ mod integrated_test { fn two_devices_with_same_name() -> Result<()> { // 1st device let config_dir_1 = assert_fs::TempDir::new()?; - setup_gitconfig(&config_dir_1)?; + setup_gitconfig()?; let mut cmd1 = Command::cargo_bin("xdbm")?; cmd1.arg("-c") .arg(config_dir_1.path()) @@ -172,7 +204,7 @@ mod integrated_test { // 2nd device let config_dir_2 = assert_fs::TempDir::new()?; - setup_gitconfig(&config_dir_2)?; + setup_gitconfig()?; let mut cmd2 = Command::cargo_bin("xdbm")?; cmd2.arg("-c") .arg(config_dir_2.path()) @@ -188,7 +220,7 @@ mod integrated_test { fn directory_without_parent() -> Result<()> { // 1st device let config_dir_1 = assert_fs::TempDir::new()?; - setup_gitconfig(&config_dir_1)?; + setup_gitconfig()?; let mut cmd1 = Command::cargo_bin("xdbm")?; cmd1.arg("-c") .arg(config_dir_1.path()) @@ -223,7 +255,7 @@ mod integrated_test { // // devices: first let config_dir_1 = assert_fs::TempDir::new()?; - setup_gitconfig(&config_dir_1)?; + setup_gitconfig()?; let mut cmd1 = Command::cargo_bin("xdbm")?; cmd1.arg("-c") .arg(config_dir_1.path()) @@ -257,7 +289,7 @@ mod integrated_test { // // devices: first, second let config_dir_2 = assert_fs::TempDir::new()?; - setup_gitconfig(&config_dir_2)?; + setup_gitconfig()?; let mut cmd2 = Command::cargo_bin("xdbm")?; cmd2.arg("-c") .arg(config_dir_2.path())