diff --git a/Cargo.lock b/Cargo.lock index 897eeed6b..0a0dd5c29 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2056,7 +2056,6 @@ dependencies = [ "tracing", "version_check", "watchman_client", - "whoami", "winreg", "zstd", ] diff --git a/cli/src/config.rs b/cli/src/config.rs index 7eb77db75..25a4e2495 100644 --- a/cli/src/config.rs +++ b/cli/src/config.rs @@ -438,9 +438,23 @@ pub fn config_from_environment(default_layers: impl IntoIterator ConfigLayer { let mut layer = ConfigLayer::empty(ConfigSource::EnvBase); + // TODO: warn if hostname/username is empty after loading config files? + if let Ok(value) = whoami::fallible::hostname() + .inspect_err(|err| tracing::warn!(?err, "failed to get hostname")) + { + layer.set_value(OP_HOSTNAME, value).unwrap(); + } + if let Ok(value) = whoami::fallible::username() + .inspect_err(|err| tracing::warn!(?err, "failed to get username")) + { + layer.set_value(OP_USERNAME, value).unwrap(); + } if !env::var("NO_COLOR").unwrap_or_default().is_empty() { // "User-level configuration files and per-instance command-line arguments // should override $NO_COLOR." https://no-color.org/ @@ -496,10 +510,10 @@ fn env_overrides_layer() -> ConfigLayer { layer.set_value("debug.operation-timestamp", value).unwrap(); } if let Ok(value) = env::var("JJ_OP_HOSTNAME") { - layer.set_value("operation.hostname", value).unwrap(); + layer.set_value(OP_HOSTNAME, value).unwrap(); } if let Ok(value) = env::var("JJ_OP_USERNAME") { - layer.set_value("operation.username", value).unwrap(); + layer.set_value(OP_USERNAME, value).unwrap(); } if let Ok(value) = env::var("JJ_EDITOR") { layer.set_value("ui.editor", value).unwrap(); diff --git a/cli/tests/test_global_opts.rs b/cli/tests/test_global_opts.rs index 1d1809c22..0301c4c94 100644 --- a/cli/tests/test_global_opts.rs +++ b/cli/tests/test_global_opts.rs @@ -834,9 +834,15 @@ fn test_default_config() { maskable_re.is_match(&hostname) && maskable_re.is_match(&username) }; - let (stdout, stderr) = jj_cmd_ok(test_env.env_root(), &["config", "list"]); - insta::assert_snapshot!(stdout, @""); - insta::assert_snapshot!(stderr, @"Warning: No config to list"); + let (stdout, stderr) = jj_cmd_ok( + test_env.env_root(), + &["config", "list", r#"-Tname ++ "\n""#], + ); + insta::assert_snapshot!(stdout, @r" + operation.hostname + operation.username + "); + insta::assert_snapshot!(stderr, @""); let repo_path = test_env.env_root().join("repo"); let (stdout, stderr) = jj_cmd_ok(test_env.env_root(), &["git", "init", "repo"]); diff --git a/lib/Cargo.toml b/lib/Cargo.toml index ee21c254d..213a52520 100644 --- a/lib/Cargo.toml +++ b/lib/Cargo.toml @@ -74,7 +74,6 @@ tokio = { workspace = true, optional = true } toml_edit = { workspace = true } tracing = { workspace = true } watchman_client = { workspace = true, optional = true } -whoami = { workspace = true } zstd = { workspace = true } [target.'cfg(unix)'.dependencies] diff --git a/lib/src/config/misc.toml b/lib/src/config/misc.toml index d432be25f..2a61500b3 100644 --- a/lib/src/config/misc.toml +++ b/lib/src/config/misc.toml @@ -14,8 +14,8 @@ abandon-unreachable-commits = true # auto-local-bookmark = false [operation] -# hostname = -# username = +hostname = "" +username = "" [signing] backend = "none" diff --git a/lib/src/settings.rs b/lib/src/settings.rs index 5f523e58e..a2cbf889f 100644 --- a/lib/src/settings.rs +++ b/lib/src/settings.rs @@ -152,21 +152,8 @@ impl UserSettings { let operation_timestamp = config .get_value_with("debug.operation-timestamp", to_timestamp) .optional()?; - // Instead of handling environment data here, it might be better to load - // them by CLI and insert as a config layer. - // TODO: warn empty hostname/username by CLI? - let operation_hostname = config - .get("operation.hostname") - .optional()? - .map_or_else(whoami::fallible::hostname, Ok) - .inspect_err(|err| tracing::warn!(?err, "operation.hostname couldn't be set")) - .unwrap_or_default(); - let operation_username = config - .get("operation.username") - .optional()? - .map_or_else(whoami::fallible::username, Ok) - .inspect_err(|err| tracing::warn!(?err, "operation.username couldn't be set")) - .unwrap_or_default(); + let operation_hostname = config.get("operation.hostname")?; + let operation_username = config.get("operation.username")?; let data = UserSettingsData { user_name, user_email,