From baa308c09f8177b5fabdaf04777045d241ef7da6 Mon Sep 17 00:00:00 2001 From: Marijan Smetko Date: Sun, 21 Jul 2024 00:48:56 +0200 Subject: [PATCH] Warn user about the working copy when configuring the author --- CHANGELOG.md | 2 + cli/src/commands/config/set.rs | 73 ++++++++++++++++++++++++++++++++-- 2 files changed, 71 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 234d1f1e06..e44f3d7c17 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -105,6 +105,8 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). * `jj describe` can now update the description of multiple commits. +* When reconfiguring the author, warn that the working copy won't be updated + ### Fixed bugs * `jj status` will show different messages in a conflicted tree, depending diff --git a/cli/src/commands/config/set.rs b/cli/src/commands/config/set.rs index 9a6f1bae97..4128ded8f8 100644 --- a/cli/src/commands/config/set.rs +++ b/cli/src/commands/config/set.rs @@ -12,14 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +use jj_lib::commit::Commit; +use jj_lib::repo::Repo; use tracing::instrument; use super::ConfigLevelArgs; -use crate::cli_util::{get_new_config_file_path, CommandHelper}; +use crate::cli_util::{get_new_config_file_path, CommandHelper, WorkspaceCommandHelper}; use crate::command_error::{user_error, CommandError}; use crate::config::{write_config_value_to_file, ConfigNamePathBuf}; use crate::ui::Ui; - /// Update config file to set the given option to a given value. #[derive(clap::Args, Clone, Debug)] pub struct ConfigSetArgs { @@ -32,8 +33,8 @@ pub struct ConfigSetArgs { } #[instrument(skip_all)] -pub fn cmd_config_set( - _ui: &mut Ui, +pub(crate) fn cmd_config_set( + ui: &mut Ui, command: &CommandHelper, args: &ConfigSetArgs, ) -> Result<(), CommandError> { @@ -44,5 +45,69 @@ pub fn cmd_config_set( path = config_path.display() ))); } + + // If the user is trying to change the author config, we should warn them that + // it won't affect the working copy author + if args.name == ConfigNamePathBuf::from_iter(vec!["user", "name"]) { + check_wc_user_name(command, ui, &args.value)?; + } else if args.name == ConfigNamePathBuf::from_iter(vec!["user", "email"]) { + check_wc_user_email(command, ui, &args.value)?; + }; + write_config_value_to_file(&args.name, &args.value, &config_path) } + +/// Returns the commit of the working copy if it exists. +fn maybe_wc_commit(helper: &WorkspaceCommandHelper) -> Option { + let repo = helper.repo(); + let maybe_wc_commit = helper + .get_wc_commit_id() + .map(|id| repo.store().get_commit(id)) + .transpose() + .unwrap(); + maybe_wc_commit +} + +/// Check if the working copy author name matches the user's config value +/// If it doesn't, print a warning message +fn check_wc_user_name( + command: &CommandHelper, + ui: &mut Ui, + user_name: &str, +) -> Result<(), CommandError> { + let helper = command.workspace_helper(ui)?; + if let Some(wc_commit) = maybe_wc_commit(&helper) { + let author = wc_commit.author(); + if author.name != user_name { + warn_wc_author(&author.name, &author.email, ui)? + } + }; + Ok(()) +} + +/// Check if the working copy author email matches the user's config value +/// If it doesn't, print a warning message +fn check_wc_user_email( + command: &CommandHelper, + ui: &mut Ui, + user_email: &str, +) -> Result<(), CommandError> { + let helper = command.workspace_helper(ui)?; + if let Some(wc_commit) = maybe_wc_commit(&helper) { + let author = wc_commit.author(); + if author.email != user_email { + warn_wc_author(&author.name, &author.email, ui)? + } + }; + Ok(()) +} + +/// Prints a warning message about the working copy to the user +fn warn_wc_author(user_name: &str, user_email: &str, ui: &mut Ui) -> Result<(), CommandError> { + Ok(writeln!( + ui.warning_default(), + "This setting will only impact future commits.\nThe author of the working copy will stay \ + \"{user_name} <{user_email}>\". \nTo change the working copy author, use \"jj describe \ + --reset-author --no-edit\"" + )?) +}