From d15ea44c8146429ee655b5404c94fa1c5c0e1d9e Mon Sep 17 00:00:00 2001 From: jdx <216188+jdx@users.noreply.github.com> Date: Mon, 5 Feb 2024 11:32:16 -0600 Subject: [PATCH] env-file: add dotenv paths to watch files (#1615) Fixes #1613 --- src/config/mod.rs | 11 ++++++----- src/config/settings.rs | 14 ++++++++++++++ 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/config/mod.rs b/src/config/mod.rs index 2df1ab8df..f5fe94d06 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -108,8 +108,8 @@ impl Config { self.env_with_sources.get_or_try_init(|| { let mut env = self.env_results()?.env.clone(); let settings = Settings::get(); - if let Some(env_file) = &settings.env_file { - match dotenvy::from_filename_iter(env_file) { + for env_file in settings.env_files() { + match dotenvy::from_path_iter(&env_file) { Ok(iter) => { for item in iter { let (k, v) = item.unwrap_or_else(|err| { @@ -331,12 +331,13 @@ impl Config { EnvResults::resolve(&env::PRISTINE_ENV, entries) } - pub fn watch_files(&self) -> eyre::Result> { + pub fn watch_files(&self) -> eyre::Result> { Ok(self .config_files .keys() - .chain(self.env_results()?.env_files.iter()) - .map(|p| p.as_path()) + .map(|p| p.to_path_buf()) + .chain(self.env_results()?.env_files.clone()) + .chain(Settings::get().env_files()) .collect()) } diff --git a/src/config/settings.rs b/src/config/settings.rs index 0fddef0da..748fa8cf5 100644 --- a/src/config/settings.rs +++ b/src/config/settings.rs @@ -13,6 +13,7 @@ use serde::ser::Error; use serde_derive::{Deserialize, Serialize}; use crate::config::{system_config_files, DEFAULT_CONFIG_FILENAMES}; +use crate::file::FindUp; use crate::{config, dirs, env, file}; #[derive(Config, Default, Debug, Clone, Serialize)] @@ -355,6 +356,19 @@ impl Settings { }) } + pub fn env_files(&self) -> Vec { + let mut files = vec![]; + if let Some(cwd) = &*dirs::CWD { + if let Some(env_file) = &self.env_file { + let env_file = env_file.to_string_lossy().to_string(); + for p in FindUp::new(cwd, &[env_file]) { + files.push(p); + } + } + } + files.into_iter().rev().collect() + } + pub fn as_dict(&self) -> eyre::Result { Ok(self.to_string().parse()?) }