diff --git a/git-repository/src/config/snapshot.rs b/git-repository/src/config/snapshot.rs index 0dbbc83d409..0f1358c54d7 100644 --- a/git-repository/src/config/snapshot.rs +++ b/git-repository/src/config/snapshot.rs @@ -83,7 +83,7 @@ impl<'repo> Snapshot<'repo> { /// pub mod apply_cli_overrides { - use crate::bstr::{BString, ByteSlice}; + use crate::bstr::{BStr, BString, ByteSlice}; use crate::config::SnapshotMut; use std::convert::TryFrom; @@ -105,13 +105,13 @@ pub mod apply_cli_overrides { impl SnapshotMut<'_> { /// Apply configuration values of the form `core.abbrev=5` or `remote.origin.url = foo` or `core.bool-implicit-true` /// to the repository configuration, marked with [source CLI][git_config::Source::Cli]. - pub fn apply_cli_overrides( + pub fn apply_cli_overrides<'a>( &mut self, - values: impl IntoIterator>, + values: impl IntoIterator>, ) -> Result<(), Error> { let mut file = git_config::File::new(git_config::file::Metadata::from(git_config::Source::Cli)); for key_value in values { - let key_value = key_value.into(); + let key_value = key_value.as_ref(); let mut tokens = key_value.splitn(2, |b| *b == b'=').map(|v| v.trim()); let key = tokens.next().expect("always one value").as_bstr(); let value = tokens.next(); diff --git a/gitoxide-core/src/repository/config.rs b/gitoxide-core/src/repository/config.rs index a179e2c1db2..8dc4680ee25 100644 --- a/gitoxide-core/src/repository/config.rs +++ b/gitoxide-core/src/repository/config.rs @@ -1,18 +1,21 @@ use anyhow::{bail, Result}; use git_repository as git; +use git_repository::bstr::BString; use crate::OutputFormat; pub fn list( repo: git::Repository, filters: Vec, + overrides: Vec, format: OutputFormat, mut out: impl std::io::Write, ) -> Result<()> { if format != OutputFormat::Human { bail!("Only human output format is supported at the moment"); } - let repo = git::open_opts(repo.git_dir(), repo.open_options().clone().lossy_config(false))?; + let mut repo = git::open_opts(repo.git_dir(), repo.open_options().clone().lossy_config(false))?; + repo.config_snapshot_mut().apply_cli_overrides(overrides.into_iter())?; let config = repo.config_snapshot(); let config = config.plumbing(); if let Some(frontmatter) = config.frontmatter() { diff --git a/src/plumbing/main.rs b/src/plumbing/main.rs index b3d51c10f4c..225469c8479 100644 --- a/src/plumbing/main.rs +++ b/src/plumbing/main.rs @@ -62,20 +62,24 @@ pub fn main() -> Result<()> { Strict, Lenient, } - let repository = move |mode: Mode| -> Result { - let mut mapping: git::sec::trust::Mapping = Default::default(); - let toggle = matches!(mode, Mode::Strict); - mapping.full = mapping.full.strict_config(toggle); - mapping.reduced = mapping.reduced.strict_config(toggle); - let mut repo = git::ThreadSafeRepository::discover_opts(repository, Default::default(), mapping) - .map(git::Repository::from) - .map(|r| r.apply_environment())?; - if !config.is_empty() { - repo.config_snapshot_mut() - .apply_cli_overrides(config) - .context("Unable to parse command-line configuration")?; + + let repository = { + let config = config.clone(); + move |mode: Mode| -> Result { + let mut mapping: git::sec::trust::Mapping = Default::default(); + let toggle = matches!(mode, Mode::Strict); + mapping.full = mapping.full.strict_config(toggle); + mapping.reduced = mapping.reduced.strict_config(toggle); + let mut repo = git::ThreadSafeRepository::discover_opts(repository, Default::default(), mapping) + .map(git::Repository::from) + .map(|r| r.apply_environment())?; + if !config.is_empty() { + repo.config_snapshot_mut() + .apply_cli_overrides(config.iter()) + .context("Unable to parse command-line configuration")?; + } + Ok(repo) } - Ok(repo) }; let progress; @@ -142,7 +146,9 @@ pub fn main() -> Result<()> { progress, progress_keep_open, None, - move |_progress, out, _err| core::repository::config::list(repository(Mode::Lenient)?, filter, format, out), + move |_progress, out, _err| { + core::repository::config::list(repository(Mode::Lenient)?, filter, config, format, out) + }, ) .map(|_| ()), Subcommands::Free(subcommands) => match subcommands {