Skip to content

Commit

Permalink
Added config option. (#1324)
Browse files Browse the repository at this point in the history
* feat: Added config option.
  • Loading branch information
ShogunPanda authored Mar 5, 2023
1 parent 5e4faab commit 3a09926
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 3 deletions.
32 changes: 31 additions & 1 deletion src/cli.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,23 @@ A feature name may not contain whitespace. You can activate multiple features:
If more than one feature sets the same option, the last one wins.
If an option is present in the [delta] section, then features are not considered at all.
If you want an option to be fully overridable by a feature and also have a non default value when
no features are used, then you need to define a \"default\" feature and include it in the main
delta configuration.
For instance:
[delta]
feature = default-feature
[delta \"default-feature\"]
width = 123
At this point, you can override features set in the command line or in the environment variables
and the \"last one wins\" rules will apply as expected.
STYLES
------
Expand Down Expand Up @@ -276,6 +293,10 @@ pub struct Opt {
/// intended for other tools that use delta.
pub color_only: bool,

#[arg(long = "config", default_value = "", value_name = "PATH")]
/// Load the config file at PATH instead of ~/.gitconfig.
pub config: String,

#[arg(
long = "commit-decoration-style",
default_value = "",
Expand Down Expand Up @@ -1135,7 +1156,16 @@ impl Opt {
git_config: Option<GitConfig>,
assets: HighlightingAssets,
) -> Self {
Self::from_clap_and_git_config(env, Self::command().get_matches(), git_config, assets)
let mut final_config = git_config;
let matches = Self::command().get_matches();

if let Some(path) = matches.get_one::<String>("config") {
if !path.is_empty() {
final_config = Some(GitConfig::try_create_from_path(&env, path));
}
}

Self::from_clap_and_git_config(env, matches, final_config, assets)
}

pub fn from_iter_and_git_config<I>(
Expand Down
31 changes: 30 additions & 1 deletion src/git_config/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ pub use git_config_entry::{GitConfigEntry, GitRemoteRepo};
use crate::env::DeltaEnv;
use regex::Regex;
use std::collections::HashMap;
#[cfg(test)]
use std::path::Path;
use std::str::FromStr;

Expand Down Expand Up @@ -65,11 +64,41 @@ impl GitConfig {
}
}

#[cfg(not(test))]
pub fn try_create_from_path(env: &DeltaEnv, path: &String) -> Self {
use crate::fatal;

let config = git2::Config::open(Path::new(path));

match config {
Ok(mut config) => {
let config = config.snapshot().unwrap_or_else(|err| {
fatal(format!("Failed to read git config: {err}"));
});

Self {
config,
config_from_env_var: parse_config_from_env_var(env),
repo: None,
enabled: true,
}
}
Err(e) => {
fatal(format!("Failed to read git config: {}", e.message()));
}
}
}

#[cfg(test)]
pub fn try_create(_env: &DeltaEnv) -> Option<Self> {
unreachable!("GitConfig::try_create() is not available when testing");
}

#[cfg(test)]
pub fn try_create_from_path(_env: &DeltaEnv, _path: &String) -> Self {
unreachable!("GitConfig::try_create_from_path() is not available when testing");
}

#[cfg(test)]
pub fn from_path(env: &DeltaEnv, path: &Path, honor_env_var: bool) -> Self {
Self {
Expand Down
2 changes: 1 addition & 1 deletion src/options/get.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ use ProvenancedOptionValue::*;
// Look up a value of type `T` associated with `option name`. The search rules are:
//
// 1. If there is a value associated with `option_name` in the main [delta] git config
// section, then stop searching and return that value.
// section, then stop searching and return that value (steps 2 and 3 are not executed at all).
//
// 2. For each feature in the ordered list of enabled features:
//
Expand Down
1 change: 1 addition & 0 deletions src/options/set.rs
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ pub fn set_options(
blame_timestamp_format,
blame_timestamp_output_format,
color_only,
config,
commit_decoration_style,
commit_regex,
commit_style,
Expand Down

0 comments on commit 3a09926

Please sign in to comment.