use crate::common::CommandOutput;
use crate::common::TestEnvironment;
use crate::common::TestWorkDir;
use crate::common::force_interactive;
#[test]
fn test_next_simple() {
let test_env = TestEnvironment::default();
test_env.run_jj_in(".", ["git", "init", "repo"]).success();
let work_dir = test_env.work_dir("repo");
work_dir.run_jj(["commit", "-m", "first"]).success();
work_dir.run_jj(["commit", "-m", "second"]).success();
work_dir.run_jj(["commit", "-m", "third"]).success();
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ zsuskulnrvyr
○ kkmpptxzrspx third
○ rlvkpnrzqnoo second
○ qpvuntsmwlqt first
◆ zzzzzzzzzzzz
[EOF]
");
work_dir.run_jj(["new", "@--"]).success();
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ royxmykxtrkr
│ ○ kkmpptxzrspx third
├─╯
○ rlvkpnrzqnoo second
○ qpvuntsmwlqt first
◆ zzzzzzzzzzzz
[EOF]
");
let output = work_dir.run_jj(["next"]);
insta::assert_snapshot!(output, @r"
------- stderr -------
Working copy (@) now at: vruxwmqv 01f06d39 (empty) (no description set)
Parent commit (@-) : kkmpptxz 7576de42 (empty) third
[EOF]
");
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ vruxwmqvtpmx
○ kkmpptxzrspx third
○ rlvkpnrzqnoo second
○ qpvuntsmwlqt first
◆ zzzzzzzzzzzz
[EOF]
");
}
#[test]
fn test_next_multiple() {
let test_env = TestEnvironment::default();
test_env.run_jj_in(".", ["git", "init", "repo"]).success();
let work_dir = test_env.work_dir("repo");
work_dir.run_jj(["commit", "-m", "first"]).success();
work_dir.run_jj(["commit", "-m", "second"]).success();
work_dir.run_jj(["commit", "-m", "third"]).success();
work_dir.run_jj(["commit", "-m", "fourth"]).success();
work_dir.run_jj(["new", "@---"]).success();
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ royxmykxtrkr
│ ○ zsuskulnrvyr fourth
│ ○ kkmpptxzrspx third
├─╯
○ rlvkpnrzqnoo second
○ qpvuntsmwlqt first
◆ zzzzzzzzzzzz
[EOF]
");
let output = work_dir.run_jj(["next", "2"]);
insta::assert_snapshot!(output, @r"
------- stderr -------
Working copy (@) now at: vruxwmqv a53dd783 (empty) (no description set)
Parent commit (@-) : zsuskuln c5025ce1 (empty) fourth
[EOF]
");
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ vruxwmqvtpmx
○ zsuskulnrvyr fourth
○ kkmpptxzrspx third
○ rlvkpnrzqnoo second
○ qpvuntsmwlqt first
◆ zzzzzzzzzzzz
[EOF]
");
}
#[test]
fn test_prev_simple() {
let test_env = TestEnvironment::default();
test_env.run_jj_in(".", ["git", "init", "repo"]).success();
let work_dir = test_env.work_dir("repo");
work_dir.run_jj(["commit", "-m", "first"]).success();
work_dir.run_jj(["commit", "-m", "second"]).success();
work_dir.run_jj(["commit", "-m", "third"]).success();
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ zsuskulnrvyr
○ kkmpptxzrspx third
○ rlvkpnrzqnoo second
○ qpvuntsmwlqt first
◆ zzzzzzzzzzzz
[EOF]
");
let output = work_dir.run_jj(["prev"]);
insta::assert_snapshot!(output, @r"
------- stderr -------
Working copy (@) now at: royxmykx 539f176b (empty) (no description set)
Parent commit (@-) : rlvkpnrz 9439bf06 (empty) second
[EOF]
");
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ royxmykxtrkr
│ ○ kkmpptxzrspx third
├─╯
○ rlvkpnrzqnoo second
○ qpvuntsmwlqt first
◆ zzzzzzzzzzzz
[EOF]
");
}
#[test]
fn test_prev_multiple_without_root() {
let test_env = TestEnvironment::default();
test_env.run_jj_in(".", ["git", "init", "repo"]).success();
let work_dir = test_env.work_dir("repo");
work_dir.run_jj(["commit", "-m", "first"]).success();
work_dir.run_jj(["commit", "-m", "second"]).success();
work_dir.run_jj(["commit", "-m", "third"]).success();
work_dir.run_jj(["commit", "-m", "fourth"]).success();
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ mzvwutvlkqwt
○ zsuskulnrvyr fourth
○ kkmpptxzrspx third
○ rlvkpnrzqnoo second
○ qpvuntsmwlqt first
◆ zzzzzzzzzzzz
[EOF]
");
let output = work_dir.run_jj(["prev", "2"]);
insta::assert_snapshot!(output, @r"
------- stderr -------
Working copy (@) now at: yqosqzyt a4d3accb (empty) (no description set)
Parent commit (@-) : rlvkpnrz 9439bf06 (empty) second
[EOF]
");
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ yqosqzytrlsw
│ ○ zsuskulnrvyr fourth
│ ○ kkmpptxzrspx third
├─╯
○ rlvkpnrzqnoo second
○ qpvuntsmwlqt first
◆ zzzzzzzzzzzz
[EOF]
");
}
#[test]
fn test_next_exceeding_history() {
let test_env = TestEnvironment::default();
test_env.run_jj_in(".", ["git", "init", "repo"]).success();
let work_dir = test_env.work_dir("repo");
work_dir.run_jj(["commit", "-m", "first"]).success();
work_dir.run_jj(["commit", "-m", "second"]).success();
work_dir.run_jj(["commit", "-m", "third"]).success();
work_dir.run_jj(["edit", "-r", "@--"]).success();
insta::assert_snapshot!(get_log_output(&work_dir), @r"
○ kkmpptxzrspx third
@ rlvkpnrzqnoo second
○ qpvuntsmwlqt first
◆ zzzzzzzzzzzz
[EOF]
");
let output = work_dir.run_jj(["next", "3"]);
insta::assert_snapshot!(output, @r"
------- stderr -------
Error: No other descendant found 3 commit(s) forward from the working copy parent(s)
Hint: Working copy parent: qpvuntsm 68a50538 (empty) first
[EOF]
[exit status: 1]
");
}
#[test]
fn test_next_parent_has_multiple_descendants() {
let test_env = TestEnvironment::default();
test_env.run_jj_in(".", ["git", "init", "repo"]).success();
let work_dir = test_env.work_dir("repo");
work_dir.run_jj(["desc", "-m", "1"]).success();
work_dir.run_jj(["new", "-m", "2"]).success();
work_dir.run_jj(["new", "root()", "-m", "3"]).success();
work_dir.run_jj(["new", "-m", "4"]).success();
work_dir.run_jj(["edit", "description(3)"]).success();
insta::assert_snapshot!(get_log_output(&work_dir), @r"
○ mzvwutvlkqwt 4
@ zsuskulnrvyr 3
│ ○ kkmpptxzrspx 2
│ ○ qpvuntsmwlqt 1
├─╯
◆ zzzzzzzzzzzz
[EOF]
");
let output = work_dir.run_jj(["next", "--edit"]);
insta::assert_snapshot!(output, @r"
------- stderr -------
Working copy (@) now at: mzvwutvl e5543950 (empty) 4
Parent commit (@-) : zsuskuln 83df6e43 (empty) 3
[EOF]
");
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ mzvwutvlkqwt 4
○ zsuskulnrvyr 3
│ ○ kkmpptxzrspx 2
│ ○ qpvuntsmwlqt 1
├─╯
◆ zzzzzzzzzzzz
[EOF]
");
}
#[test]
fn test_next_with_merge_commit_parent() {
let test_env = TestEnvironment::default();
test_env.run_jj_in(".", ["git", "init", "repo"]).success();
let work_dir = test_env.work_dir("repo");
work_dir.run_jj(["desc", "-m", "1"]).success();
work_dir.run_jj(["new", "root()", "-m", "2"]).success();
work_dir
.run_jj(["new", "description(1)", "description(2)", "-m", "3"])
.success();
work_dir.run_jj(["new", "-m", "4"]).success();
work_dir.run_jj(["prev", "0"]).success();
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ royxmykxtrkr
│ ○ mzvwutvlkqwt 4
├─╯
○ zsuskulnrvyr 3
├─╮
│ ○ kkmpptxzrspx 2
○ │ qpvuntsmwlqt 1
├─╯
◆ zzzzzzzzzzzz
[EOF]
");
let output = work_dir.run_jj(["next"]);
insta::assert_snapshot!(output, @r"
------- stderr -------
Working copy (@) now at: vruxwmqv 7a09c355 (empty) (no description set)
Parent commit (@-) : mzvwutvl f02c921e (empty) 4
[EOF]
");
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ vruxwmqvtpmx
○ mzvwutvlkqwt 4
○ zsuskulnrvyr 3
├─╮
│ ○ kkmpptxzrspx 2
○ │ qpvuntsmwlqt 1
├─╯
◆ zzzzzzzzzzzz
[EOF]
");
}
#[test]
fn test_next_on_merge_commit() {
let test_env = TestEnvironment::default();
test_env.run_jj_in(".", ["git", "init", "repo"]).success();
let work_dir = test_env.work_dir("repo");
work_dir.run_jj(["desc", "-m", "1"]).success();
work_dir.run_jj(["new", "root()", "-m", "2"]).success();
work_dir
.run_jj(["new", "description(1)", "description(2)", "-m", "3"])
.success();
work_dir.run_jj(["new", "-m", "4"]).success();
work_dir.run_jj(["edit", "description(3)"]).success();
insta::assert_snapshot!(get_log_output(&work_dir), @r"
○ mzvwutvlkqwt 4
@ zsuskulnrvyr 3
├─╮
│ ○ kkmpptxzrspx 2
○ │ qpvuntsmwlqt 1
├─╯
◆ zzzzzzzzzzzz
[EOF]
");
let output = work_dir.run_jj(["next", "--edit"]);
insta::assert_snapshot!(output, @r"
------- stderr -------
Working copy (@) now at: mzvwutvl f02c921e (empty) 4
Parent commit (@-) : zsuskuln d2500577 (empty) 3
[EOF]
");
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ mzvwutvlkqwt 4
○ zsuskulnrvyr 3
├─╮
│ ○ kkmpptxzrspx 2
○ │ qpvuntsmwlqt 1
├─╯
◆ zzzzzzzzzzzz
[EOF]
");
}
#[test]
fn test_next_fails_on_bookmarking_children_no_stdin() {
let test_env = TestEnvironment::default();
test_env.run_jj_in(".", ["git", "init", "repo"]).success();
let work_dir = test_env.work_dir("repo");
work_dir.run_jj(["commit", "-m", "first"]).success();
work_dir.run_jj(["commit", "-m", "second"]).success();
work_dir.run_jj(["new", "@--"]).success();
work_dir.run_jj(["commit", "-m", "third"]).success();
work_dir.run_jj(["new", "@--"]).success();
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ royxmykxtrkr
│ ○ zsuskulnrvyr third
├─╯
│ ○ rlvkpnrzqnoo second
├─╯
○ qpvuntsmwlqt first
◆ zzzzzzzzzzzz
[EOF]
");
let output = work_dir.run_jj(["next"]);
insta::assert_snapshot!(output, @r"
------- stderr -------
ambiguous next commit, choose one to target:
1: zsuskuln 6fc6af46 (empty) third
2: rlvkpnrz 9439bf06 (empty) second
q: quit the prompt
Error: Cannot prompt for input since the output is not connected to a terminal
[EOF]
[exit status: 1]
");
}
#[test]
fn test_next_fails_on_bookmarking_children_quit_prompt() {
let test_env = TestEnvironment::default();
test_env.run_jj_in(".", ["git", "init", "repo"]).success();
let work_dir = test_env.work_dir("repo");
work_dir.run_jj(["commit", "-m", "first"]).success();
work_dir.run_jj(["commit", "-m", "second"]).success();
work_dir.run_jj(["new", "@--"]).success();
work_dir.run_jj(["commit", "-m", "third"]).success();
work_dir.run_jj(["new", "@--"]).success();
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ royxmykxtrkr
│ ○ zsuskulnrvyr third
├─╯
│ ○ rlvkpnrzqnoo second
├─╯
○ qpvuntsmwlqt first
◆ zzzzzzzzzzzz
[EOF]
");
let output = work_dir.run_jj_with(|cmd| force_interactive(cmd).arg("next").write_stdin("q\n"));
insta::assert_snapshot!(output, @r"
------- stderr -------
ambiguous next commit, choose one to target:
1: zsuskuln 6fc6af46 (empty) third
2: rlvkpnrz 9439bf06 (empty) second
q: quit the prompt
enter the index of the commit you want to target: Error: ambiguous target commit
[EOF]
[exit status: 1]
");
}
#[test]
fn test_next_choose_bookmarking_child() {
let test_env = TestEnvironment::default();
test_env.run_jj_in(".", ["git", "init", "repo"]).success();
let work_dir = test_env.work_dir("repo");
work_dir.run_jj(["commit", "-m", "first"]).success();
work_dir.run_jj(["commit", "-m", "second"]).success();
work_dir.run_jj(["new", "@--"]).success();
work_dir.run_jj(["commit", "-m", "third"]).success();
work_dir.run_jj(["new", "@--"]).success();
work_dir.run_jj(["commit", "-m", "fourth"]).success();
work_dir.run_jj(["new", "@--"]).success();
let output = work_dir.run_jj_with(|cmd| force_interactive(cmd).arg("next").write_stdin("2\n"));
insta::assert_snapshot!(output, @r"
------- stderr -------
ambiguous next commit, choose one to target:
1: royxmykx 3522c887 (empty) fourth
2: zsuskuln 6fc6af46 (empty) third
3: rlvkpnrz 9439bf06 (empty) second
q: quit the prompt
enter the index of the commit you want to target: Working copy (@) now at: yostqsxw 683938a4 (empty) (no description set)
Parent commit (@-) : zsuskuln 6fc6af46 (empty) third
[EOF]
");
}
#[test]
fn test_prev_on_merge_commit() {
let test_env = TestEnvironment::default();
test_env.run_jj_in(".", ["git", "init", "repo"]).success();
let work_dir = test_env.work_dir("repo");
work_dir.run_jj(["desc", "-m", "first"]).success();
work_dir.run_jj(["bookmark", "c", "-r@", "left"]).success();
work_dir.run_jj(["new", "root()", "-m", "second"]).success();
work_dir.run_jj(["bookmark", "c", "-r@", "right"]).success();
work_dir.run_jj(["new", "left", "right"]).success();
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ royxmykxtrkr
├─╮
│ ○ zsuskulnrvyr right second
○ │ qpvuntsmwlqt left first
├─╯
◆ zzzzzzzzzzzz
[EOF]
");
let setup_opid = work_dir.current_operation_id();
let output = work_dir.run_jj(["prev"]);
insta::assert_snapshot!(output, @r"
------- stderr -------
Working copy (@) now at: vruxwmqv b64f323d (empty) (no description set)
Parent commit (@-) : zzzzzzzz 00000000 (empty) (no description set)
[EOF]
");
work_dir.run_jj(["op", "restore", &setup_opid]).success();
let output = work_dir.run_jj_with(|cmd| {
force_interactive(cmd)
.args(["prev", "--edit"])
.write_stdin("2\n")
});
insta::assert_snapshot!(output, @r"
------- stderr -------
ambiguous prev commit, choose one to target:
1: zsuskuln 22a08bc0 right | (empty) second
2: qpvuntsm 68a50538 left | (empty) first
q: quit the prompt
enter the index of the commit you want to target: Working copy (@) now at: qpvuntsm 68a50538 left | (empty) first
Parent commit (@-) : zzzzzzzz 00000000 (empty) (no description set)
[EOF]
");
}
#[test]
fn test_prev_on_merge_commit_with_parent_merge() {
let test_env = TestEnvironment::default();
test_env.run_jj_in(".", ["git", "init", "repo"]).success();
let work_dir = test_env.work_dir("repo");
work_dir.run_jj(["desc", "-m", "x"]).success();
work_dir.run_jj(["new", "root()", "-m", "y"]).success();
work_dir
.run_jj(["new", "description(x)", "description(y)", "-m", "z"])
.success();
work_dir.run_jj(["new", "root()", "-m", "1"]).success();
work_dir
.run_jj(["new", "description(z)", "description(1)", "-m", "M"])
.success();
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ royxmykxtrkr M
├─╮
│ ○ mzvwutvlkqwt 1
○ │ zsuskulnrvyr z
├───╮
│ │ ○ kkmpptxzrspx y
│ ├─╯
○ │ qpvuntsmwlqt x
├─╯
◆ zzzzzzzzzzzz
[EOF]
");
let setup_opid = work_dir.current_operation_id();
let output = work_dir.run_jj_with(|cmd| force_interactive(cmd).arg("prev").write_stdin("2\n"));
insta::assert_snapshot!(output, @r"
------- stderr -------
ambiguous prev commit, choose one to target:
1: kkmpptxz ab947132 (empty) y
2: qpvuntsm 007e88d2 (empty) x
3: zzzzzzzz 00000000 (empty) (no description set)
q: quit the prompt
enter the index of the commit you want to target: Working copy (@) now at: vruxwmqv ff8922ba (empty) (no description set)
Parent commit (@-) : qpvuntsm 007e88d2 (empty) x
[EOF]
");
work_dir.run_jj(["op", "restore", &setup_opid]).success();
let output = work_dir.run_jj_with(|cmd| {
force_interactive(cmd)
.args(["prev", "--edit"])
.write_stdin("2\n")
});
insta::assert_snapshot!(output, @r"
------- stderr -------
ambiguous prev commit, choose one to target:
1: mzvwutvl 0e8fc48c (empty) 1
2: zsuskuln e7382ca4 (empty) z
q: quit the prompt
enter the index of the commit you want to target: Working copy (@) now at: zsuskuln e7382ca4 (empty) z
Parent commit (@-) : qpvuntsm 007e88d2 (empty) x
Parent commit (@-) : kkmpptxz ab947132 (empty) y
[EOF]
");
}
#[test]
fn test_prev_prompts_on_multiple_parents() {
let test_env = TestEnvironment::default();
test_env.run_jj_in(".", ["git", "init", "repo"]).success();
let work_dir = test_env.work_dir("repo");
work_dir.run_jj(["commit", "-m", "first"]).success();
work_dir.run_jj(["new", "@--"]).success();
work_dir.run_jj(["commit", "-m", "second"]).success();
work_dir.run_jj(["new", "@--"]).success();
work_dir.run_jj(["commit", "-m", "third"]).success();
work_dir.run_jj(["new", "@--+"]).success();
work_dir.run_jj(["commit", "-m", "merge"]).success();
work_dir.run_jj(["commit", "-m", "merge+1"]).success();
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ yostqsxwqrlt
○ vruxwmqvtpmx merge+1
○ yqosqzytrlsw merge
├─┬─╮
│ │ ○ qpvuntsmwlqt first
│ ○ │ kkmpptxzrspx second
│ ├─╯
○ │ mzvwutvlkqwt third
├─╯
◆ zzzzzzzzzzzz
[EOF]
");
let output = work_dir.run_jj_with(|cmd| {
force_interactive(cmd)
.args(["prev", "2"])
.write_stdin("3\n")
});
insta::assert_snapshot!(output, @r"
------- stderr -------
ambiguous prev commit, choose one to target:
1: mzvwutvl 5ec63817 (empty) third
2: kkmpptxz e8959fbd (empty) second
3: qpvuntsm 68a50538 (empty) first
q: quit the prompt
enter the index of the commit you want to target: Working copy (@) now at: kpqxywon 5448803a (empty) (no description set)
Parent commit (@-) : qpvuntsm 68a50538 (empty) first
[EOF]
");
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ kpqxywonksrl
│ ○ vruxwmqvtpmx merge+1
│ ○ yqosqzytrlsw merge
╭─┼─╮
○ │ │ qpvuntsmwlqt first
│ │ ○ kkmpptxzrspx second
├───╯
│ ○ mzvwutvlkqwt third
├─╯
◆ zzzzzzzzzzzz
[EOF]
");
work_dir.run_jj(["next"]).success();
work_dir.run_jj(["edit", "@-"]).success();
insta::assert_snapshot!(get_log_output(&work_dir), @r"
○ vruxwmqvtpmx merge+1
@ yqosqzytrlsw merge
├─┬─╮
│ │ ○ qpvuntsmwlqt first
│ ○ │ kkmpptxzrspx second
│ ├─╯
○ │ mzvwutvlkqwt third
├─╯
◆ zzzzzzzzzzzz
[EOF]
");
let output = work_dir.run_jj(["next", "--no-edit"]);
insta::assert_snapshot!(output,@r"
------- stderr -------
Error: No other descendant found 1 commit(s) forward from the working copy parent(s)
Hint: Working copy parent: mzvwutvl 5ec63817 (empty) third
Hint: Working copy parent: kkmpptxz e8959fbd (empty) second
Hint: Working copy parent: qpvuntsm 68a50538 (empty) first
[EOF]
[exit status: 1]
");
}
#[test]
fn test_prev_beyond_root_fails() {
let test_env = TestEnvironment::default();
test_env.run_jj_in(".", ["git", "init", "repo"]).success();
let work_dir = test_env.work_dir("repo");
work_dir.run_jj(["commit", "-m", "first"]).success();
work_dir.run_jj(["commit", "-m", "second"]).success();
work_dir.run_jj(["commit", "-m", "third"]).success();
work_dir.run_jj(["commit", "-m", "fourth"]).success();
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ mzvwutvlkqwt
○ zsuskulnrvyr fourth
○ kkmpptxzrspx third
○ rlvkpnrzqnoo second
○ qpvuntsmwlqt first
◆ zzzzzzzzzzzz
[EOF]
");
let output = work_dir.run_jj(["prev", "5"]);
insta::assert_snapshot!(output,@r"
------- stderr -------
Error: No ancestor found 5 commit(s) back from the working copy parents(s)
Hint: Working copy parent: zsuskuln c5025ce1 (empty) fourth
[EOF]
[exit status: 1]
");
}
#[test]
fn test_prev_editing() {
let test_env = TestEnvironment::default();
test_env.run_jj_in(".", ["git", "init", "repo"]).success();
let work_dir = test_env.work_dir("repo");
work_dir.run_jj(["commit", "-m", "first"]).success();
work_dir.run_jj(["commit", "-m", "second"]).success();
work_dir.run_jj(["commit", "-m", "third"]).success();
work_dir.run_jj(["commit", "-m", "fourth"]).success();
work_dir.run_jj(["edit", "@-"]).success();
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ zsuskulnrvyr fourth
○ kkmpptxzrspx third
○ rlvkpnrzqnoo second
○ qpvuntsmwlqt first
◆ zzzzzzzzzzzz
[EOF]
");
let output = work_dir.run_jj(["prev", "--edit"]);
insta::assert_snapshot!(output, @r"
------- stderr -------
Working copy (@) now at: kkmpptxz 7576de42 (empty) third
Parent commit (@-) : rlvkpnrz 9439bf06 (empty) second
[EOF]
");
insta::assert_snapshot!(get_log_output(&work_dir), @r"
○ zsuskulnrvyr fourth
@ kkmpptxzrspx third
○ rlvkpnrzqnoo second
○ qpvuntsmwlqt first
◆ zzzzzzzzzzzz
[EOF]
");
}
#[test]
fn test_next_editing() {
let test_env = TestEnvironment::default();
test_env.run_jj_in(".", ["git", "init", "repo"]).success();
let work_dir = test_env.work_dir("repo");
work_dir.run_jj(["commit", "-m", "first"]).success();
work_dir.run_jj(["commit", "-m", "second"]).success();
work_dir.run_jj(["commit", "-m", "third"]).success();
work_dir.run_jj(["commit", "-m", "fourth"]).success();
work_dir.run_jj(["edit", "@---"]).success();
insta::assert_snapshot!(get_log_output(&work_dir), @r"
○ zsuskulnrvyr fourth
○ kkmpptxzrspx third
@ rlvkpnrzqnoo second
○ qpvuntsmwlqt first
◆ zzzzzzzzzzzz
[EOF]
");
let output = work_dir.run_jj(["next", "--edit"]);
insta::assert_snapshot!(output, @r"
------- stderr -------
Working copy (@) now at: kkmpptxz 7576de42 (empty) third
Parent commit (@-) : rlvkpnrz 9439bf06 (empty) second
[EOF]
");
insta::assert_snapshot!(get_log_output(&work_dir), @r"
○ zsuskulnrvyr fourth
@ kkmpptxzrspx third
○ rlvkpnrzqnoo second
○ qpvuntsmwlqt first
◆ zzzzzzzzzzzz
[EOF]
");
}
#[test]
fn test_prev_conflict() {
let test_env = TestEnvironment::default();
test_env.run_jj_in(".", ["git", "init", "repo"]).success();
let work_dir = test_env.work_dir("repo");
work_dir.write_file("content.txt", "first");
work_dir.run_jj(["commit", "-m", "first"]).success();
work_dir.write_file("content.txt", "second");
work_dir.run_jj(["commit", "-m", "second"]).success();
work_dir.run_jj(["commit", "-m", "third"]).success();
work_dir.run_jj(["edit", "description(first)"]).success();
work_dir.write_file("content.txt", "first+1");
work_dir.run_jj(["new", "description(third)"]).success();
work_dir.run_jj(["commit", "-m", "fourth"]).success();
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ yqosqzytrlsw conflict
× royxmykxtrkr conflict fourth
× kkmpptxzrspx conflict third
× rlvkpnrzqnoo conflict second
○ qpvuntsmwlqt first
◆ zzzzzzzzzzzz
[EOF]
");
work_dir.run_jj(["prev", "--conflict"]).success();
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ yostqsxwqrlt conflict
│ × royxmykxtrkr conflict fourth
├─╯
× kkmpptxzrspx conflict third
× rlvkpnrzqnoo conflict second
○ qpvuntsmwlqt first
◆ zzzzzzzzzzzz
[EOF]
");
}
#[test]
fn test_prev_conflict_editing() {
let test_env = TestEnvironment::default();
test_env.run_jj_in(".", ["git", "init", "repo"]).success();
let work_dir = test_env.work_dir("repo");
work_dir.run_jj(["commit", "-m", "first"]).success();
work_dir.run_jj(["commit", "-m", "second"]).success();
work_dir.write_file("content.txt", "second");
work_dir.run_jj(["commit", "-m", "third"]).success();
work_dir.run_jj(["edit", "description(first)"]).success();
work_dir.write_file("content.txt", "first text");
work_dir.run_jj(["new", "description(third)"]).success();
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ royxmykxtrkr conflict
× kkmpptxzrspx conflict third
○ rlvkpnrzqnoo second
○ qpvuntsmwlqt first
◆ zzzzzzzzzzzz
[EOF]
");
work_dir.run_jj(["prev", "--conflict", "--edit"]).success();
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ kkmpptxzrspx conflict third
○ rlvkpnrzqnoo second
○ qpvuntsmwlqt first
◆ zzzzzzzzzzzz
[EOF]
");
}
#[test]
fn test_next_conflict() {
let test_env = TestEnvironment::default();
test_env.run_jj_in(".", ["git", "init", "repo"]).success();
let work_dir = test_env.work_dir("repo");
work_dir.write_file("content.txt", "first");
work_dir.run_jj(["commit", "-m", "first"]).success();
work_dir.run_jj(["commit", "-m", "second"]).success();
work_dir.write_file("content.txt", "third");
work_dir.run_jj(["commit", "-m", "third"]).success();
work_dir.run_jj(["new", "description(first)"]).success();
work_dir.write_file("content.txt", "first v2");
work_dir
.run_jj(["squash", "--into", "description(third)"])
.success();
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ royxmykxtrkr
│ × kkmpptxzrspx conflict third
│ ○ rlvkpnrzqnoo second
├─╯
○ qpvuntsmwlqt first
◆ zzzzzzzzzzzz
[EOF]
");
work_dir.run_jj(["next", "--conflict"]).success();
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ vruxwmqvtpmx conflict
× kkmpptxzrspx conflict third
○ rlvkpnrzqnoo second
○ qpvuntsmwlqt first
◆ zzzzzzzzzzzz
[EOF]
");
}
#[test]
fn test_next_conflict_editing() {
let test_env = TestEnvironment::default();
test_env.run_jj_in(".", ["git", "init", "repo"]).success();
let work_dir = test_env.work_dir("repo");
work_dir.run_jj(["commit", "-m", "first"]).success();
work_dir.write_file("content.txt", "second");
work_dir.run_jj(["commit", "-m", "second"]).success();
work_dir.write_file("content.txt", "third");
work_dir.run_jj(["edit", "description(second)"]).success();
work_dir.write_file("content.txt", "modified second");
work_dir.run_jj(["edit", "@-"]).success();
insta::assert_snapshot!(get_log_output(&work_dir), @r"
× kkmpptxzrspx conflict
○ rlvkpnrzqnoo second
@ qpvuntsmwlqt first
◆ zzzzzzzzzzzz
[EOF]
");
work_dir.run_jj(["next", "--conflict", "--edit"]).success();
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ kkmpptxzrspx conflict
○ rlvkpnrzqnoo second
○ qpvuntsmwlqt first
◆ zzzzzzzzzzzz
[EOF]
");
}
#[test]
fn test_next_conflict_head() {
let test_env = TestEnvironment::default();
test_env.run_jj_in(".", ["git", "init", "repo"]).success();
let work_dir = test_env.work_dir("repo");
work_dir.write_file("file", "first");
work_dir.run_jj(["new"]).success();
work_dir.write_file("file", "second");
work_dir.run_jj(["abandon", "@-"]).success();
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ rlvkpnrzqnoo conflict
◆ zzzzzzzzzzzz
[EOF]
");
let output = work_dir.run_jj(["next", "--conflict"]);
insta::assert_snapshot!(output, @r"
------- stderr -------
Error: The working copy parent(s) have no other descendants with conflicts
Hint: Working copy parent: zzzzzzzz 00000000 (empty) (no description set)
[EOF]
[exit status: 1]
");
let output = work_dir.run_jj(["next", "--conflict", "--edit"]);
insta::assert_snapshot!(output, @r"
------- stderr -------
Error: The working copy has no descendants with conflicts
Hint: Working copy: rlvkpnrz 5f088cac (conflict) (no description set)
[EOF]
[exit status: 1]
");
}
#[test]
fn test_movement_edit_mode_true() {
let test_env = TestEnvironment::default();
test_env.add_config(r#"ui.movement.edit = true"#);
test_env.run_jj_in(".", ["git", "init", "repo"]).success();
let work_dir = test_env.work_dir("repo");
work_dir.run_jj(["commit", "-m", "first"]).success();
work_dir.run_jj(["commit", "-m", "second"]).success();
work_dir.run_jj(["commit", "-m", "third"]).success();
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ zsuskulnrvyr
○ kkmpptxzrspx third
○ rlvkpnrzqnoo second
○ qpvuntsmwlqt first
◆ zzzzzzzzzzzz
[EOF]
");
work_dir.run_jj(["prev"]).success();
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ kkmpptxzrspx third
○ rlvkpnrzqnoo second
○ qpvuntsmwlqt first
◆ zzzzzzzzzzzz
[EOF]
");
let output = work_dir.run_jj(["prev"]);
insta::assert_snapshot!(output, @r"
------- stderr -------
Working copy (@) now at: rlvkpnrz 9439bf06 (empty) second
Parent commit (@-) : qpvuntsm 68a50538 (empty) first
[EOF]
");
insta::assert_snapshot!(get_log_output(&work_dir), @r"
○ kkmpptxzrspx third
@ rlvkpnrzqnoo second
○ qpvuntsmwlqt first
◆ zzzzzzzzzzzz
[EOF]
");
let output = work_dir.run_jj(["prev"]);
insta::assert_snapshot!(output, @r"
------- stderr -------
Working copy (@) now at: qpvuntsm 68a50538 (empty) first
Parent commit (@-) : zzzzzzzz 00000000 (empty) (no description set)
[EOF]
");
insta::assert_snapshot!(get_log_output(&work_dir), @r"
○ kkmpptxzrspx third
○ rlvkpnrzqnoo second
@ qpvuntsmwlqt first
◆ zzzzzzzzzzzz
[EOF]
");
let output = work_dir.run_jj(["prev"]);
insta::assert_snapshot!(output, @r"
------- stderr -------
Error: The root commit 000000000000 is immutable
[EOF]
[exit status: 1]
");
let output = work_dir.run_jj(["next"]);
insta::assert_snapshot!(output, @r"
------- stderr -------
Working copy (@) now at: rlvkpnrz 9439bf06 (empty) second
Parent commit (@-) : qpvuntsm 68a50538 (empty) first
[EOF]
");
insta::assert_snapshot!(get_log_output(&work_dir), @r"
○ kkmpptxzrspx third
@ rlvkpnrzqnoo second
○ qpvuntsmwlqt first
◆ zzzzzzzzzzzz
[EOF]
");
let output = work_dir.run_jj(["next"]);
insta::assert_snapshot!(output, @r"
------- stderr -------
Working copy (@) now at: kkmpptxz 7576de42 (empty) third
Parent commit (@-) : rlvkpnrz 9439bf06 (empty) second
[EOF]
");
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ kkmpptxzrspx third
○ rlvkpnrzqnoo second
○ qpvuntsmwlqt first
◆ zzzzzzzzzzzz
[EOF]
");
let output = work_dir.run_jj(["prev", "--no-edit"]);
insta::assert_snapshot!(output, @r"
------- stderr -------
Working copy (@) now at: uyznsvlq 1062d305 (empty) (no description set)
Parent commit (@-) : qpvuntsm 68a50538 (empty) first
[EOF]
");
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ uyznsvlquzzm
│ ○ kkmpptxzrspx third
│ ○ rlvkpnrzqnoo second
├─╯
○ qpvuntsmwlqt first
◆ zzzzzzzzzzzz
[EOF]
");
let output = work_dir.run_jj(["next", "--no-edit"]);
insta::assert_snapshot!(output, @r"
------- stderr -------
Working copy (@) now at: xtnwkqum ccbc5bff (empty) (no description set)
Parent commit (@-) : rlvkpnrz 9439bf06 (empty) second
[EOF]
");
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ xtnwkqumpolk
│ ○ kkmpptxzrspx third
├─╯
○ rlvkpnrzqnoo second
○ qpvuntsmwlqt first
◆ zzzzzzzzzzzz
[EOF]
");
let output = work_dir.run_jj(["next"]);
insta::assert_snapshot!(output, @r"
------- stderr -------
Error: No descendant found 1 commit(s) forward from the working copy
Hint: Working copy: xtnwkqum ccbc5bff (empty) (no description set)
[EOF]
[exit status: 1]
");
}
#[test]
fn test_movement_edit_mode_false() {
let test_env = TestEnvironment::default();
test_env.add_config(r#"ui.movement.edit = false"#);
test_env.run_jj_in(".", ["git", "init", "repo"]).success();
let work_dir = test_env.work_dir("repo");
work_dir.run_jj(["commit", "-m", "first"]).success();
work_dir.run_jj(["commit", "-m", "second"]).success();
work_dir.run_jj(["commit", "-m", "third"]).success();
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ zsuskulnrvyr
○ kkmpptxzrspx third
○ rlvkpnrzqnoo second
○ qpvuntsmwlqt first
◆ zzzzzzzzzzzz
[EOF]
");
work_dir.run_jj(["prev"]).success();
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ royxmykxtrkr
│ ○ kkmpptxzrspx third
├─╯
○ rlvkpnrzqnoo second
○ qpvuntsmwlqt first
◆ zzzzzzzzzzzz
[EOF]
");
let output = work_dir.run_jj(["prev", "--no-edit"]);
insta::assert_snapshot!(output, @r"
------- stderr -------
Working copy (@) now at: vruxwmqv 1a9aa547 (empty) (no description set)
Parent commit (@-) : qpvuntsm 68a50538 (empty) first
[EOF]
");
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ vruxwmqvtpmx
│ ○ kkmpptxzrspx third
│ ○ rlvkpnrzqnoo second
├─╯
○ qpvuntsmwlqt first
◆ zzzzzzzzzzzz
[EOF]
");
let output = work_dir.run_jj(["prev", "3"]);
insta::assert_snapshot!(output, @r"
------- stderr -------
Error: No ancestor found 3 commit(s) back from the working copy parents(s)
Hint: Working copy parent: qpvuntsm 68a50538 (empty) first
[EOF]
[exit status: 1]
");
let output = work_dir.run_jj(["next"]);
insta::assert_snapshot!(output, @r"
------- stderr -------
Working copy (@) now at: kpqxywon 97dd6a5a (empty) (no description set)
Parent commit (@-) : rlvkpnrz 9439bf06 (empty) second
[EOF]
");
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ kpqxywonksrl
│ ○ kkmpptxzrspx third
├─╯
○ rlvkpnrzqnoo second
○ qpvuntsmwlqt first
◆ zzzzzzzzzzzz
[EOF]
");
let output = work_dir.run_jj(["next", "--no-edit"]);
insta::assert_snapshot!(output, @r"
------- stderr -------
Working copy (@) now at: wqnwkozp 525e0f84 (empty) (no description set)
Parent commit (@-) : kkmpptxz 7576de42 (empty) third
[EOF]
");
let output = work_dir.run_jj(["prev", "--edit", "2"]);
insta::assert_snapshot!(output, @r"
------- stderr -------
Working copy (@) now at: rlvkpnrz 9439bf06 (empty) second
Parent commit (@-) : qpvuntsm 68a50538 (empty) first
[EOF]
");
insta::assert_snapshot!(get_log_output(&work_dir), @r"
○ kkmpptxzrspx third
@ rlvkpnrzqnoo second
○ qpvuntsmwlqt first
◆ zzzzzzzzzzzz
[EOF]
");
let output = work_dir.run_jj(["next", "--edit"]);
insta::assert_snapshot!(output, @r"
------- stderr -------
Working copy (@) now at: kkmpptxz 7576de42 (empty) third
Parent commit (@-) : rlvkpnrz 9439bf06 (empty) second
[EOF]
");
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ kkmpptxzrspx third
○ rlvkpnrzqnoo second
○ qpvuntsmwlqt first
◆ zzzzzzzzzzzz
[EOF]
");
}
#[test]
fn test_next_offset_when_wc_has_descendants() {
let test_env = TestEnvironment::default();
test_env.add_config(r#"ui.movement.edit = false"#);
test_env.run_jj_in(".", ["git", "init", "repo"]).success();
let work_dir = test_env.work_dir("repo");
work_dir.run_jj(["commit", "-m", "base"]).success();
work_dir.run_jj(["commit", "-m", "right-wc"]).success();
work_dir.run_jj(["commit", "-m", "right-1"]).success();
work_dir.run_jj(["commit", "-m", "right-2"]).success();
work_dir.run_jj(["new", "description(base)"]).success();
work_dir.run_jj(["commit", "-m", "left-wc"]).success();
work_dir.run_jj(["commit", "-m", "left-1"]).success();
work_dir.run_jj(["commit", "-m", "left-2"]).success();
work_dir.run_jj(["edit", "description(right-wc)"]).success();
insta::assert_snapshot!(get_log_output(&work_dir), @r"
○ zsuskulnrvyr right-2
○ kkmpptxzrspx right-1
@ rlvkpnrzqnoo right-wc
│ ○ vruxwmqvtpmx left-2
│ ○ yqosqzytrlsw left-1
│ ○ royxmykxtrkr left-wc
├─╯
○ qpvuntsmwlqt base
◆ zzzzzzzzzzzz
[EOF]
");
work_dir.run_jj(["next", "2"]).success();
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ kmkuslswpqwq
│ ○ vruxwmqvtpmx left-2
├─╯
○ yqosqzytrlsw left-1
○ royxmykxtrkr left-wc
│ ○ zsuskulnrvyr right-2
│ ○ kkmpptxzrspx right-1
│ ○ rlvkpnrzqnoo right-wc
├─╯
○ qpvuntsmwlqt base
◆ zzzzzzzzzzzz
[EOF]
");
work_dir.run_jj(["edit", "description(left-wc)"]).success();
insta::assert_snapshot!(get_log_output(&work_dir), @r"
○ vruxwmqvtpmx left-2
○ yqosqzytrlsw left-1
@ royxmykxtrkr left-wc
│ ○ zsuskulnrvyr right-2
│ ○ kkmpptxzrspx right-1
│ ○ rlvkpnrzqnoo right-wc
├─╯
○ qpvuntsmwlqt base
◆ zzzzzzzzzzzz
[EOF]
");
work_dir.run_jj(["next"]).success();
insta::assert_snapshot!(get_log_output(&work_dir), @r"
@ nkmrtpmomlro
│ ○ zsuskulnrvyr right-2
│ ○ kkmpptxzrspx right-1
├─╯
○ rlvkpnrzqnoo right-wc
│ ○ vruxwmqvtpmx left-2
│ ○ yqosqzytrlsw left-1
│ ○ royxmykxtrkr left-wc
├─╯
○ qpvuntsmwlqt base
◆ zzzzzzzzzzzz
[EOF]
");
}
#[must_use]
fn get_log_output(work_dir: &TestWorkDir) -> CommandOutput {
let template = r#"separate(" ", change_id.short(), local_bookmarks, if(conflict, "conflict"), description)"#;
work_dir.run_jj(["log", "-T", template])
}