merge_tools: rename MergeTool -> ExternalMergeTool

This commit is contained in:
Waleed Khan 2023-08-07 20:03:52 -07:00
parent c2979e849f
commit c572c1a331
2 changed files with 34 additions and 29 deletions

View File

@ -32,7 +32,7 @@ use tracing::instrument;
use crate::cli_util::{CommandError, WorkspaceCommandHelper}; use crate::cli_util::{CommandError, WorkspaceCommandHelper};
use crate::formatter::Formatter; use crate::formatter::Formatter;
use crate::merge_tools::{self, MergeTool}; use crate::merge_tools::{self, ExternalMergeTool};
use crate::ui::Ui; use crate::ui::Ui;
#[derive(clap::Args, Clone, Debug)] #[derive(clap::Args, Clone, Debug)]
@ -68,7 +68,7 @@ pub enum DiffFormat {
Types, Types,
Git, Git,
ColorWords, ColorWords,
Tool(Box<MergeTool>), Tool(Box<ExternalMergeTool>),
} }
/// Returns a list of requested diff formats, which will never be empty. /// Returns a list of requested diff formats, which will never be empty.
@ -115,7 +115,7 @@ fn diff_formats_from_args(
.collect_vec(); .collect_vec();
if let Some(name) = &args.tool { if let Some(name) = &args.tool {
let tool = merge_tools::get_tool_config(settings, name)? let tool = merge_tools::get_tool_config(settings, name)?
.unwrap_or_else(|| MergeTool::with_program(name)); .unwrap_or_else(|| ExternalMergeTool::with_program(name));
formats.push(DiffFormat::Tool(Box::new(tool))); formats.push(DiffFormat::Tool(Box::new(tool)));
} }
Ok(formats) Ok(formats)
@ -126,7 +126,7 @@ fn default_diff_format(settings: &UserSettings) -> Result<DiffFormat, config::Co
if let Some(args) = config.get("ui.diff.tool").optional()? { if let Some(args) = config.get("ui.diff.tool").optional()? {
// External "tool" overrides the internal "format" option. // External "tool" overrides the internal "format" option.
let tool = merge_tools::get_tool_config_from_args(settings, &args)? let tool = merge_tools::get_tool_config_from_args(settings, &args)?
.unwrap_or_else(|| MergeTool::with_diff_args(&args)); .unwrap_or_else(|| ExternalMergeTool::with_diff_args(&args));
return Ok(DiffFormat::Tool(Box::new(tool))); return Ok(DiffFormat::Tool(Box::new(tool)));
} }
let name = if let Some(name) = config.get_string("ui.diff.format").optional()? { let name = if let Some(name) = config.get_string("ui.diff.format").optional()? {

View File

@ -436,7 +436,7 @@ pub fn generate_diff(
left_tree: &Tree, left_tree: &Tree,
right_tree: &Tree, right_tree: &Tree,
matcher: &dyn Matcher, matcher: &dyn Matcher,
tool: &MergeTool, tool: &ExternalMergeTool,
) -> Result<(), DiffGenerateError> { ) -> Result<(), DiffGenerateError> {
let store = left_tree.store(); let store = left_tree.store();
let diff_wc = check_out_trees(store, left_tree, right_tree, matcher)?; let diff_wc = check_out_trees(store, left_tree, right_tree, matcher)?;
@ -470,10 +470,15 @@ pub fn generate_diff(
Ok(()) Ok(())
} }
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum MergeTool {
External(ExternalMergeTool),
}
/// Merge/diff tool loaded from the settings. /// Merge/diff tool loaded from the settings.
#[derive(Clone, Debug, Eq, PartialEq, serde::Deserialize)] #[derive(Clone, Debug, Eq, PartialEq, serde::Deserialize)]
#[serde(default, rename_all = "kebab-case")] #[serde(default, rename_all = "kebab-case")]
pub struct MergeTool { pub struct ExternalMergeTool {
/// Program to execute. Must be defined; defaults to the tool name /// Program to execute. Must be defined; defaults to the tool name
/// if not specified in the config. /// if not specified in the config.
pub program: String, pub program: String,
@ -499,9 +504,9 @@ pub struct MergeTool {
pub merge_tool_edits_conflict_markers: bool, pub merge_tool_edits_conflict_markers: bool,
} }
impl Default for MergeTool { impl Default for ExternalMergeTool {
fn default() -> Self { fn default() -> Self {
MergeTool { Self {
program: String::new(), program: String::new(),
diff_args: ["$left", "$right"].map(ToOwned::to_owned).to_vec(), diff_args: ["$left", "$right"].map(ToOwned::to_owned).to_vec(),
edit_args: ["$left", "$right"].map(ToOwned::to_owned).to_vec(), edit_args: ["$left", "$right"].map(ToOwned::to_owned).to_vec(),
@ -511,9 +516,9 @@ impl Default for MergeTool {
} }
} }
impl MergeTool { impl ExternalMergeTool {
pub fn with_program(program: impl Into<String>) -> Self { pub fn with_program(program: impl Into<String>) -> Self {
MergeTool { Self {
program: program.into(), program: program.into(),
..Default::default() ..Default::default()
} }
@ -536,7 +541,7 @@ impl MergeTool {
get_mut_args: impl FnOnce(&mut Self) -> &mut Vec<String>, get_mut_args: impl FnOnce(&mut Self) -> &mut Vec<String>,
) -> Self { ) -> Self {
let (name, args) = command_args.split_name_and_args(); let (name, args) = command_args.split_name_and_args();
let mut tool = MergeTool { let mut tool = Self {
program: name.into_owned(), program: name.into_owned(),
..Default::default() ..Default::default()
}; };
@ -551,11 +556,11 @@ impl MergeTool {
pub fn get_tool_config( pub fn get_tool_config(
settings: &UserSettings, settings: &UserSettings,
name: &str, name: &str,
) -> Result<Option<MergeTool>, ConfigError> { ) -> Result<Option<ExternalMergeTool>, ConfigError> {
const TABLE_KEY: &str = "merge-tools"; const TABLE_KEY: &str = "merge-tools";
let tools_table = settings.config().get_table(TABLE_KEY)?; let tools_table = settings.config().get_table(TABLE_KEY)?;
if let Some(v) = tools_table.get(name) { if let Some(v) = tools_table.get(name) {
let mut result: MergeTool = v let mut result: ExternalMergeTool = v
.clone() .clone()
.try_deserialize() .try_deserialize()
// add config key, deserialize error is otherwise unclear // add config key, deserialize error is otherwise unclear
@ -575,7 +580,7 @@ pub fn get_tool_config(
pub fn get_tool_config_from_args( pub fn get_tool_config_from_args(
settings: &UserSettings, settings: &UserSettings,
args: &CommandNameAndArgs, args: &CommandNameAndArgs,
) -> Result<Option<MergeTool>, ConfigError> { ) -> Result<Option<ExternalMergeTool>, ConfigError> {
match args { match args {
CommandNameAndArgs::String(name) => get_tool_config(settings, name), CommandNameAndArgs::String(name) => get_tool_config(settings, name),
CommandNameAndArgs::Vec(_) | CommandNameAndArgs::Structured { .. } => Ok(None), CommandNameAndArgs::Vec(_) | CommandNameAndArgs::Structured { .. } => Ok(None),
@ -585,20 +590,20 @@ pub fn get_tool_config_from_args(
fn get_diff_editor_from_settings( fn get_diff_editor_from_settings(
ui: &Ui, ui: &Ui,
settings: &UserSettings, settings: &UserSettings,
) -> Result<MergeTool, ExternalToolError> { ) -> Result<ExternalMergeTool, ExternalToolError> {
let args = editor_args_from_settings(ui, settings, "ui.diff-editor")?; let args = editor_args_from_settings(ui, settings, "ui.diff-editor")?;
let editor = get_tool_config_from_args(settings, &args)? let editor = get_tool_config_from_args(settings, &args)?
.unwrap_or_else(|| MergeTool::with_edit_args(&args)); .unwrap_or_else(|| ExternalMergeTool::with_edit_args(&args));
Ok(editor) Ok(editor)
} }
fn get_merge_tool_from_settings( fn get_merge_tool_from_settings(
ui: &Ui, ui: &Ui,
settings: &UserSettings, settings: &UserSettings,
) -> Result<MergeTool, ExternalToolError> { ) -> Result<ExternalMergeTool, ExternalToolError> {
let args = editor_args_from_settings(ui, settings, "ui.merge-editor")?; let args = editor_args_from_settings(ui, settings, "ui.merge-editor")?;
let editor = get_tool_config_from_args(settings, &args)? let editor = get_tool_config_from_args(settings, &args)?
.unwrap_or_else(|| MergeTool::with_merge_args(&args)); .unwrap_or_else(|| ExternalMergeTool::with_merge_args(&args));
if editor.merge_args.is_empty() { if editor.merge_args.is_empty() {
Err(ExternalToolError::MergeArgsNotConfigured { Err(ExternalToolError::MergeArgsNotConfigured {
tool_name: args.to_string(), tool_name: args.to_string(),
@ -664,7 +669,7 @@ mod tests {
// Default // Default
insta::assert_debug_snapshot!(get("").unwrap(), @r###" insta::assert_debug_snapshot!(get("").unwrap(), @r###"
MergeTool { ExternalMergeTool {
program: "meld", program: "meld",
diff_args: [ diff_args: [
"$left", "$left",
@ -688,7 +693,7 @@ mod tests {
// Just program name, edit_args are filled by default // Just program name, edit_args are filled by default
insta::assert_debug_snapshot!(get(r#"ui.diff-editor = "my-diff""#).unwrap(), @r###" insta::assert_debug_snapshot!(get(r#"ui.diff-editor = "my-diff""#).unwrap(), @r###"
MergeTool { ExternalMergeTool {
program: "my-diff", program: "my-diff",
diff_args: [ diff_args: [
"$left", "$left",
@ -706,7 +711,7 @@ mod tests {
// String args (with interpolation variables) // String args (with interpolation variables)
insta::assert_debug_snapshot!( insta::assert_debug_snapshot!(
get(r#"ui.diff-editor = "my-diff -l $left -r $right""#).unwrap(), @r###" get(r#"ui.diff-editor = "my-diff -l $left -r $right""#).unwrap(), @r###"
MergeTool { ExternalMergeTool {
program: "my-diff", program: "my-diff",
diff_args: [ diff_args: [
"$left", "$left",
@ -726,7 +731,7 @@ mod tests {
// List args (with interpolation variables) // List args (with interpolation variables)
insta::assert_debug_snapshot!( insta::assert_debug_snapshot!(
get(r#"ui.diff-editor = ["my-diff", "--diff", "$left", "$right"]"#).unwrap(), @r###" get(r#"ui.diff-editor = ["my-diff", "--diff", "$left", "$right"]"#).unwrap(), @r###"
MergeTool { ExternalMergeTool {
program: "my-diff", program: "my-diff",
diff_args: [ diff_args: [
"$left", "$left",
@ -750,7 +755,7 @@ mod tests {
edit-args = ["--edit", "args", "$left", "$right"] edit-args = ["--edit", "args", "$left", "$right"]
"#, "#,
).unwrap(), @r###" ).unwrap(), @r###"
MergeTool { ExternalMergeTool {
program: "foo bar", program: "foo bar",
diff_args: [ diff_args: [
"$left", "$left",
@ -775,7 +780,7 @@ mod tests {
program = "MyDiff" program = "MyDiff"
"#, "#,
).unwrap(), @r###" ).unwrap(), @r###"
MergeTool { ExternalMergeTool {
program: "MyDiff", program: "MyDiff",
diff_args: [ diff_args: [
"$left", "$left",
@ -792,7 +797,7 @@ mod tests {
// List args should never be a merge-tools key, edit_args are filled by default // List args should never be a merge-tools key, edit_args are filled by default
insta::assert_debug_snapshot!(get(r#"ui.diff-editor = ["meld"]"#).unwrap(), @r###" insta::assert_debug_snapshot!(get(r#"ui.diff-editor = ["meld"]"#).unwrap(), @r###"
MergeTool { ExternalMergeTool {
program: "meld", program: "meld",
diff_args: [ diff_args: [
"$left", "$left",
@ -822,7 +827,7 @@ mod tests {
// Default // Default
insta::assert_debug_snapshot!(get("").unwrap(), @r###" insta::assert_debug_snapshot!(get("").unwrap(), @r###"
MergeTool { ExternalMergeTool {
program: "meld", program: "meld",
diff_args: [ diff_args: [
"$left", "$left",
@ -854,7 +859,7 @@ mod tests {
// String args // String args
insta::assert_debug_snapshot!( insta::assert_debug_snapshot!(
get(r#"ui.merge-editor = "my-merge $left $base $right $output""#).unwrap(), @r###" get(r#"ui.merge-editor = "my-merge $left $base $right $output""#).unwrap(), @r###"
MergeTool { ExternalMergeTool {
program: "my-merge", program: "my-merge",
diff_args: [ diff_args: [
"$left", "$left",
@ -879,7 +884,7 @@ mod tests {
get( get(
r#"ui.merge-editor = ["my-merge", "$left", "$base", "$right", "$output"]"#, r#"ui.merge-editor = ["my-merge", "$left", "$base", "$right", "$output"]"#,
).unwrap(), @r###" ).unwrap(), @r###"
MergeTool { ExternalMergeTool {
program: "my-merge", program: "my-merge",
diff_args: [ diff_args: [
"$left", "$left",
@ -907,7 +912,7 @@ mod tests {
merge-args = ["$base", "$left", "$right", "$output"] merge-args = ["$base", "$left", "$right", "$output"]
"#, "#,
).unwrap(), @r###" ).unwrap(), @r###"
MergeTool { ExternalMergeTool {
program: "foo bar", program: "foo bar",
diff_args: [ diff_args: [
"$left", "$left",