Skip to content

Commit

Permalink
conflicts.rs: label conflict number and sides next to conflict markers
Browse files Browse the repository at this point in the history
For example, 

```
<<<<<<< Conflict 1 of 3
+++++++ Contents of side #1
left 3.1
left 3.2
left 3.3
%%%%%%% Changes from base to side #2
-line 3
+right 3.1
>>>>>>>
```

or

```
<<<<<<< Conflict 1 of 1
%%%%%%% Changes from base to side #1
-line 3
+right 3.1
+++++++ Contents of side #2
left 3.1
left 3.2
left 3.3
>>>>>>>
```

Currently, there is no way to disable these, this is TODO for a future
PR. Other TODOs for future PRs: make these labels configurable. After
that, we could support a `diff3/git`-like conflict format as well, in
principle.

Counting conflicts helps with knowing whether you fixed all the
conflicts while you are in the editor.

While labeling "side #1", etc, does not tell you the commit id or
description as requested in #1176, I still think it's an improvement.
Most importantly, I hope this will make `jj`'s conflict format less
scary-looking for new users.

I've used this for a bit, and I like it. Without the labels, I would see
that the two conflicts have a different order of conflict markers, but I
wouldn't be able to remember what that means. For longer diffs, it can
be tricky for me to quickly tell that it's a diff as opposed to one of
the sides. This also creates some hope of being able to navigate a
conflict with more than 2 sides.

Another not-so-secret goal for this is explained in
#3109 (comment). The
idea is a little weird, but I *think* it could be helpful, and I'd like
to experiment with it.
  • Loading branch information
ilyagr committed Apr 11, 2024
1 parent 3eff7dc commit f503642
Show file tree
Hide file tree
Showing 11 changed files with 210 additions and 174 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
* A new config option `ui.always-allow-large-revsets` has been added to
allow large revsets expressions in some commands, without the `all:` prefix.

* Conflict markers now include an explanation of what each part of the conflict
represents.

* New command `jj parallelize` that rebases a set of revisions into siblings.

* `jj status` now supports filtering by paths. For example, `jj status .` will
Expand Down
6 changes: 3 additions & 3 deletions cli/tests/test_cat_command.rs
Original file line number Diff line number Diff line change
Expand Up @@ -73,11 +73,11 @@ fn test_cat() {
test_env.jj_cmd_ok(&repo_path, &["rebase", "-r", "@", "-d", "@--"]);
let stdout = test_env.jj_cmd_success(&repo_path, &["cat", "file1"]);
insta::assert_snapshot!(stdout, @r###"
<<<<<<<
%%%%%%%
<<<<<<< Conflict 1 of 1
%%%%%%% Changes from base to side #1
-b
+a
+++++++
+++++++ Contents of side #2
c
>>>>>>>
"###);
Expand Down
30 changes: 15 additions & 15 deletions cli/tests/test_chmod_command.rs
Original file line number Diff line number Diff line change
Expand Up @@ -71,11 +71,11 @@ fn test_chmod_regular_conflict() {
let stdout = test_env.jj_cmd_success(&repo_path, &["cat", "file"]);
insta::assert_snapshot!(stdout,
@r###"
<<<<<<<
%%%%%%%
<<<<<<< Conflict 1 of 1
%%%%%%% Changes from base to side #1
-base
+x
+++++++
+++++++ Contents of side #2
n
>>>>>>>
"###);
Expand All @@ -90,11 +90,11 @@ fn test_chmod_regular_conflict() {
let stdout = test_env.jj_cmd_success(&repo_path, &["cat", "file"]);
insta::assert_snapshot!(stdout,
@r###"
<<<<<<<
%%%%%%%
<<<<<<< Conflict 1 of 1
%%%%%%% Changes from base to side #1
-base
+x
+++++++
+++++++ Contents of side #2
n
>>>>>>>
"###);
Expand All @@ -107,11 +107,11 @@ fn test_chmod_regular_conflict() {
let stdout = test_env.jj_cmd_success(&repo_path, &["cat", "file"]);
insta::assert_snapshot!(stdout,
@r###"
<<<<<<<
%%%%%%%
<<<<<<< Conflict 1 of 1
%%%%%%% Changes from base to side #1
-base
+x
+++++++
+++++++ Contents of side #2
n
>>>>>>>
"###);
Expand Down Expand Up @@ -201,10 +201,10 @@ fn test_chmod_file_dir_deletion_conflicts() {
let stdout = test_env.jj_cmd_success(&repo_path, &["cat", "-r=file_deletion", "file"]);
insta::assert_snapshot!(stdout,
@r###"
<<<<<<<
+++++++
<<<<<<< Conflict 1 of 1
+++++++ Contents of side #1
a
%%%%%%%
%%%%%%% Changes from base to side #2
-base
>>>>>>>
"###);
Expand Down Expand Up @@ -234,10 +234,10 @@ fn test_chmod_file_dir_deletion_conflicts() {
let stdout = test_env.jj_cmd_success(&repo_path, &["cat", "-r=file_deletion", "file"]);
insta::assert_snapshot!(stdout,
@r###"
<<<<<<<
+++++++
<<<<<<< Conflict 1 of 1
+++++++ Contents of side #1
a
%%%%%%%
%%%%%%% Changes from base to side #2
-base
>>>>>>>
"###);
Expand Down
6 changes: 3 additions & 3 deletions cli/tests/test_diffedit_command.rs
Original file line number Diff line number Diff line change
Expand Up @@ -395,11 +395,11 @@ fn test_diffedit_merge() {
assert!(!repo_path.join("file1").exists());
let stdout = test_env.jj_cmd_success(&repo_path, &["print", "file2"]);
insta::assert_snapshot!(stdout, @r###"
<<<<<<<
%%%%%%%
<<<<<<< Conflict 1 of 1
%%%%%%% Changes from base to side #1
-a
+c
+++++++
+++++++ Contents of side #2
b
>>>>>>>
"###);
Expand Down
6 changes: 3 additions & 3 deletions cli/tests/test_interdiff_command.rs
Original file line number Diff line number Diff line change
Expand Up @@ -153,11 +153,11 @@ fn test_interdiff_conflicting() {
--- a/file
+++ b/file
@@ -1,7 +1,1 @@
-<<<<<<<
-%%%%%%%
-<<<<<<< Conflict 1 of 1
-%%%%%%% Changes from base to side #1
--foo
-+abc
-+++++++
-+++++++ Contents of side #2
-bar
->>>>>>>
+def
Expand Down
12 changes: 6 additions & 6 deletions cli/tests/test_obslog_command.rs
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,10 @@ fn test_obslog_with_or_without_diff() {
@ rlvkpnrz [email protected] 2001-02-03 08:05:10 66b42ad3
│ my description
│ Resolved conflict in file1:
│ 1 1: <<<<<<<resolved
│ 2 : %%%%%%%
│ 1 1: <<<<<<< Conflict 1 of 1resolved
│ 2 : %%%%%%% Changes from base to side #1
│ 3 : -foo
│ 4 : +++++++
│ 4 : +++++++ Contents of side #2
│ 5 : foo
│ 6 : bar
│ 7 : >>>>>>>
Expand Down Expand Up @@ -111,10 +111,10 @@ fn test_obslog_with_or_without_diff() {
--- a/file1
+++ b/file1
@@ -1,7 +1,1 @@
-<<<<<<<
-%%%%%%%
-<<<<<<< Conflict 1 of 1
-%%%%%%% Changes from base to side #1
--foo
-+++++++
-+++++++ Contents of side #2
-foo
-bar
->>>>>>>
Expand Down
Loading

0 comments on commit f503642

Please sign in to comment.