From d99453ebeb970ed493be236def299d1e82b01f83 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Fri, 22 Jul 2022 11:12:07 +0800 Subject: [PATCH] feat: `gix config` lists all entries of all configuration files git considers. (#331) Filters allow to narrow down the output. --- git-repository/src/repository/config.rs | 1 + gitoxide-core/src/repository/config.rs | 18 +++++++++++++++ gitoxide-core/src/repository/mod.rs | 2 ++ src/plumbing/main.rs | 29 ++++++++++++++++--------- src/plumbing/options.rs | 11 ++++++++++ 5 files changed, 51 insertions(+), 10 deletions(-) create mode 100644 gitoxide-core/src/repository/config.rs diff --git a/git-repository/src/repository/config.rs b/git-repository/src/repository/config.rs index 6809d074aa9..dd5cf205356 100644 --- a/git-repository/src/repository/config.rs +++ b/git-repository/src/repository/config.rs @@ -2,6 +2,7 @@ use crate::config; /// Configuration impl crate::Repository { + /// Return /// Return a snapshot of the configuration as seen upon opening the repository. pub fn config_snapshot(&self) -> config::Snapshot<'_> { config::Snapshot { repo: self } diff --git a/gitoxide-core/src/repository/config.rs b/gitoxide-core/src/repository/config.rs new file mode 100644 index 00000000000..60f58632540 --- /dev/null +++ b/gitoxide-core/src/repository/config.rs @@ -0,0 +1,18 @@ +use crate::OutputFormat; +use anyhow::{bail, Result}; +use git_repository as git; + +pub fn list( + repo: git::Repository, + _filters: Vec, + format: OutputFormat, + out: impl std::io::Write, +) -> Result<()> { + if format != OutputFormat::Human { + bail!("Only human output format is supported at the moment"); + } + let config = repo.config_snapshot(); + let config = config.plumbing(); + config.write_to(out)?; + Ok(()) +} diff --git a/gitoxide-core/src/repository/mod.rs b/gitoxide-core/src/repository/mod.rs index d7d620fb28c..71ce148d319 100644 --- a/gitoxide-core/src/repository/mod.rs +++ b/gitoxide-core/src/repository/mod.rs @@ -14,6 +14,8 @@ pub fn init(directory: Option) -> Result Result<()> { })?; match cmd { + Subcommands::Config(config::Platform { filter }) => prepare_and_run( + "config-list", + verbose, + progress, + progress_keep_open, + None, + move |_progress, out, _err| core::repository::config::list(repository()?.into(), filter, format, out), + ) + .map(|_| ()), Subcommands::Free(subcommands) => match subcommands { #[cfg(any(feature = "gitoxide-core-async-client", feature = "gitoxide-core-blocking-client"))] free::Subcommands::Remote(subcommands) => match subcommands { @@ -483,7 +492,7 @@ pub fn main() -> Result<()> { re_encode, }, } => prepare_and_run( - "repository-verify", + "verify", verbose, progress, progress_keep_open, @@ -505,7 +514,7 @@ pub fn main() -> Result<()> { ), Subcommands::Revision(cmd) => match cmd { revision::Subcommands::Explain { spec } => prepare_and_run( - "repository-commit-describe", + "commit-describe", verbose, progress, progress_keep_open, @@ -524,7 +533,7 @@ pub fn main() -> Result<()> { max_candidates, rev_spec, } => prepare_and_run( - "repository-commit-describe", + "commit-describe", verbose, progress, progress_keep_open, @@ -554,7 +563,7 @@ pub fn main() -> Result<()> { recursive, extended, } => prepare_and_run( - "repository-tree-entries", + "tree-entries", verbose, progress, progress_keep_open, @@ -571,7 +580,7 @@ pub fn main() -> Result<()> { }, ), tree::Subcommands::Info { treeish, extended } => prepare_and_run( - "repository-tree-info", + "tree-info", verbose, progress, progress_keep_open, @@ -583,7 +592,7 @@ pub fn main() -> Result<()> { }, Subcommands::Odb(cmd) => match cmd { odb::Subcommands::Entries => prepare_and_run( - "repository-odb-entries", + "odb-entries", verbose, progress, progress_keep_open, @@ -591,7 +600,7 @@ pub fn main() -> Result<()> { move |_progress, out, _err| core::repository::odb::entries(repository()?.into(), format, out), ), odb::Subcommands::Info => prepare_and_run( - "repository-odb-info", + "odb-info", verbose, progress, progress_keep_open, @@ -601,7 +610,7 @@ pub fn main() -> Result<()> { }, Subcommands::Mailmap(cmd) => match cmd { mailmap::Subcommands::Entries => prepare_and_run( - "repository-mailmap-entries", + "mailmap-entries", verbose, progress, progress_keep_open, @@ -615,7 +624,7 @@ pub fn main() -> Result<()> { pathspecs, show_ignore_patterns, } => prepare_and_run( - "repository-exclude-query", + "exclude-query", verbose, progress, progress_keep_open, diff --git a/src/plumbing/options.rs b/src/plumbing/options.rs index 4ccff644cf9..9c49b160544 100644 --- a/src/plumbing/options.rs +++ b/src/plumbing/options.rs @@ -74,11 +74,22 @@ pub enum Subcommands { /// Interact with the exclude files like .gitignore. #[clap(subcommand)] Exclude(exclude::Subcommands), + Config(config::Platform), /// Subcommands that need no git repository to run. #[clap(subcommand)] Free(free::Subcommands), } +pub mod config { + /// Print all entries in a configuration file or access other sub-commands + #[derive(Debug, clap::Parser)] + #[clap(subcommand_required(false))] + pub struct Platform { + /// The filter terms to limit the output to matching sections and values only. + pub filter: Vec, + } +} + pub mod mailmap { #[derive(Debug, clap::Subcommand)] pub enum Subcommands {