Extract resolve_list from cmd_resolve, tests, minor refactoring

This is all in preparation for follow-up commit, which will change
some of the new tests. The extracted function will be further expanded
later.
This commit is contained in:
Ilya Grigoriev 2022-12-23 17:57:10 -08:00
parent 42a044b7c7
commit b8ba78b996
2 changed files with 63 additions and 36 deletions

View file

@ -2383,33 +2383,21 @@ fn cmd_resolve(
let tree = commit.tree(); let tree = commit.tree();
let conflicts = tree.conflicts_matching(matcher.as_ref()); let conflicts = tree.conflicts_matching(matcher.as_ref());
if conflicts.is_empty() { if conflicts.is_empty() {
return Err(CommandError::CliError( return Err(CommandError::CliError(format!(
"No conflicts found ".to_string() "No conflicts found {}",
+ (if args.paths.is_empty() { if args.paths.is_empty() {
"at this revision" "at this revision"
} else { } else {
"at the given path(s)" "at the given path(s)"
}), }
)); )));
} }
if args.list { if args.list {
let mut formatter = ui.stdout_formatter(); return print_conflicted_files(
let formatter = formatter.as_mut(); &conflicts,
for (repo_path, _conflict_id) in conflicts { ui.stdout_formatter().as_mut(),
// TODO: Similar to `jj diff --summary`, insert a few letters &workspace_command,
// before the filename to indicate the kind of conflict. );
// E.g. we could have a letter per add : `FF` is a usual conflict
// between two versions of a file, `FD` is a file vs directory,
// `FFF` for a merge of three conflicting versions. Additionally,
// if (# removes) + 1 > (# adds), this indicates the file was deleted
// in some versions of the conflict. Perhaps that should be `R` for removed.
writeln!(
formatter,
"{}",
&workspace_command.format_file_path(&repo_path)
)?;
}
return Ok(());
}; };
let (repo_path, _) = conflicts.get(0).unwrap(); let (repo_path, _) = conflicts.get(0).unwrap();
@ -2426,6 +2414,28 @@ fn cmd_resolve(
workspace_command.finish_transaction(ui, tx) workspace_command.finish_transaction(ui, tx)
} }
fn print_conflicted_files(
conflicts: &[(RepoPath, jujutsu_lib::backend::ConflictId)],
formatter: &mut dyn Formatter,
workspace_command: &WorkspaceCommandHelper,
) -> Result<(), CommandError> {
for (repo_path, _conflict_id) in conflicts.iter() {
// TODO: Similar to `jj diff --summary`, insert a few letters
// before the filename to indicate the kind of conflict.
// E.g. we could have a letter per add : `FF` is a usual conflict
// between two versions of a file, `FD` is a file vs directory,
// `FFF` for a merge of three conflicting versions. Additionally,
// if (# removes) + 1 > (# adds), this indicates the file was deleted
// in some versions of the conflict. Perhaps that should be `R` for removed.
writeln!(
formatter,
"{}",
&workspace_command.format_file_path(repo_path)
)?;
}
Ok(())
}
fn cmd_restore( fn cmd_restore(
ui: &mut Ui, ui: &mut Ui,
command: &CommandHelper, command: &CommandHelper,

View file

@ -85,7 +85,11 @@ fn test_resolution() {
["dump editor0", "write\nresolution\n"].join("\0"), ["dump editor0", "write\nresolution\n"].join("\0"),
) )
.unwrap(); .unwrap();
test_env.jj_cmd_success(&repo_path, &["resolve"]); insta::assert_snapshot!(
test_env.jj_cmd_success(&repo_path, &["resolve"]), @r###"
Working copy now at: e069f0736a79 conflict
Added 0 files, modified 1 files, removed 0 files
"###);
insta::assert_snapshot!( insta::assert_snapshot!(
std::fs::read_to_string(test_env.env_root().join("editor0")).unwrap(), @r###" std::fs::read_to_string(test_env.env_root().join("editor0")).unwrap(), @r###"
"###); "###);
@ -167,14 +171,19 @@ conflict
.join("\0"), .join("\0"),
) )
.unwrap(); .unwrap();
test_env.jj_cmd_success( insta::assert_snapshot!(
&repo_path, test_env.jj_cmd_success(
&[ &repo_path,
"resolve", &[
"--config-toml", "resolve",
"merge-tools.fake-editor.merge-tool-edits-conflict-markers=true", "--config-toml",
], "merge-tools.fake-editor.merge-tool-edits-conflict-markers=true",
); ],
),
@r###"
Working copy now at: 0bb40c908c8b conflict
Added 0 files, modified 1 files, removed 0 files
"###);
insta::assert_snapshot!( insta::assert_snapshot!(
std::fs::read_to_string(test_env.env_root().join("editor2")).unwrap(), @r###" std::fs::read_to_string(test_env.env_root().join("editor2")).unwrap(), @r###"
<<<<<<< <<<<<<<
@ -225,7 +234,11 @@ conflict
.join("\0"), .join("\0"),
) )
.unwrap(); .unwrap();
test_env.jj_cmd_success(&repo_path, &["resolve"]); insta::assert_snapshot!(
test_env.jj_cmd_success(&repo_path, &["resolve"]), @r###"
Working copy now at: 95418cb82ab1 conflict
Added 0 files, modified 1 files, removed 0 files
"###);
insta::assert_snapshot!( insta::assert_snapshot!(
std::fs::read_to_string(test_env.env_root().join("editor3")).unwrap(), @r###" std::fs::read_to_string(test_env.env_root().join("editor3")).unwrap(), @r###"
"###); "###);
@ -520,7 +533,11 @@ fn test_multiple_conflicts() {
// Check that we can manually pick which of the conflicts to resolve first // Check that we can manually pick which of the conflicts to resolve first
std::fs::write(&editor_script, "expect\n\0write\nresolution file2\n").unwrap(); std::fs::write(&editor_script, "expect\n\0write\nresolution file2\n").unwrap();
test_env.jj_cmd_success(&repo_path, &["resolve", "file2"]); insta::assert_snapshot!(
test_env.jj_cmd_success(&repo_path, &["resolve", "file2"]), @r###"
Working copy now at: 06cafc2b5489 conflict
Added 0 files, modified 1 files, removed 0 files
"###);
insta::assert_snapshot!(test_env.jj_cmd_success(&repo_path, &["diff"]), insta::assert_snapshot!(test_env.jj_cmd_success(&repo_path, &["diff"]),
@r###" @r###"
Resolved conflict in file2: Resolved conflict in file2: