log: move commit ID off to the right
We have talked about showing the commit ID only for divergent changes because it's generally easier to work with the change ID, and it's less likely to result in a divergent change. However, it's useful to have the commit ID available for pasting into e.g. a commit message or the GitHub UI. To try to steer users towards using the change ID, this commit moves the commit ID off to the right in the log output. I put it just after the "divergent" field, because that makes it close to how I imagine it would look if we decided to hide the commit ID except for divergent changes. I was thinking that could be rendered as "divergent (abc123)". So if we add config to hide the commit ID, then it would be rendered almost the same for divergent commits (just with the added parentheses). It would also make sense to replace the "divergent" field by a question mark on the change ID, since change IDs basically behave like branches. If we do that, then the placement of the commit ID I picked in this commit does not make sense.
|
@ -49,6 +49,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||
* (#254) Branches that have a different target on some remote than they do
|
||||
locally are now indicated by an asterisk suffix (e.g. `main*`) in `jj log`.
|
||||
|
||||
* The commit ID was moved from first on the line in `jj log` output to close to
|
||||
the end. The goal is to encourage users to use the change ID instead, since
|
||||
that is generally more convenient, and it reduces the risk of creating
|
||||
divergent commits.
|
||||
|
||||
### Fixed bugs
|
||||
|
||||
* (#463) A bug in the export of branches to Git caused spurious conflicted
|
||||
|
|
Before Width: | Height: | Size: 136 KiB After Width: | Height: | Size: 136 KiB |
Before Width: | Height: | Size: 251 KiB After Width: | Height: | Size: 250 KiB |
Before Width: | Height: | Size: 297 KiB After Width: | Height: | Size: 301 KiB |
Before Width: | Height: | Size: 265 KiB After Width: | Height: | Size: 264 KiB |
Before Width: | Height: | Size: 270 KiB After Width: | Height: | Size: 271 KiB |
|
@ -127,19 +127,20 @@ You're probably familiar with `git log`. Jujutsu has very similar functionality
|
|||
in its `jj log` command:
|
||||
```shell script
|
||||
$ jj log
|
||||
@ 192b456b024b f39aeb1a0200 martinvonz@google.com 2021-05-23 23:10:27.000 -07:00
|
||||
@ f39aeb1a0200 martinvonz@google.com 2021-05-23 23:10:27.000 -07:00 192b456b024b
|
||||
| (no description set)
|
||||
o fb563a4c6d26 f63e76f175b9 martinvonz@google.com 2021-05-23 22:13:45.000 -07:00
|
||||
o f63e76f175b9 martinvonz@google.com 2021-05-23 22:13:45.000 -07:00 fb563a4c6d26
|
||||
| Jujutsu is ready!
|
||||
o 080a9b37ff7e 6a91b4ba16c7 martinvonz@google.com 2021-05-23 22:08:37.000 -07:00 main
|
||||
o 6a91b4ba16c7 martinvonz@google.com 2021-05-23 22:08:37.000 -07:00 main 080a9b37ff7e
|
||||
~ cli: make `jj st` show parent commit before working copy commit
|
||||
```
|
||||
|
||||
The `@` indicates the working-copy commit. The first hash on a line is the
|
||||
commit ID. The second hash is a "change ID", which is an ID that follows the
|
||||
commit as it's rewritten (similar to Gerrit's Change-Id). You can give either
|
||||
hash to commands that take revisions as arguments. We will generally prefer
|
||||
change IDs because they stay the same when the commit is rewritten.
|
||||
"change ID", which is an ID that follows the commit as it's rewritten (similar
|
||||
to Gerrit's Change-Id). The second hash is the commit ID, which changes when you
|
||||
rewrite the commit. You can give either hash to commands that take revisions as
|
||||
arguments. We will generally prefer change IDs because they stay the same when
|
||||
the commit is rewritten.
|
||||
|
||||
By default, `jj log` list your local commits, with some remote commits added for
|
||||
context. The `~` indicates that the commit has parents that are not included
|
||||
|
@ -151,11 +152,11 @@ all commits pointed to by branches. We can combine expressions with `|` for
|
|||
union, `&` for intersection and `~` for difference. For example:
|
||||
```shell script
|
||||
$ jj log -r '@ | root | branches()'
|
||||
@ 192b456b024b f39aeb1a0200 martinvonz@google.com 2021-05-23 23:10:27.000 -07:00
|
||||
@ f39aeb1a0200 martinvonz@google.com 2021-05-23 23:10:27.000 -07:00 192b456b024b
|
||||
: (no description set)
|
||||
o 080a9b37ff7e 6a91b4ba16c7 martinvonz@google.com 2021-05-23 22:08:37.000 -07:00 main
|
||||
o 6a91b4ba16c7 martinvonz@google.com 2021-05-23 22:08:37.000 -07:00 main 080a9b37ff7e
|
||||
: cli: make `jj st` show parent commit before working copy commit
|
||||
o 000000000000 000000000000 1970-01-01 00:00:00.000 +00:00
|
||||
o 000000000000 1970-01-01 00:00:00.000 +00:00 000000000000
|
||||
(no description set)
|
||||
```
|
||||
|
||||
|
@ -184,13 +185,13 @@ Working copy now at: fd571967346e B2
|
|||
$ jj new -m C; echo c > file2
|
||||
Working copy now at: 4ae1e0587eef C
|
||||
$ jj log
|
||||
@ 1769bdaa8d6d 8e6178b84ffb martinvonz@google.com 2021-05-26 12:39:35.000 -07:00
|
||||
@ 8e6178b84ffb martinvonz@google.com 2021-05-26 12:39:35.000 -07:00 1769bdaa8d6d
|
||||
| C
|
||||
o de5690380f40 5548374c0794 martinvonz@google.com 2021-05-26 12:39:30.000 -07:00
|
||||
o 5548374c0794 martinvonz@google.com 2021-05-26 12:39:30.000 -07:00 de5690380f40
|
||||
| B2
|
||||
o 47e336632333 ce619d39bd96 martinvonz@google.com 2021-05-26 12:39:20.000 -07:00
|
||||
o ce619d39bd96 martinvonz@google.com 2021-05-26 12:39:20.000 -07:00 47e336632333
|
||||
| B1
|
||||
o 661432c51c08 cf49e6bec410 martinvonz@google.com 2021-05-26 12:39:12.000 -07:00
|
||||
o cf49e6bec410 martinvonz@google.com 2021-05-26 12:39:12.000 -07:00 661432c51c08
|
||||
~ A
|
||||
```
|
||||
|
||||
|
@ -202,13 +203,13 @@ Rebased 2 commits
|
|||
Working copy now at: 9195b6d2e8dc C
|
||||
Added 0 files, modified 1 files, removed 0 files
|
||||
$ jj log
|
||||
@ 66274d5a7d2d 8e6178b84ffb martinvonz@google.com 2021-05-26 12:39:35.000 -07:00 conflict
|
||||
@ 8e6178b84ffb martinvonz@google.com 2021-05-26 12:39:35.000 -07:00 66274d5a7d2d conflict
|
||||
| C
|
||||
o 0c305a9e6b27 5548374c0794 martinvonz@google.com 2021-05-26 12:39:30.000 -07:00 conflict
|
||||
o 5548374c0794 martinvonz@google.com 2021-05-26 12:39:30.000 -07:00 0c305a9e6b27 conflict
|
||||
| B2
|
||||
| o 47e336632333 ce619d39bd96 martinvonz@google.com 2021-05-26 12:39:20.000 -07:00
|
||||
| o ce619d39bd96 martinvonz@google.com 2021-05-26 12:39:20.000 -07:00 47e336632333
|
||||
|/ B1
|
||||
o 661432c51c08 cf49e6bec410 martinvonz@google.com 2021-05-26 12:39:12.000 -07:00
|
||||
o cf49e6bec410 martinvonz@google.com 2021-05-26 12:39:12.000 -07:00 661432c51c08
|
||||
~ A
|
||||
```
|
||||
|
||||
|
@ -246,15 +247,15 @@ $ jj squash
|
|||
Rebased 1 descendant commits
|
||||
Working copy now at: e659edc4a9fc (no description set)
|
||||
$ jj log
|
||||
@ e659edc4a9fc 461f38324592 martinvonz@google.com 2021-05-26 12:53:08.000 -07:00
|
||||
@ 461f38324592 martinvonz@google.com 2021-05-26 12:53:08.000 -07:00 e659edc4a9fc
|
||||
| (no description set)
|
||||
| o 69dbcf76642a 8e6178b84ffb martinvonz@google.com 2021-05-26 12:39:35.000 -07:00
|
||||
| o 8e6178b84ffb martinvonz@google.com 2021-05-26 12:39:35.000 -07:00 69dbcf76642a
|
||||
|/ C
|
||||
o 576d647acf36 5548374c0794 martinvonz@google.com 2021-05-26 12:39:30.000 -07:00
|
||||
o 5548374c0794 martinvonz@google.com 2021-05-26 12:39:30.000 -07:00 576d647acf36
|
||||
| B2
|
||||
| o 47e336632333 ce619d39bd96 martinvonz@google.com 2021-05-26 12:39:20.000 -07:00
|
||||
| o ce619d39bd96 martinvonz@google.com 2021-05-26 12:39:20.000 -07:00 47e336632333
|
||||
|/ B1
|
||||
o 661432c51c08 cf49e6bec410 martinvonz@google.com 2021-05-26 12:39:12.000 -07:00
|
||||
o cf49e6bec410 martinvonz@google.com 2021-05-26 12:39:12.000 -07:00 661432c51c08
|
||||
~ A
|
||||
```
|
||||
|
||||
|
@ -292,15 +293,15 @@ an operation. By default, it will undo the most recent operation. Let's try it:
|
|||
$ jj undo
|
||||
Working copy now at: 41f0d2289b56
|
||||
$ jj log
|
||||
@ 41f0d2289b56 b1e3a4afde5e martinvonz@google.com 2021-05-26 12:52:39.000 -07:00
|
||||
@ b1e3a4afde5e martinvonz@google.com 2021-05-26 12:52:39.000 -07:00 41f0d2289b56
|
||||
| (no description set)
|
||||
| o 66274d5a7d2d 8e6178b84ffb martinvonz@google.com 2021-05-26 12:39:35.000 -07:00 conflict
|
||||
| o 8e6178b84ffb martinvonz@google.com 2021-05-26 12:39:35.000 -07:00 66274d5a7d2d conflict
|
||||
|/ C
|
||||
o 0c305a9e6b27 5548374c0794 martinvonz@google.com 2021-05-26 12:39:30.000 -07:00 conflict
|
||||
o 5548374c0794 martinvonz@google.com 2021-05-26 12:39:30.000 -07:00 0c305a9e6b27 conflict
|
||||
| B2
|
||||
| o 47e336632333 ce619d39bd96 martinvonz@google.com 2021-05-26 12:39:20.000 -07:00
|
||||
| o ce619d39bd96 martinvonz@google.com 2021-05-26 12:39:20.000 -07:00 47e336632333
|
||||
|/ B1
|
||||
o 661432c51c08 cf49e6bec410 martinvonz@google.com 2021-05-26 12:39:12.000 -07:00
|
||||
o cf49e6bec410 martinvonz@google.com 2021-05-26 12:39:12.000 -07:00 661432c51c08
|
||||
~ A
|
||||
```
|
||||
As you can perhaps see, that undid the `jj squash` invocation we used for
|
||||
|
@ -333,11 +334,11 @@ Working copy now at: 9d97c5018b23 ABC
|
|||
$ jj new -m ABCD; printf 'A\nB\nC\nD\n' > file
|
||||
Working copy now at: c5a985bc3f41 ABCD
|
||||
$ jj log
|
||||
@ 687009839bae 874f2d307594 martinvonz@google.com 2021-05-26 14:36:38.000 -07:00
|
||||
@ 874f2d307594 martinvonz@google.com 2021-05-26 14:36:38.000 -07:00 687009839bae
|
||||
| ABCD
|
||||
o ad9b1ce3b5d0 2bbc0c1eb382 martinvonz@google.com 2021-05-26 14:36:26.000 -07:00
|
||||
o 2bbc0c1eb382 martinvonz@google.com 2021-05-26 14:36:26.000 -07:00 ad9b1ce3b5d0
|
||||
| ABC
|
||||
o a355fb177b21 3680117711f5 martinvonz@google.com 2021-05-26 14:36:05.000 -07:00
|
||||
o 3680117711f5 martinvonz@google.com 2021-05-26 14:36:05.000 -07:00 a355fb177b21
|
||||
~ abc
|
||||
```
|
||||
|
||||
|
|
|
@ -1994,8 +1994,7 @@ fn log_template(settings: &UserSettings) -> String {
|
|||
// TODO: define a method on boolean values, so we can get auto-coloring
|
||||
// with e.g. `conflict.then("conflict")`
|
||||
let default_template = r#"
|
||||
commit_id.short()
|
||||
" " change_id.short()
|
||||
change_id.short()
|
||||
" " author.email()
|
||||
" " label("timestamp", author.timestamp())
|
||||
if(branches, " " branches)
|
||||
|
@ -2003,6 +2002,7 @@ fn log_template(settings: &UserSettings) -> String {
|
|||
if(working_copies, " " working_copies)
|
||||
if(is_git_head, label("git_head", " HEAD@git"))
|
||||
if(divergent, label("divergent", " divergent"))
|
||||
" " commit_id.short()
|
||||
if(conflict, label("conflict", " conflict"))
|
||||
"\n"
|
||||
description.first_line()
|
||||
|
|
|
@ -64,7 +64,7 @@ fn test_alias_cannot_override_builtin() {
|
|||
// Alias should be ignored
|
||||
let stdout = test_env.jj_cmd_success(&repo_path, &["log", "-r", "root"]);
|
||||
insta::assert_snapshot!(stdout, @r###"
|
||||
o 000000000000 000000000000 1970-01-01 00:00:00.000 +00:00
|
||||
o 000000000000 1970-01-01 00:00:00.000 +00:00 000000000000
|
||||
(no description set)
|
||||
"###);
|
||||
}
|
||||
|
|
|
@ -107,7 +107,7 @@ fn test_init_git_external() {
|
|||
// Check that the Git repo's HEAD got checked out
|
||||
let stdout = test_env.jj_cmd_success(&repo_path, &["log", "-r", "@-"]);
|
||||
insta::assert_snapshot!(stdout, @r###"
|
||||
o 8d698d4a8ee1 d3866db7e30a git.user@example.com 1970-01-01 01:02:03.000 +01:00 my-branch HEAD@git
|
||||
o d3866db7e30a git.user@example.com 1970-01-01 01:02:03.000 +01:00 my-branch HEAD@git 8d698d4a8ee1
|
||||
~ My commit message
|
||||
"###);
|
||||
}
|
||||
|
@ -150,7 +150,7 @@ fn test_init_git_colocated() {
|
|||
// Check that the Git repo's HEAD got checked out
|
||||
let stdout = test_env.jj_cmd_success(&repo_path, &["log", "-r", "@-"]);
|
||||
insta::assert_snapshot!(stdout, @r###"
|
||||
o 8d698d4a8ee1 d3866db7e30a git.user@example.com 1970-01-01 01:02:03.000 +01:00 my-branch HEAD@git
|
||||
o d3866db7e30a git.user@example.com 1970-01-01 01:02:03.000 +01:00 my-branch HEAD@git 8d698d4a8ee1
|
||||
~ My commit message
|
||||
"###);
|
||||
}
|
||||
|
|
|
@ -34,13 +34,13 @@ fn test_obslog_with_or_without_diff() {
|
|||
|
||||
let stdout = get_log_output(&test_env, &repo_path, &["obslog"]);
|
||||
insta::assert_snapshot!(stdout, @r###"
|
||||
@ 1daafc17fefb test.user@example.com 2001-02-03 04:05:08.000 +07:00
|
||||
@ test.user@example.com 2001-02-03 04:05:08.000 +07:00 1daafc17fefb
|
||||
| my description
|
||||
o 813918f7b4e6 test.user@example.com 2001-02-03 04:05:08.000 +07:00 conflict
|
||||
o test.user@example.com 2001-02-03 04:05:08.000 +07:00 813918f7b4e6 conflict
|
||||
| my description
|
||||
o 8f02f5470c55 test.user@example.com 2001-02-03 04:05:08.000 +07:00
|
||||
o test.user@example.com 2001-02-03 04:05:08.000 +07:00 8f02f5470c55
|
||||
| my description
|
||||
o c8ceb219336b test.user@example.com 2001-02-03 04:05:08.000 +07:00
|
||||
o test.user@example.com 2001-02-03 04:05:08.000 +07:00 c8ceb219336b
|
||||
my description
|
||||
"###);
|
||||
|
||||
|
@ -48,43 +48,43 @@ fn test_obslog_with_or_without_diff() {
|
|||
// (even even though it resulted in a conflict).
|
||||
let stdout = get_log_output(&test_env, &repo_path, &["obslog", "-p"]);
|
||||
insta::assert_snapshot!(stdout, @r###"
|
||||
@ 1daafc17fefb test.user@example.com 2001-02-03 04:05:08.000 +07:00
|
||||
@ test.user@example.com 2001-02-03 04:05:08.000 +07:00 1daafc17fefb
|
||||
| my description
|
||||
| Resolved conflict in file1:
|
||||
| 1 1: <<<<<<<resolved
|
||||
| 2 : %%%%%%%
|
||||
| 3 : +bar
|
||||
| 4 : >>>>>>>
|
||||
o 813918f7b4e6 test.user@example.com 2001-02-03 04:05:08.000 +07:00 conflict
|
||||
o test.user@example.com 2001-02-03 04:05:08.000 +07:00 813918f7b4e6 conflict
|
||||
| my description
|
||||
o 8f02f5470c55 test.user@example.com 2001-02-03 04:05:08.000 +07:00
|
||||
o test.user@example.com 2001-02-03 04:05:08.000 +07:00 8f02f5470c55
|
||||
| my description
|
||||
| Modified regular file file1:
|
||||
| 1 1: foo
|
||||
| 2: bar
|
||||
| Added regular file file2:
|
||||
| 1: foo
|
||||
o c8ceb219336b test.user@example.com 2001-02-03 04:05:08.000 +07:00
|
||||
o test.user@example.com 2001-02-03 04:05:08.000 +07:00 c8ceb219336b
|
||||
my description
|
||||
"###);
|
||||
|
||||
// Test `--no-graph`
|
||||
let stdout = get_log_output(&test_env, &repo_path, &["obslog", "--no-graph"]);
|
||||
insta::assert_snapshot!(stdout, @r###"
|
||||
1daafc17fefb test.user@example.com 2001-02-03 04:05:08.000 +07:00
|
||||
test.user@example.com 2001-02-03 04:05:08.000 +07:00 1daafc17fefb
|
||||
my description
|
||||
813918f7b4e6 test.user@example.com 2001-02-03 04:05:08.000 +07:00 conflict
|
||||
test.user@example.com 2001-02-03 04:05:08.000 +07:00 813918f7b4e6 conflict
|
||||
my description
|
||||
8f02f5470c55 test.user@example.com 2001-02-03 04:05:08.000 +07:00
|
||||
test.user@example.com 2001-02-03 04:05:08.000 +07:00 8f02f5470c55
|
||||
my description
|
||||
c8ceb219336b test.user@example.com 2001-02-03 04:05:08.000 +07:00
|
||||
test.user@example.com 2001-02-03 04:05:08.000 +07:00 c8ceb219336b
|
||||
my description
|
||||
"###);
|
||||
|
||||
// Test `--git` format, and that it implies `-p`
|
||||
let stdout = get_log_output(&test_env, &repo_path, &["obslog", "--no-graph", "--git"]);
|
||||
insta::assert_snapshot!(stdout, @r###"
|
||||
1daafc17fefb test.user@example.com 2001-02-03 04:05:08.000 +07:00
|
||||
test.user@example.com 2001-02-03 04:05:08.000 +07:00 1daafc17fefb
|
||||
my description
|
||||
diff --git a/file1 b/file1
|
||||
index e155302a24...2ab19ae607 100644
|
||||
|
@ -96,9 +96,9 @@ fn test_obslog_with_or_without_diff() {
|
|||
-+bar
|
||||
->>>>>>>
|
||||
+resolved
|
||||
813918f7b4e6 test.user@example.com 2001-02-03 04:05:08.000 +07:00 conflict
|
||||
test.user@example.com 2001-02-03 04:05:08.000 +07:00 813918f7b4e6 conflict
|
||||
my description
|
||||
8f02f5470c55 test.user@example.com 2001-02-03 04:05:08.000 +07:00
|
||||
test.user@example.com 2001-02-03 04:05:08.000 +07:00 8f02f5470c55
|
||||
my description
|
||||
diff --git a/file1 b/file1
|
||||
index 257cc5642c...3bd1f0e297 100644
|
||||
|
@ -114,7 +114,7 @@ fn test_obslog_with_or_without_diff() {
|
|||
+++ b/file2
|
||||
@@ -1,0 +1,1 @@
|
||||
+foo
|
||||
c8ceb219336b test.user@example.com 2001-02-03 04:05:08.000 +07:00
|
||||
test.user@example.com 2001-02-03 04:05:08.000 +07:00 c8ceb219336b
|
||||
my description
|
||||
"###);
|
||||
}
|
||||
|
@ -136,36 +136,36 @@ fn test_obslog_squash() {
|
|||
|
||||
let stdout = get_log_output(&test_env, &repo_path, &["obslog", "-p", "-r", "@-"]);
|
||||
insta::assert_snapshot!(stdout, @r###"
|
||||
o 9b6d4a272a6a test.user@example.com 2001-02-03 04:05:07.000 +07:00
|
||||
o test.user@example.com 2001-02-03 04:05:07.000 +07:00 9b6d4a272a6a
|
||||
|\ squashed
|
||||
| | Modified regular file file1:
|
||||
| | 1 1: foo
|
||||
| | 2: bar
|
||||
o | 803a7299cb1a test.user@example.com 2001-02-03 04:05:07.000 +07:00
|
||||
o | test.user@example.com 2001-02-03 04:05:07.000 +07:00 803a7299cb1a
|
||||
| | first
|
||||
| | Added regular file file1:
|
||||
| | 1: foo
|
||||
o | 85a1e2839620 test.user@example.com 2001-02-03 04:05:07.000 +07:00
|
||||
o | test.user@example.com 2001-02-03 04:05:07.000 +07:00 85a1e2839620
|
||||
| | first
|
||||
o | 230dd059e1b0 test.user@example.com 2001-02-03 04:05:07.000 +07:00
|
||||
o | test.user@example.com 2001-02-03 04:05:07.000 +07:00 230dd059e1b0
|
||||
/ (no description set)
|
||||
o 69231a40d60d test.user@example.com 2001-02-03 04:05:09.000 +07:00
|
||||
o test.user@example.com 2001-02-03 04:05:09.000 +07:00 69231a40d60d
|
||||
| second
|
||||
| Modified regular file file1:
|
||||
| 1 1: foo
|
||||
| 2: bar
|
||||
o b567edda97ab test.user@example.com 2001-02-03 04:05:09.000 +07:00
|
||||
o test.user@example.com 2001-02-03 04:05:09.000 +07:00 b567edda97ab
|
||||
second
|
||||
"###);
|
||||
}
|
||||
|
||||
fn get_log_output(test_env: &TestEnvironment, repo_path: &Path, args: &[&str]) -> String {
|
||||
// Filter out the change ID since it's random
|
||||
let regex = Regex::new("^([o@| ]+)?([0-9a-f]{12}) ([0-9a-f]{12}) ").unwrap();
|
||||
let regex = Regex::new("^([o@| ]+)?([0-9a-f]{12})").unwrap();
|
||||
let mut lines = vec![];
|
||||
let stdout = test_env.jj_cmd_success(repo_path, args);
|
||||
for line in stdout.split_inclusive('\n') {
|
||||
lines.push(regex.replace(line, "$1$2 "));
|
||||
lines.push(regex.replace(line, "$1"));
|
||||
}
|
||||
lines.join("")
|
||||
}
|
||||
|
|