From 07cfe8bbba0851ff4989f6aaf082d72130cd0f5b Mon Sep 17 00:00:00 2001 From: Christian Duerr Date: Mon, 23 Nov 2020 21:37:34 +0000 Subject: [PATCH] Add support for '~/' in config imports This allows the configuration file imports to start with '~/' and resolve relative to the user's home directory. There is no support for '~user/' or '$HOME/' or any other shell expansion. However since paths relative to the home directory should be sufficient for everything, this provides a very simple solution without any significant drawbacks. Fixes #4157. --- CHANGELOG.md | 4 ++++ Cargo.lock | 13 +++++++++++-- alacritty.yml | 9 ++++++--- alacritty/Cargo.toml | 4 +--- alacritty/src/config/mod.rs | 7 ++++++- 5 files changed, 28 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e655e9f0..a870d9c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## 0.7.0-dev +### Added + +- Support for `~/` at the beginning of configuration file imports + ### Changed - Nonexistent config imports are ignored instead of raising an error diff --git a/Cargo.lock b/Cargo.lock index 1eddd108..9c8c1cf1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -30,7 +30,7 @@ dependencies = [ "clap", "copypasta", "crossfont", - "dirs", + "dirs 3.0.1", "embed-resource", "fnv", "gl_generator", @@ -595,6 +595,15 @@ dependencies = [ "dirs-sys", ] +[[package]] +name = "dirs" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "142995ed02755914747cc6ca76fc7e4583cd18578746716d0508ea6ed558b9ff" +dependencies = [ + "dirs-sys", +] + [[package]] name = "dirs-sys" version = "0.3.5" @@ -2043,7 +2052,7 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76971977e6121664ec1b960d1313aacfa75642adc93b9d4d53b247bd4cb1747e" dependencies = [ - "dirs", + "dirs 2.0.2", "fnv", "nom", "phf", diff --git a/alacritty.yml b/alacritty.yml index cdad3fe1..3c6d18ec 100644 --- a/alacritty.yml +++ b/alacritty.yml @@ -2,9 +2,12 @@ # Import additional configuration files # -# These configuration files will be loaded in order, replacing values in files -# loaded earlier with those loaded later in the chain. The file itself will -# always be loaded last. If an import path cannot be found it will be skipped. +# Imports are loaded in order, skipping all missing files, with the importing +# file being loaded last. If a field is already present in a previous import, it +# will be replaced. +# +# All imports must either be absolute paths starting with `/`, or paths relative +# to the user's home directory starting with `~/`. #import: # - /path/to/alacritty.yml diff --git a/alacritty/Cargo.toml b/alacritty/Cargo.toml index 081ea4dc..2c94093d 100644 --- a/alacritty/Cargo.toml +++ b/alacritty/Cargo.toml @@ -30,6 +30,7 @@ copypasta = { version = "0.7.0", default-features = false } libc = "0.2" unicode-width = "0.1" bitflags = "1" +dirs = "2.0.2" [build-dependencies] gl_generator = "0.14.0" @@ -43,9 +44,6 @@ image = { version = "0.23.3", default-features = false, features = ["ico"], opti [target.'cfg(target_os = "macos")'.dependencies] objc = "0.2.2" -[target.'cfg(any(target_os = "macos", windows))'.dependencies] -dirs = "2.0.2" - [target.'cfg(not(any(target_os="windows", target_os="macos")))'.dependencies] x11-dl = { version = "2", optional = true } wayland-client = { version = "0.28.0", features = ["dlopen"], optional = true } diff --git a/alacritty/src/config/mod.rs b/alacritty/src/config/mod.rs index d24e8519..f9ee3528 100644 --- a/alacritty/src/config/mod.rs +++ b/alacritty/src/config/mod.rs @@ -211,7 +211,7 @@ fn load_imports(config: &Value, config_paths: &mut Vec, recursion_limit let mut merged = Value::Null; for import in imports { - let path = match import { + let mut path = match import { Value::String(path) => PathBuf::from(path), _ => { error!( @@ -222,6 +222,11 @@ fn load_imports(config: &Value, config_paths: &mut Vec, recursion_limit }, }; + // Resolve paths relative to user's home directory. + if let (Ok(stripped), Some(home_dir)) = (path.strip_prefix("~/"), dirs::home_dir()) { + path = home_dir.join(stripped); + } + if !path.exists() { info!(target: LOG_TARGET_CONFIG, "Skipping importing config; not found:"); info!(target: LOG_TARGET_CONFIG, " {:?}", path.display());