mirror of
https://github.com/martinvonz/jj.git
synced 2025-05-09 09:22:50 +00:00
merge_tools: rename MergeTool
-> ExternalMergeTool
This commit is contained in:
parent
c2979e849f
commit
c572c1a331
@ -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()? {
|
||||||
|
@ -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",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user