From 0ef1f616134b49da619c3c35fbcb92715c001607 Mon Sep 17 00:00:00 2001 From: Lucien Cartier-Tilet Date: Tue, 31 Mar 2026 16:35:38 +0200 Subject: [PATCH] feat(errors): preserve jj-emitted errors when loading config --- src/error.rs | 4 ++-- src/jj/lib_executor.rs | 20 +++++++++++++------- src/main.rs | 2 +- tests/error_tests.rs | 4 +++- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/error.rs b/src/error.rs index c6a1bc7..fadee9a 100644 --- a/src/error.rs +++ b/src/error.rs @@ -18,8 +18,8 @@ pub enum Error { RepositoryLocked, #[error("Could not get current directory")] FailedGettingCurrentDir, - #[error("Could not load Jujutsu configuration")] - FailedReadingConfig, + #[error("Could not load Jujutsu configuration: {context}")] + FailedReadingConfig { context: String }, // Application errors #[error("Operation cancelled by user")] Cancelled, diff --git a/src/jj/lib_executor.rs b/src/jj/lib_executor.rs index db07f51..aa0503f 100644 --- a/src/jj/lib_executor.rs +++ b/src/jj/lib_executor.rs @@ -41,16 +41,22 @@ impl JjLib { let mut config = StackedConfig::with_defaults(); for path in Self::user_config_paths() { if path.is_dir() { - config - .load_dir(ConfigSource::User, &path) - .map_err(|_| Error::FailedReadingConfig)?; + config.load_dir(ConfigSource::User, &path).map_err(|e| { + Error::FailedReadingConfig { + context: e.to_string(), + } + })?; } else if path.exists() { - config - .load_file(ConfigSource::User, path) - .map_err(|_| Error::FailedReadingConfig)?; + config.load_file(ConfigSource::User, path).map_err(|e| { + Error::FailedReadingConfig { + context: e.to_string(), + } + })?; } } - UserSettings::from_config(config).map_err(|_| Error::FailedReadingConfig) + UserSettings::from_config(config).map_err(|e| Error::FailedReadingConfig { + context: e.to_string(), + }) } /// Resolves user config file paths following the same logic as the jj CLI: diff --git a/src/main.rs b/src/main.rs index 0f52dda..c34f42d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -21,7 +21,7 @@ fn error_to_exit_code(error: &Error) -> i32 { Error::InvalidCommitMessage(_) => EXIT_ERROR, Error::NonInteractive => EXIT_ERROR, Error::FailedGettingCurrentDir => EXIT_ERROR, - Error::FailedReadingConfig => EXIT_ERROR, + Error::FailedReadingConfig { .. } => EXIT_ERROR, } } diff --git a/tests/error_tests.rs b/tests/error_tests.rs index 52b2996..773fbc4 100644 --- a/tests/error_tests.rs +++ b/tests/error_tests.rs @@ -20,7 +20,9 @@ fn test_all_error_variants() { }; let _repo_locked = Error::RepositoryLocked; let _failed_dir = Error::FailedGettingCurrentDir; - let _failed_config = Error::FailedReadingConfig; + let _failed_config = Error::FailedReadingConfig { + context: "test".to_string(), + }; // Application errors let cancelled = Error::Cancelled;