mirror of
https://github.com/sharkdp/bat.git
synced 2025-02-07 13:41:14 +00:00
Merge pull request #1888 from patrickpichler/feature/668/add-systemwide-config
Add systemwide config file support
This commit is contained in:
commit
546dcf6a55
28
.github/workflows/CICD.yml
vendored
28
.github/workflows/CICD.yml
vendored
@ -98,7 +98,7 @@ jobs:
|
|||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
with:
|
with:
|
||||||
command: test
|
command: test
|
||||||
args: --locked --release -- --ignored
|
args: --locked --release --test assets -- --ignored
|
||||||
- name: Syntax highlighting regression test
|
- name: Syntax highlighting regression test
|
||||||
run: tests/syntax-tests/regression_test.sh
|
run: tests/syntax-tests/regression_test.sh
|
||||||
- name: List of languages
|
- name: List of languages
|
||||||
@ -108,6 +108,32 @@ jobs:
|
|||||||
- name: Test custom assets
|
- name: Test custom assets
|
||||||
run: tests/syntax-tests/test_custom_assets.sh
|
run: tests/syntax-tests/test_custom_assets.sh
|
||||||
|
|
||||||
|
test_with_system_config:
|
||||||
|
name: Run tests with system wide configuration
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
steps:
|
||||||
|
- name: Git checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
- name: Prepare environment variables
|
||||||
|
run: |
|
||||||
|
echo "BAT_SYSTEM_CONFIG_PREFIX=$GITHUB_WORKSPACE/tests/examples/system_config" >> $GITHUB_ENV
|
||||||
|
- name: Install Rust toolchain
|
||||||
|
uses: actions-rs/toolchain@v1
|
||||||
|
with:
|
||||||
|
toolchain: stable
|
||||||
|
default: true
|
||||||
|
profile: minimal
|
||||||
|
- name: Build and install bat
|
||||||
|
uses: actions-rs/cargo@v1
|
||||||
|
with:
|
||||||
|
command: install
|
||||||
|
args: --locked --path .
|
||||||
|
- name: Run unit tests
|
||||||
|
uses: actions-rs/cargo@v1
|
||||||
|
with:
|
||||||
|
command: test
|
||||||
|
args: --locked --test system_wide_config -- --ignored
|
||||||
|
|
||||||
documentation:
|
documentation:
|
||||||
name: Documentation
|
name: Documentation
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
## Features
|
## Features
|
||||||
|
|
||||||
- Make the default macOS theme depend on Dark Mode. See #2197, #1746 (@Enselic)
|
- Make the default macOS theme depend on Dark Mode. See #2197, #1746 (@Enselic)
|
||||||
|
- Support for separate system and user config files. See #668 (@patrickpichler)
|
||||||
|
|
||||||
## Bugfixes
|
## Bugfixes
|
||||||
|
|
||||||
|
@ -639,6 +639,10 @@ A default configuration file can be created with the `--generate-config-file` op
|
|||||||
bat --generate-config-file
|
bat --generate-config-file
|
||||||
```
|
```
|
||||||
|
|
||||||
|
There is also now a systemwide configuration file, which is located under `/etc/bat/config` on
|
||||||
|
Linux and Mac OS and `C:\ProgramData\bat\config` on windows. If the system wide configuration
|
||||||
|
file is present, the content of the user configuration will simply be appended to it.
|
||||||
|
|
||||||
### Format
|
### Format
|
||||||
|
|
||||||
The configuration file is a simple list of command line arguments. Use `bat --help` to see a full list of possible options and values. In addition, you can add comments by prepending a line with the `#` character.
|
The configuration file is a simple list of command line arguments. Use `bat --help` to see a full list of possible options and values. In addition, you can add comments by prepending a line with the `#` character.
|
||||||
|
@ -6,6 +6,22 @@ use std::path::PathBuf;
|
|||||||
|
|
||||||
use crate::directories::PROJECT_DIRS;
|
use crate::directories::PROJECT_DIRS;
|
||||||
|
|
||||||
|
#[cfg(not(target_os = "windows"))]
|
||||||
|
const DEFAULT_SYSTEM_CONFIG_PREFIX: &str = "/etc";
|
||||||
|
|
||||||
|
#[cfg(target_os = "windows")]
|
||||||
|
const DEFAULT_SYSTEM_CONFIG_PREFIX: &str = "C:\\ProgramData";
|
||||||
|
|
||||||
|
pub fn system_config_file() -> PathBuf {
|
||||||
|
let folder = option_env!("BAT_SYSTEM_CONFIG_PREFIX").unwrap_or(DEFAULT_SYSTEM_CONFIG_PREFIX);
|
||||||
|
let mut path = PathBuf::from(folder);
|
||||||
|
|
||||||
|
path.push("bat");
|
||||||
|
path.push("config");
|
||||||
|
|
||||||
|
path
|
||||||
|
}
|
||||||
|
|
||||||
pub fn config_file() -> PathBuf {
|
pub fn config_file() -> PathBuf {
|
||||||
env::var("BAT_CONFIG_PATH")
|
env::var("BAT_CONFIG_PATH")
|
||||||
.ok()
|
.ok()
|
||||||
@ -87,11 +103,18 @@ pub fn generate_config_file() -> bat::error::Result<()> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_args_from_config_file() -> Result<Vec<OsString>, shell_words::ParseError> {
|
pub fn get_args_from_config_file() -> Result<Vec<OsString>, shell_words::ParseError> {
|
||||||
Ok(fs::read_to_string(config_file())
|
let mut config = String::new();
|
||||||
.ok()
|
|
||||||
.map(|content| get_args_from_str(&content))
|
if let Ok(c) = fs::read_to_string(system_config_file()) {
|
||||||
.transpose()?
|
config.push_str(&c);
|
||||||
.unwrap_or_default())
|
config.push('\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Ok(c) = fs::read_to_string(config_file()) {
|
||||||
|
config.push_str(&c);
|
||||||
|
}
|
||||||
|
|
||||||
|
get_args_from_str(&config)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_args_from_env_var() -> Option<Result<Vec<OsString>, shell_words::ParseError>> {
|
pub fn get_args_from_env_var() -> Option<Result<Vec<OsString>, shell_words::ParseError>> {
|
||||||
|
@ -22,6 +22,9 @@ use crate::{
|
|||||||
config::{config_file, generate_config_file},
|
config::{config_file, generate_config_file},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#[cfg(feature = "bugreport")]
|
||||||
|
use crate::config::system_config_file;
|
||||||
|
|
||||||
use assets::{assets_from_cache_or_binary, cache_dir, clear_assets, config_dir};
|
use assets::{assets_from_cache_or_binary, cache_dir, clear_assets, config_dir};
|
||||||
use directories::PROJECT_DIRS;
|
use directories::PROJECT_DIRS;
|
||||||
use globset::GlobMatcher;
|
use globset::GlobMatcher;
|
||||||
@ -259,6 +262,7 @@ fn invoke_bugreport(app: &App) {
|
|||||||
"NO_COLOR",
|
"NO_COLOR",
|
||||||
"MANPAGER",
|
"MANPAGER",
|
||||||
]))
|
]))
|
||||||
|
.info(FileContent::new("System Config file", system_config_file()))
|
||||||
.info(FileContent::new("Config file", config_file()))
|
.info(FileContent::new("Config file", config_file()))
|
||||||
.info(FileContent::new(
|
.info(FileContent::new(
|
||||||
"Custom assets metadata",
|
"Custom assets metadata",
|
||||||
|
2
tests/examples/bat.conf
vendored
2
tests/examples/bat.conf
vendored
@ -1,5 +1,5 @@
|
|||||||
# Make sure that the pager gets executed
|
# Make sure that the pager gets executed
|
||||||
--paging=always
|
--paging=always
|
||||||
|
|
||||||
# Output a dummy message for the integration test.
|
# Output a dummy message for the integration test and system wide config test.
|
||||||
--pager="echo dummy-pager-from-config"
|
--pager="echo dummy-pager-from-config"
|
||||||
|
5
tests/examples/system_config/bat/config
vendored
Normal file
5
tests/examples/system_config/bat/config
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# Make sure that the pager gets executed
|
||||||
|
--paging=always
|
||||||
|
|
||||||
|
# Output a dummy message for the integration test.
|
||||||
|
--pager="echo dummy-pager-from-system-config"
|
@ -1,9 +1,7 @@
|
|||||||
use assert_cmd::cargo::CommandCargoExt;
|
|
||||||
use predicates::boolean::PredicateBooleanExt;
|
use predicates::boolean::PredicateBooleanExt;
|
||||||
use predicates::{prelude::predicate, str::PredicateStrExt};
|
use predicates::{prelude::predicate, str::PredicateStrExt};
|
||||||
use serial_test::serial;
|
use serial_test::serial;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::process::Command;
|
|
||||||
use std::str::from_utf8;
|
use std::str::from_utf8;
|
||||||
use tempfile::tempdir;
|
use tempfile::tempdir;
|
||||||
|
|
||||||
@ -28,41 +26,14 @@ mod unix {
|
|||||||
use unix::*;
|
use unix::*;
|
||||||
|
|
||||||
mod utils;
|
mod utils;
|
||||||
|
use utils::command::{bat, bat_with_config};
|
||||||
|
|
||||||
|
#[cfg(unix)]
|
||||||
|
use utils::command::bat_raw_command;
|
||||||
use utils::mocked_pagers;
|
use utils::mocked_pagers;
|
||||||
|
|
||||||
const EXAMPLES_DIR: &str = "tests/examples";
|
const EXAMPLES_DIR: &str = "tests/examples";
|
||||||
|
|
||||||
fn bat_raw_command_with_config() -> Command {
|
|
||||||
let mut cmd = Command::cargo_bin("bat").unwrap();
|
|
||||||
cmd.current_dir("tests/examples");
|
|
||||||
cmd.env_remove("BAT_CACHE_PATH");
|
|
||||||
cmd.env_remove("BAT_CONFIG_DIR");
|
|
||||||
cmd.env_remove("BAT_CONFIG_PATH");
|
|
||||||
cmd.env_remove("BAT_OPTS");
|
|
||||||
cmd.env_remove("BAT_PAGER");
|
|
||||||
cmd.env_remove("BAT_STYLE");
|
|
||||||
cmd.env_remove("BAT_TABS");
|
|
||||||
cmd.env_remove("BAT_THEME");
|
|
||||||
cmd.env_remove("COLORTERM");
|
|
||||||
cmd.env_remove("NO_COLOR");
|
|
||||||
cmd.env_remove("PAGER");
|
|
||||||
cmd
|
|
||||||
}
|
|
||||||
|
|
||||||
fn bat_raw_command() -> Command {
|
|
||||||
let mut cmd = bat_raw_command_with_config();
|
|
||||||
cmd.arg("--no-config");
|
|
||||||
cmd
|
|
||||||
}
|
|
||||||
|
|
||||||
fn bat_with_config() -> assert_cmd::Command {
|
|
||||||
assert_cmd::Command::from_std(bat_raw_command_with_config())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn bat() -> assert_cmd::Command {
|
|
||||||
assert_cmd::Command::from_std(bat_raw_command())
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn basic() {
|
fn basic() {
|
||||||
bat()
|
bat()
|
||||||
|
29
tests/system_wide_config.rs
Normal file
29
tests/system_wide_config.rs
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
use predicates::{prelude::predicate, str::PredicateStrExt};
|
||||||
|
|
||||||
|
mod utils;
|
||||||
|
use utils::command::bat_with_config;
|
||||||
|
|
||||||
|
// This test is ignored, as it needs a special system wide config put into place.
|
||||||
|
// In order to run this tests, use `cargo test --test system_wide_config -- --ignored`
|
||||||
|
#[test]
|
||||||
|
#[ignore]
|
||||||
|
fn use_systemwide_config() {
|
||||||
|
bat_with_config()
|
||||||
|
.arg("test.txt")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout(predicate::eq("dummy-pager-from-system-config\n").normalize());
|
||||||
|
}
|
||||||
|
|
||||||
|
// This test is ignored, as it needs a special system wide config put into place
|
||||||
|
// In order to run this tests, use `cargo test --test system_wide_config -- --ignored`
|
||||||
|
#[test]
|
||||||
|
#[ignore]
|
||||||
|
fn config_overrides_system_config() {
|
||||||
|
bat_with_config()
|
||||||
|
.env("BAT_CONFIG_PATH", "bat.conf")
|
||||||
|
.arg("test.txt")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout(predicate::eq("dummy-pager-from-config\n").normalize());
|
||||||
|
}
|
38
tests/utils/command.rs
Normal file
38
tests/utils/command.rs
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
#![allow(unused)] // Because indirectly included by e.g.integration_tests.rs, but not everything inside is used
|
||||||
|
|
||||||
|
use assert_cmd::cargo::CommandCargoExt;
|
||||||
|
use std::process::Command;
|
||||||
|
|
||||||
|
pub fn bat_raw_command_with_config() -> Command {
|
||||||
|
let mut cmd = Command::cargo_bin("bat").unwrap();
|
||||||
|
cmd.current_dir("tests/examples");
|
||||||
|
cmd.env_remove("BAT_CACHE_PATH");
|
||||||
|
cmd.env_remove("BAT_CONFIG_DIR");
|
||||||
|
cmd.env_remove("BAT_CONFIG_PATH");
|
||||||
|
cmd.env_remove("BAT_OPTS");
|
||||||
|
cmd.env_remove("BAT_PAGER");
|
||||||
|
cmd.env_remove("BAT_STYLE");
|
||||||
|
cmd.env_remove("BAT_TABS");
|
||||||
|
cmd.env_remove("BAT_THEME");
|
||||||
|
cmd.env_remove("COLORTERM");
|
||||||
|
cmd.env_remove("NO_COLOR");
|
||||||
|
cmd.env_remove("PAGER");
|
||||||
|
cmd
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
pub fn bat_raw_command() -> Command {
|
||||||
|
let mut cmd = bat_raw_command_with_config();
|
||||||
|
cmd.arg("--no-config");
|
||||||
|
cmd
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
pub fn bat_with_config() -> assert_cmd::Command {
|
||||||
|
assert_cmd::Command::from_std(bat_raw_command_with_config())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
pub fn bat() -> assert_cmd::Command {
|
||||||
|
assert_cmd::Command::from_std(bat_raw_command())
|
||||||
|
}
|
@ -1,3 +1,5 @@
|
|||||||
|
#![allow(unused)] // Because indirectly included by e.g. system_wide_config.rs, but not used
|
||||||
|
|
||||||
use assert_cmd::Command;
|
use assert_cmd::Command;
|
||||||
use predicates::prelude::predicate;
|
use predicates::prelude::predicate;
|
||||||
use std::env;
|
use std::env;
|
||||||
|
@ -1 +1,2 @@
|
|||||||
|
pub mod command;
|
||||||
pub mod mocked_pagers;
|
pub mod mocked_pagers;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user