// Copyright 2022 The Jujutsu Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. use crate::common::to_toml_value; use crate::common::TestEnvironment; #[test] fn test_evolog_with_or_without_diff() { 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("file1", "foo\n"); work_dir.run_jj(["new", "-m", "my description"]).success(); work_dir.write_file("file1", "foo\nbar\n"); work_dir.write_file("file2", "foo\n"); work_dir .run_jj(["rebase", "-r", "@", "-d", "root()"]) .success(); work_dir.write_file("file1", "resolved\n"); let output = work_dir.run_jj(["evolog"]); insta::assert_snapshot!(output, @r" @ rlvkpnrz test.user@example.com 2001-02-03 08:05:10 66b42ad3 │ my description × rlvkpnrz hidden test.user@example.com 2001-02-03 08:05:09 07b18245 conflict │ my description ○ rlvkpnrz hidden test.user@example.com 2001-02-03 08:05:09 068224a7 │ my description ○ rlvkpnrz hidden test.user@example.com 2001-02-03 08:05:08 2b023b5f (empty) my description [EOF] "); // Color let output = work_dir.run_jj(["--color=always", "evolog"]); insta::assert_snapshot!(output, @r" @ rlvkpnrz test.user@example.com 2001-02-03 08:05:10 66b42ad3 │ my description × rlvkpnrz hidden test.user@example.com 2001-02-03 08:05:09 07b18245 conflict │ my description ○ rlvkpnrz hidden test.user@example.com 2001-02-03 08:05:09 068224a7 │ my description ○ rlvkpnrz hidden test.user@example.com 2001-02-03 08:05:08 2b023b5f (empty) my description [EOF] "); // There should be no diff caused by the rebase because it was a pure rebase // (even even though it resulted in a conflict). let output = work_dir.run_jj(["evolog", "-p"]); insta::assert_snapshot!(output, @r" @ rlvkpnrz test.user@example.com 2001-02-03 08:05:10 66b42ad3 │ my description │ Resolved conflict in file1: │ 1 : <<<<<<< Conflict 1 of 1 │ 2 : %%%%%%% Changes from base to side #1 │ 3 : -foo │ 4 : +++++++ Contents of side #2 │ 5 : foo │ 6 : bar │ 7 1: >>>>>>> Conflict 1 of 1 endsresolved × rlvkpnrz hidden test.user@example.com 2001-02-03 08:05:09 07b18245 conflict │ my description ○ rlvkpnrz hidden test.user@example.com 2001-02-03 08:05:09 068224a7 │ my description │ Modified regular file file1: │ 1 1: foo │ 2: bar │ Added regular file file2: │ 1: foo ○ rlvkpnrz hidden test.user@example.com 2001-02-03 08:05:08 2b023b5f (empty) my description [EOF] "); // Test `--limit` let output = work_dir.run_jj(["evolog", "--limit=2"]); insta::assert_snapshot!(output, @r" @ rlvkpnrz test.user@example.com 2001-02-03 08:05:10 66b42ad3 │ my description × rlvkpnrz hidden test.user@example.com 2001-02-03 08:05:09 07b18245 conflict │ my description [EOF] "); // Test `--no-graph` let output = work_dir.run_jj(["evolog", "--no-graph"]); insta::assert_snapshot!(output, @r" rlvkpnrz test.user@example.com 2001-02-03 08:05:10 66b42ad3 my description rlvkpnrz hidden test.user@example.com 2001-02-03 08:05:09 07b18245 conflict my description rlvkpnrz hidden test.user@example.com 2001-02-03 08:05:09 068224a7 my description rlvkpnrz hidden test.user@example.com 2001-02-03 08:05:08 2b023b5f (empty) my description [EOF] "); // Test `--git` format, and that it implies `-p` let output = work_dir.run_jj(["evolog", "--no-graph", "--git"]); insta::assert_snapshot!(output, @r" rlvkpnrz test.user@example.com 2001-02-03 08:05:10 66b42ad3 my description diff --git a/file1 b/file1 index 0000000000..2ab19ae607 100644 --- 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 ->>>>>>> Conflict 1 of 1 ends +resolved rlvkpnrz hidden test.user@example.com 2001-02-03 08:05:09 07b18245 conflict my description rlvkpnrz hidden test.user@example.com 2001-02-03 08:05:09 068224a7 my description diff --git a/file1 b/file1 index 257cc5642c..3bd1f0e297 100644 --- a/file1 +++ b/file1 @@ -1,1 +1,2 @@ foo +bar diff --git a/file2 b/file2 new file mode 100644 index 0000000000..257cc5642c --- /dev/null +++ b/file2 @@ -0,0 +1,1 @@ +foo rlvkpnrz hidden test.user@example.com 2001-02-03 08:05:08 2b023b5f (empty) my description [EOF] "); } #[test] fn test_evolog_with_custom_symbols() { 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("file1", "foo\n"); work_dir.run_jj(["new", "-m", "my description"]).success(); work_dir.write_file("file1", "foo\nbar\n"); work_dir.write_file("file2", "foo\n"); work_dir .run_jj(["rebase", "-r", "@", "-d", "root()"]) .success(); work_dir.write_file("file1", "resolved\n"); let config = "templates.log_node='if(current_working_copy, \"$\", \"┝\")'"; let output = work_dir.run_jj(["evolog", "--config", config]); insta::assert_snapshot!(output, @r" $ rlvkpnrz test.user@example.com 2001-02-03 08:05:10 66b42ad3 │ my description ┝ rlvkpnrz hidden test.user@example.com 2001-02-03 08:05:09 07b18245 conflict │ my description ┝ rlvkpnrz hidden test.user@example.com 2001-02-03 08:05:09 068224a7 │ my description ┝ rlvkpnrz hidden test.user@example.com 2001-02-03 08:05:08 2b023b5f (empty) my description [EOF] "); } #[test] fn test_evolog_word_wrap() { let test_env = TestEnvironment::default(); test_env.run_jj_in(".", ["git", "init", "repo"]).success(); let work_dir = test_env.work_dir("repo"); let render = |args: &[&str], columns: u32, word_wrap: bool| { let word_wrap = to_toml_value(word_wrap); work_dir.run_jj_with(|cmd| { cmd.args(args) .arg(format!("--config=ui.log-word-wrap={word_wrap}")) .env("COLUMNS", columns.to_string()) }) }; work_dir.run_jj(["describe", "-m", "first"]).success(); // ui.log-word-wrap option applies to both graph/no-graph outputs insta::assert_snapshot!(render(&["evolog"], 40, false), @r" @ qpvuntsm test.user@example.com 2001-02-03 08:05:08 fa15625b │ (empty) first ○ qpvuntsm hidden test.user@example.com 2001-02-03 08:05:07 230dd059 (empty) (no description set) [EOF] "); insta::assert_snapshot!(render(&["evolog"], 40, true), @r" @ qpvuntsm test.user@example.com │ 2001-02-03 08:05:08 fa15625b │ (empty) first ○ qpvuntsm hidden test.user@example.com 2001-02-03 08:05:07 230dd059 (empty) (no description set) [EOF] "); insta::assert_snapshot!(render(&["evolog", "--no-graph"], 40, false), @r" qpvuntsm test.user@example.com 2001-02-03 08:05:08 fa15625b (empty) first qpvuntsm hidden test.user@example.com 2001-02-03 08:05:07 230dd059 (empty) (no description set) [EOF] "); insta::assert_snapshot!(render(&["evolog", "--no-graph"], 40, true), @r" qpvuntsm test.user@example.com 2001-02-03 08:05:08 fa15625b (empty) first qpvuntsm hidden test.user@example.com 2001-02-03 08:05:07 230dd059 (empty) (no description set) [EOF] "); } #[test] fn test_evolog_squash() { 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(["describe", "-m", "first"]).success(); work_dir.write_file("file1", "foo\n"); work_dir.run_jj(["new", "-m", "second"]).success(); work_dir.write_file("file1", "foo\nbar\n"); // not partial work_dir.run_jj(["squash", "-m", "squashed 1"]).success(); work_dir.run_jj(["describe", "-m", "third"]).success(); work_dir.write_file("file1", "foo\nbar\nbaz\n"); work_dir.write_file("file2", "foo2\n"); work_dir.write_file("file3", "foo3\n"); // partial work_dir .run_jj(["squash", "-m", "squashed 2", "file1"]) .success(); work_dir.run_jj(["new", "-m", "fourth"]).success(); work_dir.write_file("file4", "foo4\n"); work_dir.run_jj(["new", "-m", "fifth"]).success(); work_dir.write_file("file5", "foo5\n"); // multiple sources work_dir .run_jj([ "squash", "-msquashed 3", "--from=description('fourth')|description('fifth')", "--into=description('squash')", ]) .success(); let output = work_dir.run_jj(["evolog", "-p", "-r", "description('squash')"]); insta::assert_snapshot!(output, @r" ○ qpvuntsm test.user@example.com 2001-02-03 08:05:15 d49749bf ├─┬─╮ squashed 3 │ │ ○ vruxwmqv hidden test.user@example.com 2001-02-03 08:05:15 8f2ae2b5 │ │ │ fifth │ │ │ Added regular file file5: │ │ │ 1: foo5 │ │ ○ vruxwmqv hidden test.user@example.com 2001-02-03 08:05:14 04d28ca9 │ │ (empty) fifth │ ○ yqosqzyt hidden test.user@example.com 2001-02-03 08:05:14 c5801e10 │ │ fourth │ │ Added regular file file4: │ │ 1: foo4 │ ○ yqosqzyt hidden test.user@example.com 2001-02-03 08:05:13 bb54a199 │ (empty) fourth ○ qpvuntsm hidden test.user@example.com 2001-02-03 08:05:12 1408a0a7 ├─╮ squashed 2 │ │ Removed regular file file2: │ │ 1 : foo2 │ │ Removed regular file file3: │ │ 1 : foo3 │ ○ zsuskuln hidden test.user@example.com 2001-02-03 08:05:12 c9460789 │ │ third │ │ Modified regular file file1: │ │ 1 1: foo │ │ 2 2: bar │ │ 3: baz │ │ Added regular file file2: │ │ 1: foo2 │ │ Added regular file file3: │ │ 1: foo3 │ ○ zsuskuln hidden test.user@example.com 2001-02-03 08:05:11 66645763 │ │ (empty) third │ ○ zsuskuln hidden test.user@example.com 2001-02-03 08:05:10 1c7afcb4 │ (empty) (no description set) ○ qpvuntsm hidden test.user@example.com 2001-02-03 08:05:10 e3c2a446 ├─╮ squashed 1 │ ○ kkmpptxz hidden test.user@example.com 2001-02-03 08:05:10 46acd22a │ │ second │ │ Modified regular file file1: │ │ 1 1: foo │ │ 2: bar │ ○ kkmpptxz hidden test.user@example.com 2001-02-03 08:05:09 cba41deb │ (empty) second ○ qpvuntsm hidden test.user@example.com 2001-02-03 08:05:09 766420db │ first │ Added regular file file1: │ 1: foo ○ qpvuntsm hidden test.user@example.com 2001-02-03 08:05:08 fa15625b │ (empty) first ○ qpvuntsm hidden test.user@example.com 2001-02-03 08:05:07 230dd059 (empty) (no description set) [EOF] "); } #[test] fn test_evolog_with_no_template() { let test_env = TestEnvironment::default(); test_env.run_jj_in(".", ["git", "init", "repo"]).success(); let work_dir = test_env.work_dir("repo"); let output = work_dir.run_jj(["evolog", "-T"]); insta::assert_snapshot!(output, @r" ------- stderr ------- error: a value is required for '--template