From 42a044b7c70559257b9107af99b32c822e55607c Mon Sep 17 00:00:00 2001 From: Yuya Nishihara Date: Wed, 4 Jan 2023 17:57:36 +0900 Subject: [PATCH] cli: move ui.settings() to CommandHelper, disown UserSettings from Ui Still UserSettings is cloned to WorkspaceCommandHelper, but I think this is slightly better since CommandHelper and WorkspaceCommandHelper are scoped based on call stack. Perhaps, UserSettings can be shared by Arc or immutable reference. --- examples/custom-backend/main.rs | 4 +- examples/custom-command/main.rs | 2 +- src/cli_util.rs | 29 +++-- src/commands.rs | 181 +++++++++++++++++--------------- src/ui.rs | 18 +--- 5 files changed, 121 insertions(+), 113 deletions(-) diff --git a/examples/custom-backend/main.rs b/examples/custom-backend/main.rs index 3dfe04a9c..8b45f4ab6 100644 --- a/examples/custom-backend/main.rs +++ b/examples/custom-backend/main.rs @@ -44,7 +44,7 @@ fn create_store_factories() -> StoreFactories { } fn run_custom_command( - ui: &mut Ui, + _ui: &mut Ui, command_helper: &CommandHelper, command: CustomCommands, ) -> Result<(), CommandError> { @@ -52,7 +52,7 @@ fn run_custom_command( CustomCommands::InitJit => { let wc_path = command_helper.cwd(); // Initialize a workspace with the custom backend - Workspace::init_with_backend(ui.settings(), wc_path, |store_path| { + Workspace::init_with_backend(command_helper.settings(), wc_path, |store_path| { Box::new(JitBackend::init(store_path)) })?; Ok(()) diff --git a/examples/custom-command/main.rs b/examples/custom-command/main.rs index 4d711acfc..6b60a1b00 100644 --- a/examples/custom-command/main.rs +++ b/examples/custom-command/main.rs @@ -40,7 +40,7 @@ fn run_custom_command( let mut tx = workspace_command.start_transaction("Frobnicate"); let new_commit = tx .mut_repo() - .rewrite_commit(ui.settings(), &commit) + .rewrite_commit(command_helper.settings(), &commit) .set_description("Frobnicated!") .write()?; workspace_command.finish_transaction(ui, tx)?; diff --git a/src/cli_util.rs b/src/cli_util.rs index 4da1d4563..99aead534 100644 --- a/src/cli_util.rs +++ b/src/cli_util.rs @@ -263,6 +263,7 @@ pub struct CommandHelper { cwd: PathBuf, string_args: Vec, global_args: GlobalArgs, + settings: UserSettings, store_factories: StoreFactories, } @@ -272,6 +273,7 @@ impl CommandHelper { cwd: PathBuf, string_args: Vec, global_args: GlobalArgs, + settings: UserSettings, store_factories: StoreFactories, ) -> Self { Self { @@ -279,6 +281,7 @@ impl CommandHelper { cwd, string_args, global_args, + settings, store_factories, } } @@ -299,17 +302,21 @@ impl CommandHelper { &self.global_args } + pub fn settings(&self) -> &UserSettings { + &self.settings + } + pub fn workspace_helper(&self, ui: &mut Ui) -> Result { - let workspace = self.load_workspace(ui)?; + let workspace = self.load_workspace()?; let mut workspace_command = self.resolve_operation(ui, workspace)?; workspace_command.snapshot(ui)?; Ok(workspace_command) } - pub fn load_workspace(&self, ui: &Ui) -> Result { + pub fn load_workspace(&self) -> Result { let wc_path_str = self.global_args.repository.as_deref().unwrap_or("."); let wc_path = self.cwd.join(wc_path_str); - Workspace::load(ui.settings(), &wc_path, &self.store_factories).map_err(|err| match err { + Workspace::load(&self.settings, &wc_path, &self.store_factories).map_err(|err| match err { WorkspaceLoadError::NoWorkspaceHere(wc_path) => { let message = format!("There is no jj repo in \"{wc_path_str}\""); let git_dir = wc_path.join(".git"); @@ -363,7 +370,7 @@ jj init --git-repo=.", let mut tx = workspace_command.start_transaction("resolve concurrent operations"); for other_op_head in op_heads.into_iter().skip(1) { tx.merge_operation(other_op_head); - let num_rebased = tx.mut_repo().rebase_descendants(ui.settings())?; + let num_rebased = tx.mut_repo().rebase_descendants(&self.settings)?; if num_rebased > 0 { writeln!( ui, @@ -393,6 +400,7 @@ jj init --git-repo=.", self.cwd.clone(), self.string_args.clone(), &self.global_args, + self.settings.clone(), repo, ) } @@ -419,9 +427,9 @@ impl WorkspaceCommandHelper { cwd: PathBuf, string_args: Vec, global_args: &GlobalArgs, + settings: UserSettings, repo: Arc, ) -> Result { - let settings = ui.settings().clone(); let revset_aliases_map = load_revset_aliases(ui, &settings)?; let loaded_at_head = &global_args.at_operation == "@"; let may_update_working_copy = loaded_at_head && !global_args.no_commit_working_copy; @@ -509,7 +517,7 @@ impl WorkspaceCommandHelper { self.repo = tx.commit(); locked_working_copy.finish(self.repo.op_id().clone()); } else { - let num_rebased = tx.mut_repo().rebase_descendants(ui.settings())?; + let num_rebased = tx.mut_repo().rebase_descendants(&self.settings)?; if num_rebased > 0 { writeln!( ui, @@ -938,7 +946,7 @@ impl WorkspaceCommandHelper { writeln!(ui, "Nothing changed.")?; return Ok(()); } - let num_rebased = mut_repo.rebase_descendants(ui.settings())?; + let num_rebased = mut_repo.rebase_descendants(&self.settings)?; if num_rebased > 0 { writeln!(ui, "Rebased {num_rebased} descendant commits")?; } @@ -968,7 +976,7 @@ impl WorkspaceCommandHelper { print_checkout_stats(ui, stats)?; } } - let settings = ui.settings(); + let settings = &self.settings; if settings.user_name() == UserSettings::user_name_placeholder() || settings.user_email() == UserSettings::user_email_placeholder() { @@ -1615,7 +1623,7 @@ fn handle_early_args( } if !args.config_toml.is_empty() { settings.incorporate_toml_strings(&args.config_toml)?; - ui.reset(settings.clone()); // TODO: disown UserSettings from Ui + ui.reset(settings); } Ok(()) } @@ -1776,7 +1784,7 @@ impl CliRunner { pub fn run(self, ui: &mut Ui) -> Result<(), CommandError> { let cwd = env::current_dir().unwrap(); // TODO: maybe map_err to CommandError? let mut settings = crate::config::read_config()?; - ui.reset(settings.clone()); // TODO: disown UserSettings from Ui + ui.reset(&settings); let string_args = expand_args(&self.app, std::env::args_os(), &settings)?; let (matches, args) = parse_args( ui, @@ -1791,6 +1799,7 @@ impl CliRunner { cwd, string_args, args.global_args, + settings, self.store_factories.unwrap_or_default(), ); (self.dispatch_fn)(ui, &command_helper, &matches) diff --git a/src/commands.rs b/src/commands.rs index 6ac2675b9..ebdb01342 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -1157,7 +1157,7 @@ fn cmd_init(ui: &mut Ui, command: &CommandHelper, args: &InitArgs) -> Result<(), .join(relative_path); } let (workspace, repo) = - Workspace::init_external_git(ui.settings(), &wc_path, &git_store_path)?; + Workspace::init_external_git(command.settings(), &wc_path, &git_store_path)?; let git_repo = repo.store().git_repo().unwrap(); let mut workspace_command = command.for_loaded_repo(ui, workspace, repo)?; workspace_command.snapshot(ui)?; @@ -1170,7 +1170,7 @@ fn cmd_init(ui: &mut Ui, command: &CommandHelper, args: &InitArgs) -> Result<(), let git_head_commit = tx.mut_repo().store().get_commit(&git_head_id)?; tx.mut_repo().check_out( workspace_command.workspace_id(), - ui.settings(), + command.settings(), &git_head_commit, )?; } @@ -1179,16 +1179,16 @@ fn cmd_init(ui: &mut Ui, command: &CommandHelper, args: &InitArgs) -> Result<(), } } } else if args.git { - Workspace::init_internal_git(ui.settings(), &wc_path)?; + Workspace::init_internal_git(command.settings(), &wc_path)?; } else { - if !ui.settings().allow_native_backend() { + if !command.settings().allow_native_backend() { return Err(user_error_with_hint( "The native backend is disallowed by default.", "Did you mean to pass `--git`? Set `ui.allow-init-native` to allow initializing a repo with the native backend.", )); } - Workspace::init_local(ui.settings(), &wc_path)?; + Workspace::init_local(command.settings(), &wc_path)?; }; let cwd = command.cwd().canonicalize().unwrap(); let relative_wc_path = file_util::relative_path(&cwd, &wc_path); @@ -1206,25 +1206,24 @@ Set `ui.allow-init-native` to allow initializing a repo with the native backend. fn cmd_config( ui: &mut Ui, - _command: &CommandHelper, + command: &CommandHelper, subcommand: &ConfigSubcommand, ) -> Result<(), CommandError> { ui.request_pager(); match subcommand { ConfigSubcommand::List { name } => { let raw_values = match name { - Some(name) => { - ui.settings() - .config() - .get::(name) - .map_err(|e| match e { - config::ConfigError::NotFound { .. } => { - user_error("key not found in config") - } - _ => e.into(), - })? - } - None => ui.settings().config().collect()?.into(), + Some(name) => command + .settings() + .config() + .get::(name) + .map_err(|e| match e { + config::ConfigError::NotFound { .. } => { + user_error("key not found in config") + } + _ => e.into(), + })?, + None => command.settings().config().collect()?.into(), }; write_config_entry(ui, name.as_deref().unwrap_or(""), raw_values)?; } @@ -1246,7 +1245,7 @@ fn cmd_checkout( let commit_builder = tx .mut_repo() .new_commit( - ui.settings(), + command.settings(), vec![target.id().clone()], target.tree_id().clone(), ) @@ -1309,10 +1308,10 @@ Make sure they're ignored, then try again.", } } tx.mut_repo() - .rewrite_commit(ui.settings(), &wc_commit) + .rewrite_commit(command.settings(), &wc_commit) .set_tree(new_tree_id) .write()?; - let num_rebased = tx.mut_repo().rebase_descendants(ui.settings())?; + let num_rebased = tx.mut_repo().rebase_descendants(command.settings())?; if num_rebased > 0 { writeln!(ui, "Rebased {num_rebased} descendant commits")?; } @@ -1384,7 +1383,7 @@ fn cmd_diff(ui: &mut Ui, command: &CommandHelper, args: &DiffArgs) -> Result<(), &from_tree, &to_tree, matcher.as_ref(), - &diff_util::diff_formats_for(ui.settings(), &args.format), + &diff_util::diff_formats_for(command.settings(), &args.format), )?; Ok(()) } @@ -1395,7 +1394,7 @@ fn cmd_show(ui: &mut Ui, command: &CommandHelper, args: &ShowArgs) -> Result<(), // TODO: Add branches, tags, etc // TODO: Indent the description like Git does let (author_timestamp_template, committer_timestamp_template) = - if ui.settings().relative_timestamps() { + if command.settings().relative_timestamps() { ("author.timestamp().ago()", "committer.timestamp().ago()") } else { ("author.timestamp()", "committer.timestamp()") @@ -1424,7 +1423,7 @@ fn cmd_show(ui: &mut Ui, command: &CommandHelper, args: &ShowArgs) -> Result<(), &workspace_command, &commit, &EverythingMatcher, - &diff_util::diff_formats_for(ui.settings(), &args.format), + &diff_util::diff_formats_for(command.settings(), &args.format), )?; Ok(()) } @@ -1454,7 +1453,7 @@ fn cmd_status( repo.as_repo_ref(), &workspace_id, &parent, - ui.settings(), + command.settings(), )?; formatter.write_str("\n")?; } @@ -1464,7 +1463,7 @@ fn cmd_status( repo.as_repo_ref(), &workspace_id, wc_commit, - ui.settings(), + command.settings(), )?; formatter.write_str("\n")?; } else { @@ -1579,7 +1578,7 @@ fn log_template(settings: &UserSettings) -> String { fn cmd_log(ui: &mut Ui, command: &CommandHelper, args: &LogArgs) -> Result<(), CommandError> { let workspace_command = command.workspace_helper(ui)?; - let default_revset = ui.settings().default_revset(); + let default_revset = command.settings().default_revset(); let revset_expression = workspace_command.parse_revset(args.revisions.as_deref().unwrap_or(&default_revset))?; let repo = workspace_command.repo(); @@ -1595,11 +1594,11 @@ fn cmd_log(ui: &mut Ui, command: &CommandHelper, args: &LogArgs) -> Result<(), C let store = repo.store(); let diff_formats = - diff_util::diff_formats_for_log(ui.settings(), &args.diff_format, args.patch); + diff_util::diff_formats_for_log(command.settings(), &args.diff_format, args.patch); let template_string = match &args.template { Some(value) => value.to_string(), - None => log_template(ui.settings()), + None => log_template(command.settings()), }; let template = crate::template_parser::parse_commit_template( repo.as_repo_ref(), @@ -1736,11 +1735,11 @@ fn cmd_obslog(ui: &mut Ui, command: &CommandHelper, args: &ObslogArgs) -> Result .get_wc_commit_id(&workspace_id); let diff_formats = - diff_util::diff_formats_for_log(ui.settings(), &args.diff_format, args.patch); + diff_util::diff_formats_for_log(command.settings(), &args.diff_format, args.patch); let template_string = match &args.template { Some(value) => value.to_string(), - None => log_template(ui.settings()), + None => log_template(command.settings()), }; let template = crate::template_parser::parse_commit_template( workspace_command.repo().as_repo_ref(), @@ -1841,7 +1840,7 @@ fn cmd_interdiff( &from_tree, &to.tree(), matcher.as_ref(), - &diff_util::diff_formats_for(ui.settings(), &args.format), + &diff_util::diff_formats_for(command.settings(), &args.format), ) } @@ -1944,7 +1943,7 @@ fn cmd_describe( message.into() } else { let template = description_template_for_commit(&workspace_command, &commit)?; - edit_description(workspace_command.repo(), &template, ui.settings())? + edit_description(workspace_command.repo(), &template, command.settings())? }; if description == *commit.description() { ui.write("Nothing changed.\n")?; @@ -1952,7 +1951,7 @@ fn cmd_describe( let mut tx = workspace_command.start_transaction(&format!("describe commit {}", commit.id().hex())); tx.mut_repo() - .rewrite_commit(ui.settings(), &commit) + .rewrite_commit(command.settings(), &commit) .set_description(description) .write()?; workspace_command.finish_transaction(ui, tx)?; @@ -1971,12 +1970,12 @@ fn cmd_commit(ui: &mut Ui, command: &CommandHelper, args: &CommitArgs) -> Result let commit = workspace_command.repo().store().get_commit(commit_id)?; let mut tx = workspace_command.start_transaction(&format!("commit {}", commit.id().hex())); - let mut commit_builder = tx.mut_repo().rewrite_commit(ui.settings(), &commit); + let mut commit_builder = tx.mut_repo().rewrite_commit(command.settings(), &commit); let description = if let Some(message) = &args.message { message.into() } else { let template = description_template_for_commit(&workspace_command, &commit)?; - edit_description(workspace_command.repo(), &template, ui.settings())? + edit_description(workspace_command.repo(), &template, command.settings())? }; commit_builder = commit_builder.set_description(description); let new_commit = commit_builder.write()?; @@ -1988,7 +1987,7 @@ fn cmd_commit(ui: &mut Ui, command: &CommandHelper, args: &CommitArgs) -> Result let new_checkout = tx .mut_repo() .new_commit( - ui.settings(), + command.settings(), vec![new_commit.id().clone()], new_commit.tree_id().clone(), ) @@ -2012,7 +2011,7 @@ fn cmd_duplicate( .start_transaction(&format!("duplicate commit {}", predecessor.id().hex())); let mut_repo = tx.mut_repo(); let new_commit = mut_repo - .rewrite_commit(ui.settings(), &predecessor) + .rewrite_commit(command.settings(), &predecessor) .generate_new_change_id() .write()?; ui.write("Created: ")?; @@ -2021,7 +2020,7 @@ fn cmd_duplicate( mut_repo.as_repo_ref(), &workspace_command.workspace_id(), &new_commit, - ui.settings(), + command.settings(), )?; ui.write("\n")?; workspace_command.finish_transaction(ui, tx)?; @@ -2059,7 +2058,7 @@ fn cmd_abandon( for commit in to_abandon { tx.mut_repo().record_abandoned_commit(commit.id().clone()); } - let num_rebased = tx.mut_repo().rebase_descendants(ui.settings())?; + let num_rebased = tx.mut_repo().rebase_descendants(command.settings())?; if num_rebased > 0 { writeln!( ui, @@ -2102,7 +2101,7 @@ fn cmd_new(ui: &mut Ui, command: &CommandHelper, args: &NewArgs) -> Result<(), C let merged_tree = merge_commit_trees(workspace_command.repo().as_repo_ref(), &commits); let new_commit = tx .mut_repo() - .new_commit(ui.settings(), parent_ids, merged_tree.id().clone()) + .new_commit(command.settings(), parent_ids, merged_tree.id().clone()) .set_description(&args.message) .write()?; let workspace_id = workspace_command.workspace_id(); @@ -2194,7 +2193,7 @@ from the source will be moved into the destination. mut_repo.record_abandoned_commit(source.id().clone()); } else { mut_repo - .rewrite_commit(ui.settings(), &source) + .rewrite_commit(command.settings(), &source) .set_tree(new_source_tree_id) .write()?; } @@ -2203,7 +2202,7 @@ from the source will be moved into the destination. // rewritten source. Otherwise it will likely already have the content // changes we're moving, so applying them will have no effect and the // changes will disappear. - let mut rebaser = mut_repo.create_descendant_rebaser(ui.settings()); + let mut rebaser = mut_repo.create_descendant_rebaser(command.settings()); rebaser.rebase_all()?; let rebased_destination_id = rebaser.rebased().get(destination.id()).unwrap().clone(); destination = mut_repo.store().get_commit(&rebased_destination_id)?; @@ -2214,11 +2213,11 @@ from the source will be moved into the destination. workspace_command.repo(), &source, &destination, - ui.settings(), + command.settings(), abandon_source, )?; mut_repo - .rewrite_commit(ui.settings(), &destination) + .rewrite_commit(command.settings(), &destination) .set_tree(new_destination_tree_id) .set_description(description) .write()?; @@ -2274,11 +2273,11 @@ from the source will be moved into the parent. workspace_command.repo(), &commit, parent, - ui.settings(), + command.settings(), abandon_child, )?; let new_parent = mut_repo - .rewrite_commit(ui.settings(), parent) + .rewrite_commit(command.settings(), parent) .set_tree(new_parent_tree_id) .set_predecessors(vec![parent.id().clone(), commit.id().clone()]) .set_description(description) @@ -2288,7 +2287,7 @@ from the source will be moved into the parent. } else { // Commit the remainder on top of the new parent commit. mut_repo - .rewrite_commit(ui.settings(), &commit) + .rewrite_commit(command.settings(), &commit) .set_parents(vec![new_parent.id().clone()]) .write()?; } @@ -2347,25 +2346,25 @@ aborted. workspace_command.repo(), parent, &commit, - ui.settings(), + command.settings(), true, )?; // Commit the new child on top of the parent's parents. tx.mut_repo() - .rewrite_commit(ui.settings(), &commit) + .rewrite_commit(command.settings(), &commit) .set_parents(parent.parent_ids().to_vec()) .set_description(description) .write()?; } else { let new_parent = tx .mut_repo() - .rewrite_commit(ui.settings(), parent) + .rewrite_commit(command.settings(), parent) .set_tree(new_parent_tree_id) .set_predecessors(vec![parent.id().clone(), commit.id().clone()]) .write()?; // Commit the new child on top of the new parent. tx.mut_repo() - .rewrite_commit(ui.settings(), &commit) + .rewrite_commit(command.settings(), &commit) .set_parents(vec![new_parent.id().clone()]) .write()?; } @@ -2421,7 +2420,7 @@ fn cmd_resolve( )); let new_tree_id = workspace_command.run_mergetool(ui, &commit.tree(), repo_path)?; tx.mut_repo() - .rewrite_commit(ui.settings(), &commit) + .rewrite_commit(command.settings(), &commit) .set_tree(new_tree_id) .write()?; workspace_command.finish_transaction(ui, tx) @@ -2469,7 +2468,7 @@ fn cmd_restore( .start_transaction(&format!("restore into commit {}", to_commit.id().hex())); let mut_repo = tx.mut_repo(); let new_commit = mut_repo - .rewrite_commit(ui.settings(), &to_commit) + .rewrite_commit(command.settings(), &to_commit) .set_tree(tree_id) .write()?; ui.write("Created ")?; @@ -2478,7 +2477,7 @@ fn cmd_restore( mut_repo.as_repo_ref(), &workspace_command.workspace_id(), &new_commit, - ui.settings(), + command.settings(), )?; ui.write("\n")?; workspace_command.finish_transaction(ui, tx)?; @@ -2533,7 +2532,7 @@ don't make any changes, then the operation will be aborted.", .start_transaction(&format!("edit commit {}", target_commit.id().hex())); let mut_repo = tx.mut_repo(); let new_commit = mut_repo - .rewrite_commit(ui.settings(), &target_commit) + .rewrite_commit(command.settings(), &target_commit) .set_tree(tree_id) .write()?; ui.write("Created ")?; @@ -2542,7 +2541,7 @@ don't make any changes, then the operation will be aborted.", mut_repo.as_repo_ref(), &workspace_command.workspace_id(), &new_commit, - ui.settings(), + command.settings(), )?; ui.write("\n")?; workspace_command.finish_transaction(ui, tx)?; @@ -2643,10 +2642,11 @@ don't make any changes, then the operation will be aborted. &base_tree, &middle_tree, )?; - let first_description = edit_description(tx.base_repo(), &first_template, ui.settings())?; + let first_description = + edit_description(tx.base_repo(), &first_template, command.settings())?; let first_commit = tx .mut_repo() - .rewrite_commit(ui.settings(), &commit) + .rewrite_commit(command.settings(), &commit) .set_tree(tree_id) .set_description(first_description) .write()?; @@ -2657,17 +2657,18 @@ don't make any changes, then the operation will be aborted. &middle_tree, &commit.tree(), )?; - let second_description = edit_description(tx.base_repo(), &second_template, ui.settings())?; + let second_description = + edit_description(tx.base_repo(), &second_template, command.settings())?; let second_commit = tx .mut_repo() - .rewrite_commit(ui.settings(), &commit) + .rewrite_commit(command.settings(), &commit) .set_parents(vec![first_commit.id().clone()]) .set_tree(commit.tree_id().clone()) .generate_new_change_id() .set_description(second_description) .write()?; let mut rebaser = DescendantRebaser::new( - ui.settings(), + command.settings(), tx.mut_repo(), hashmap! { commit.id().clone() => hashset!{second_commit.id().clone()} }, hashset! {}, @@ -2683,7 +2684,7 @@ don't make any changes, then the operation will be aborted. tx.repo().as_repo_ref(), &workspace_command.workspace_id(), &first_commit, - ui.settings(), + command.settings(), )?; ui.write("\nSecond part: ")?; write_commit_summary( @@ -2691,7 +2692,7 @@ don't make any changes, then the operation will be aborted. tx.repo().as_repo_ref(), &workspace_command.workspace_id(), &second_commit, - ui.settings(), + command.settings(), )?; ui.write("\n")?; workspace_command.finish_transaction(ui, tx)?; @@ -2736,7 +2737,7 @@ fn cmd_rebase(ui: &mut Ui, command: &CommandHelper, args: &RebaseArgs) -> Result fn rebase_branch( ui: &mut Ui, - _command: &CommandHelper, + command: &CommandHelper, workspace_command: &mut WorkspaceCommandHelper, new_parents: &[Commit], branch_str: &str, @@ -2763,10 +2764,10 @@ fn rebase_branch( { let root_commit = root_result?; workspace_command.check_rewriteable(&root_commit)?; - rebase_commit(ui.settings(), tx.mut_repo(), &root_commit, new_parents)?; + rebase_commit(command.settings(), tx.mut_repo(), &root_commit, new_parents)?; num_rebased += 1; } - num_rebased += tx.mut_repo().rebase_descendants(ui.settings())?; + num_rebased += tx.mut_repo().rebase_descendants(command.settings())?; writeln!(ui, "Rebased {num_rebased} commits")?; workspace_command.finish_transaction(ui, tx)?; Ok(()) @@ -2774,7 +2775,7 @@ fn rebase_branch( fn rebase_descendants( ui: &mut Ui, - _command: &CommandHelper, + command: &CommandHelper, workspace_command: &mut WorkspaceCommandHelper, new_parents: &[Commit], source_str: &str, @@ -2786,8 +2787,8 @@ fn rebase_descendants( "rebase commit {} and descendants", old_commit.id().hex() )); - rebase_commit(ui.settings(), tx.mut_repo(), &old_commit, new_parents)?; - let num_rebased = tx.mut_repo().rebase_descendants(ui.settings())? + 1; + rebase_commit(command.settings(), tx.mut_repo(), &old_commit, new_parents)?; + let num_rebased = tx.mut_repo().rebase_descendants(command.settings())? + 1; writeln!(ui, "Rebased {num_rebased} commits")?; workspace_command.finish_transaction(ui, tx)?; Ok(()) @@ -2795,7 +2796,7 @@ fn rebase_descendants( fn rebase_revision( ui: &mut Ui, - _command: &CommandHelper, + command: &CommandHelper, workspace_command: &mut WorkspaceCommandHelper, new_parents: &[Commit], rev_str: &str, @@ -2805,7 +2806,7 @@ fn rebase_revision( check_rebase_destinations(workspace_command, new_parents, &old_commit)?; let mut tx = workspace_command.start_transaction(&format!("rebase commit {}", old_commit.id().hex())); - rebase_commit(ui.settings(), tx.mut_repo(), &old_commit, new_parents)?; + rebase_commit(command.settings(), tx.mut_repo(), &old_commit, new_parents)?; // Manually rebase children because we don't want to rebase them onto the // rewritten commit. (But we still want to record the commit as rewritten so // branches and the working copy get updated to the rewritten commit.) @@ -2852,14 +2853,14 @@ fn rebase_revision( .try_collect()?; rebase_commit( - ui.settings(), + command.settings(), tx.mut_repo(), &child_commit, &new_child_parents, )?; num_rebased_descendants += 1; } - num_rebased_descendants += tx.mut_repo().rebase_descendants(ui.settings())?; + num_rebased_descendants += tx.mut_repo().rebase_descendants(command.settings())?; if num_rebased_descendants > 0 { writeln!( ui, @@ -2908,7 +2909,12 @@ fn cmd_backout( "back out commit {}", commit_to_back_out.id().hex() )); - back_out_commit(ui.settings(), tx.mut_repo(), &commit_to_back_out, &parents)?; + back_out_commit( + command.settings(), + tx.mut_repo(), + &commit_to_back_out, + &parents, + )?; workspace_command.finish_transaction(ui, tx)?; Ok(()) @@ -3081,7 +3087,7 @@ fn cmd_branch( fn list_branches( ui: &mut Ui, - _command: &CommandHelper, + command: &CommandHelper, workspace_command: &WorkspaceCommandHelper, ) -> Result<(), CommandError> { let repo = workspace_command.repo(); @@ -3099,7 +3105,7 @@ fn list_branches( repo.as_repo_ref(), &workspace_id, &commit, - ui.settings(), + command.settings(), )?; writeln!(formatter)?; } @@ -3115,7 +3121,7 @@ fn list_branches( repo.as_repo_ref(), &workspace_id, &commit, - ui.settings(), + command.settings(), )?; writeln!(formatter)?; } @@ -3127,7 +3133,7 @@ fn list_branches( repo.as_repo_ref(), &workspace_id, &commit, - ui.settings(), + command.settings(), )?; writeln!(formatter)?; } @@ -3470,7 +3476,7 @@ fn cmd_workspace_add( ))); } let (new_workspace, repo) = Workspace::init_workspace_with_existing_repo( - ui.settings(), + command.settings(), &destination_path, repo, workspace_id, @@ -3488,6 +3494,7 @@ fn cmd_workspace_add( command.cwd().to_owned(), command.string_args().clone(), command.global_args(), + command.settings().clone(), repo, )?; let mut tx = new_workspace_command.start_transaction(&format!( @@ -3512,7 +3519,7 @@ fn cmd_workspace_add( }; tx.mut_repo().check_out( new_workspace_command.workspace_id(), - ui.settings(), + command.settings(), &new_wc_commit, )?; new_workspace_command.finish_transaction(ui, tx)?; @@ -3562,7 +3569,7 @@ fn cmd_workspace_list( repo.as_repo_ref(), workspace_id, &commit, - ui.settings(), + command.settings(), )?; writeln!(ui)?; } @@ -3574,7 +3581,7 @@ fn cmd_workspace_update_stale( command: &CommandHelper, _args: &WorkspaceUpdateStaleArgs, ) -> Result<(), CommandError> { - let workspace = command.load_workspace(ui)?; + let workspace = command.load_workspace()?; let mut workspace_command = command.resolve_operation(ui, workspace)?; let repo = workspace_command.repo().clone(); let workspace_id = workspace_command.workspace_id(); @@ -3603,7 +3610,7 @@ fn cmd_workspace_update_stale( repo.as_repo_ref(), &workspace_id, &desired_wc_commit, - ui.settings(), + command.settings(), )?; ui.write("\n")?; print_checkout_stats(ui, stats)?; @@ -3861,7 +3868,7 @@ fn cmd_git_clone( if let Ok(commit) = workspace_command.repo().store().get_commit(&commit_id) { checkout_tx.mut_repo().check_out( workspace_command.workspace_id(), - ui.settings(), + command.settings(), &commit, )?; } @@ -3877,7 +3884,7 @@ fn do_git_clone( source: &str, wc_path: &Path, ) -> Result<(WorkspaceCommandHelper, Option), CommandError> { - let (workspace, repo) = Workspace::init_internal_git(ui.settings(), wc_path)?; + let (workspace, repo) = Workspace::init_internal_git(command.settings(), wc_path)?; let git_repo = get_git_repo(repo.store())?; writeln!(ui, r#"Fetching into new repo in "{}""#, wc_path.display())?; let mut workspace_command = command.for_loaded_repo(ui, workspace, repo)?; @@ -4079,7 +4086,7 @@ fn cmd_git_push( for (change_str, commit) in std::iter::zip(args.change.iter(), commits) { let branch_name = format!( "{}{}", - ui.settings().push_branch_prefix(), + command.settings().push_branch_prefix(), commit.change_id().hex() ); if !seen_branches.insert(branch_name.clone()) { diff --git a/src/ui.rs b/src/ui.rs index 235724517..b4b71f3c7 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -30,7 +30,6 @@ pub struct Ui { progress_indicator: bool, formatter_factory: FormatterFactory, output: UiOutput, - settings: UserSettings, } fn progress_indicator_setting(settings: &UserSettings) -> bool { @@ -132,17 +131,14 @@ impl Ui { paginate: PaginationChoice::Auto, progress_indicator, output: UiOutput::new_terminal(), - settings, } } - pub fn reset(&mut self, settings: UserSettings) { - // TODO: maybe Ui shouldn't take ownership of UserSettings - self.color = use_color(color_setting(&settings)); - self.pager_cmd = pager_setting(&settings); - self.progress_indicator = progress_indicator_setting(&settings); - self.formatter_factory = FormatterFactory::prepare(&settings, self.color); - self.settings = settings; + pub fn reset(&mut self, settings: &UserSettings) { + self.color = use_color(color_setting(settings)); + self.pager_cmd = pager_setting(settings); + self.progress_indicator = progress_indicator_setting(settings); + self.formatter_factory = FormatterFactory::prepare(settings, self.color); } /// Sets the pagination value. @@ -179,10 +175,6 @@ impl Ui { self.color } - pub fn settings(&self) -> &UserSettings { - &self.settings - } - pub fn new_formatter<'output, W: Write + 'output>( &self, output: W,