-
Notifications
You must be signed in to change notification settings - Fork 373
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Change conflict hint depending on state of working commit.
To avoid always printing the rebase instructions to fix a conflict even when a child commit to fix the conflict already exists, implement the following: * If working commit has conflicts: * if any decendants are conflict free: "Conflict fixed in <decendant>". For this, print the short_change_hash of the first decendant without conflicts. * if no decendants are conflict free: Print the existing message we print today. * If working commit has no conflicts: * If any parent has conflicts: "Conflict in parent is resolved in working copy". Explicitly not printing the "conflicting parent" here, since a merge commit could have conflict in multiple parents. * If no parent has any conflicts: exit quietly. * Rename existing unittest * Also update Changelog here
- Loading branch information
Showing
3 changed files
with
129 additions
and
17 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -106,7 +106,7 @@ fn test_status_filtered() { | |
|
||
// See <https://github.com/martinvonz/jj/issues/3108> | ||
#[test] | ||
fn test_status_display_rebase_instructions() { | ||
fn test_status_display_rebase_instructions_if_no_descendant_resolves_conflict() { | ||
let test_env = TestEnvironment::default(); | ||
test_env.jj_cmd_ok(test_env.env_root(), &["git", "init", "repo"]); | ||
|
||
|
@@ -177,6 +177,81 @@ fn test_status_display_rebase_instructions() { | |
"###); | ||
} | ||
|
||
#[test] | ||
fn test_status_display_if_child_resolves_conflict() { | ||
let test_env = TestEnvironment::default(); | ||
test_env.jj_cmd_ok(test_env.env_root(), &["git", "init", "repo"]); | ||
|
||
let repo_path = test_env.env_root().join("repo"); | ||
let conflicted_path = repo_path.join("conflicted.txt"); | ||
|
||
// PARENT: Write the initial file | ||
std::fs::write(&conflicted_path, "initial contents").unwrap(); | ||
test_env.jj_cmd_ok(&repo_path, &["describe", "--message", "Initial contents"]); | ||
|
||
// CHILD1: New commit on top of <PARENT> | ||
test_env.jj_cmd_ok( | ||
&repo_path, | ||
&["new", "--message", "First part of conflicting change"], | ||
); | ||
std::fs::write(&conflicted_path, "Child 1").unwrap(); | ||
|
||
// CHILD2: New commit also on top of <PARENT> | ||
test_env.jj_cmd_ok( | ||
&repo_path, | ||
&[ | ||
"new", | ||
"--message", | ||
"Second part of conflicting change", | ||
"@-", | ||
], | ||
); | ||
std::fs::write(&conflicted_path, "Child 2").unwrap(); | ||
|
||
// CONFLICT: New commit that is conflicted by merging <CHILD1> and <CHILD2> | ||
test_env.jj_cmd_ok(&repo_path, &["new", "--message", "boom", "all:(@-)+"]); | ||
// Adding more descendants to ensure we correctly find the root ancestors with | ||
// conflicts, not just the parents. | ||
test_env.jj_cmd_ok(&repo_path, &["new", "--message", "boom-cont"]); | ||
test_env.jj_cmd_ok(&repo_path, &["new", "--message", "fix_conflict1"]); | ||
std::fs::write(&conflicted_path, "first commit to fix conflict").unwrap(); | ||
test_env.jj_cmd_ok( | ||
&repo_path, | ||
&["new", "--message", "child of conflict fixing commit"], | ||
); | ||
|
||
let stdout = test_env.jj_cmd_success(&repo_path, &["log", "-r", "::@"]); | ||
|
||
insta::assert_snapshot!(stdout, @r###" | ||
@ vruxwmqv [email protected] 2001-02-03 08:05:14 c6ea5f6c | ||
│ (empty) child of conflict fixing commit | ||
○ yqosqzyt [email protected] 2001-02-03 08:05:14 15837663 | ||
│ fix_conflict1 | ||
× royxmykx [email protected] 2001-02-03 08:05:12 a4e88714 conflict | ||
│ (empty) boom-cont | ||
× mzvwutvl [email protected] 2001-02-03 08:05:11 538415e7 conflict | ||
├─╮ (empty) boom | ||
│ ○ kkmpptxz [email protected] 2001-02-03 08:05:10 1e8c2956 | ||
│ │ First part of conflicting change | ||
○ │ zsuskuln [email protected] 2001-02-03 08:05:11 2c8b19fd | ||
├─╯ Second part of conflicting change | ||
○ qpvuntsm [email protected] 2001-02-03 08:05:08 aade7195 | ||
│ Initial contents | ||
◆ zzzzzzzz root() 00000000 | ||
"###); | ||
|
||
let stdout = test_env.jj_cmd_success(&repo_path, &["status"]); | ||
|
||
insta::assert_snapshot!(stdout, @r###" | ||
The working copy is clean | ||
There are unresolved conflicts at these paths: | ||
conflicted.txt 2-sided conflict | ||
Working copy : yqosqzyt 65143fef (conflict) (empty) boom-cont-2 | ||
Parent commit: royxmykx a4e88714 (conflict) (empty) boom-cont | ||
Conflict has been resolved in descendant: foobar | ||
"###); | ||
} | ||
|
||
#[test] | ||
fn test_status_simplify_conflict_sides() { | ||
let test_env = TestEnvironment::default(); | ||
|