ok/jj
1
0
Fork 0
forked from mirrors/jj

cli: consider other working copies immutable by default

This should avoid other workspaces going stale most of the time.

Also include all working copies in default log since we would
otherwise hide other working copies now.
This commit is contained in:
Martin von Zweigbergk 2024-09-06 09:46:00 -07:00
parent c42a941916
commit 61339c0197
No known key found for this signature in database
2 changed files with 60 additions and 55 deletions

View file

@ -3,7 +3,7 @@
[revsets]
fix = "reachable(@, mutable())"
log = "@ | ancestors(immutable_heads().., 2) | trunk()"
log = "working_copies() | ancestors(immutable_heads().., 2) | trunk()"
[revset-aliases]
'trunk()' = '''
@ -18,7 +18,7 @@ latest(
)
'''
'builtin_immutable_heads()' = 'trunk() | tags() | untracked_remote_branches()'
'builtin_immutable_heads()' = 'trunk() | tags() | untracked_remote_branches() | other_working_copies()'
'immutable_heads()' = 'builtin_immutable_heads()'
'immutable()' = '::(immutable_heads() | root())'
'mutable()' = '~immutable()'
'mutable()' = '~immutable()'

View file

@ -47,17 +47,17 @@ fn test_workspaces_add_second_workspace() {
// Can see the working-copy commit in each workspace in the log output. The "@"
// node in the graph indicates the current workspace's working-copy commit.
insta::assert_snapshot!(get_log_output(&test_env, &main_path), @r###"
5ed2222c28e2 second@
5ed2222c28e2 second@
@ 8183d0fcaa4c default@
751b12b7b981
751b12b7b981
000000000000
"###);
insta::assert_snapshot!(get_log_output(&test_env, &secondary_path), @r###"
@ 5ed2222c28e2 second@
8183d0fcaa4c default@
8183d0fcaa4c default@
751b12b7b981
751b12b7b981
000000000000
"###);
@ -144,12 +144,12 @@ fn test_workspaces_add_second_workspace_on_merge() {
// The new workspace's working-copy commit shares all parents with the old one.
insta::assert_snapshot!(get_log_output(&test_env, &main_path), @r###"
7013a493bd09 second@
7013a493bd09 second@
@ 35e47bff781e default@
444b77e99d43
1694f2ddf8ec
444b77e99d43
1694f2ddf8ec
000000000000
"###);
@ -282,19 +282,19 @@ fn test_workspaces_add_workspace_at_revision() {
// Can see the working-copy commit in each workspace in the log output. The "@"
// node in the graph indicates the current workspace's working-copy commit.
insta::assert_snapshot!(get_log_output(&test_env, &main_path), @r###"
e374e74aa0c8 second@
e374e74aa0c8 second@
@ dadeedb493e8 default@
c420244c6398
f6097c2f7cac
f6097c2f7cac
000000000000
"###);
insta::assert_snapshot!(get_log_output(&test_env, &secondary_path), @r###"
@ e374e74aa0c8 second@
dadeedb493e8 default@
c420244c6398
dadeedb493e8 default@
c420244c6398
f6097c2f7cac
f6097c2f7cac
000000000000
"###);
}
@ -352,12 +352,12 @@ fn test_workspaces_add_workspace_multiple_revisions() {
"###);
insta::assert_snapshot!(get_log_output(&test_env, &main_path), @r###"
f4fa64f40944 merge@
f4fa64f40944 merge@
f6097c2f7cac
544cd61f2d26
f6097c2f7cac
544cd61f2d26
6c843d62ca29
6c843d62ca29
@ 5b36783cd11c default@
@ -471,10 +471,10 @@ fn test_workspaces_conflicting_edits() {
test_env.jj_cmd_ok(&main_path, &["workspace", "add", "../secondary"]);
insta::assert_snapshot!(get_log_output(&test_env, &main_path), @r###"
3224de8ae048 secondary@
3224de8ae048 secondary@
@ 06b57f44a3ca default@
506f4ec3c2c6
506f4ec3c2c6
000000000000
"###);
@ -483,7 +483,7 @@ fn test_workspaces_conflicting_edits() {
std::fs::write(secondary_path.join("file"), "changed in second\n").unwrap();
// Squash the changes from the main workspace into the initial commit (before
// running any command in the secondary workspace
let (stdout, stderr) = test_env.jj_cmd_ok(&main_path, &["squash"]);
let (stdout, stderr) = test_env.jj_cmd_ok(&main_path, &["squash", "--ignore-immutable"]);
insta::assert_snapshot!(stdout, @"");
insta::assert_snapshot!(stderr, @r###"
Rebased 1 descendant commits
@ -494,9 +494,9 @@ fn test_workspaces_conflicting_edits() {
// The secondary workspace's working-copy commit was updated
insta::assert_snapshot!(get_log_output(&test_env, &main_path), @r###"
@ a58c9a9b19ce default@
e82cd4ee8faa secondary@
e82cd4ee8faa secondary@
d41244767d45
d41244767d45
000000000000
"###);
let stderr = test_env.jj_cmd_failure(&secondary_path, &["st"]);
@ -526,11 +526,11 @@ fn test_workspaces_conflicting_edits() {
insta::assert_snapshot!(get_log_output(&test_env, &secondary_path),
@r###"
× a28c85ce128b (divergent)
a58c9a9b19ce default@
a58c9a9b19ce default@
@ e82cd4ee8faa secondary@ (divergent)
d41244767d45
d41244767d45
000000000000
"###);
// The stale working copy should have been resolved by the previous command
@ -538,11 +538,11 @@ fn test_workspaces_conflicting_edits() {
assert!(!stdout.starts_with("The working copy is stale"));
insta::assert_snapshot!(stdout, @r###"
× a28c85ce128b (divergent)
a58c9a9b19ce default@
a58c9a9b19ce default@
@ e82cd4ee8faa secondary@ (divergent)
d41244767d45
d41244767d45
000000000000
"###);
}
@ -561,16 +561,16 @@ fn test_workspaces_updated_by_other() {
test_env.jj_cmd_ok(&main_path, &["workspace", "add", "../secondary"]);
insta::assert_snapshot!(get_log_output(&test_env, &main_path), @r###"
3224de8ae048 secondary@
3224de8ae048 secondary@
@ 06b57f44a3ca default@
506f4ec3c2c6
506f4ec3c2c6
000000000000
"###);
// Rewrite the check-out commit in one workspace.
std::fs::write(main_path.join("file"), "changed in main\n").unwrap();
let (stdout, stderr) = test_env.jj_cmd_ok(&main_path, &["squash"]);
let (stdout, stderr) = test_env.jj_cmd_ok(&main_path, &["squash", "--ignore-immutable"]);
insta::assert_snapshot!(stdout, @"");
insta::assert_snapshot!(stderr, @r###"
Rebased 1 descendant commits
@ -581,9 +581,9 @@ fn test_workspaces_updated_by_other() {
// The secondary workspace's working-copy commit was updated.
insta::assert_snapshot!(get_log_output(&test_env, &main_path), @r###"
@ a58c9a9b19ce default@
e82cd4ee8faa secondary@
e82cd4ee8faa secondary@
d41244767d45
d41244767d45
000000000000
"###);
let stderr = test_env.jj_cmd_failure(&secondary_path, &["st"]);
@ -602,10 +602,10 @@ fn test_workspaces_updated_by_other() {
"###);
insta::assert_snapshot!(get_log_output(&test_env, &secondary_path),
@r###"
a58c9a9b19ce default@
a58c9a9b19ce default@
@ e82cd4ee8faa secondary@
d41244767d45
d41244767d45
000000000000
"###);
}
@ -647,7 +647,7 @@ fn test_workspaces_current_op_discarded_by_other() {
// Create an op by abandoning the parent commit. Importantly, that commit also
// changes the target tree in the secondary workspace.
test_env.jj_cmd_ok(&main_path, &["abandon", "@-"]);
test_env.jj_cmd_ok(&main_path, &["abandon", "@-", "--ignore-immutable"]);
let stdout = test_env.jj_cmd_success(
&main_path,
@ -659,7 +659,7 @@ fn test_workspaces_current_op_discarded_by_other() {
],
);
insta::assert_snapshot!(stdout, @r###"
@ 7337338f0b abandon commit 20dd439c4bd12c6ad56c187ac490bd0141804618f638dc5c4dc92ff9aecba20f152b23160db9dcf61beb31a5cb14091d9def5a36d11c9599cc4d2e5689236af1
@ c43504554c abandon commit 20dd439c4bd12c6ad56c187ac490bd0141804618f638dc5c4dc92ff9aecba20f152b23160db9dcf61beb31a5cb14091d9def5a36d11c9599cc4d2e5689236af1
f4bd4d046b create initial working-copy commit in workspace secondary
0f99641958 add workspace 'secondary'
5641361f60 new empty commit
@ -676,10 +676,10 @@ fn test_workspaces_current_op_discarded_by_other() {
test_env.jj_cmd_ok(&main_path, &["util", "gc", "--expire=now"]);
insta::assert_snapshot!(get_log_output(&test_env, &main_path), @r###"
96b31dafdc41 secondary@
96b31dafdc41 secondary@
@ 6c051bd1ccd5 default@
7c5b25a4fc8f
7c5b25a4fc8f
000000000000
"###);
@ -698,11 +698,11 @@ fn test_workspaces_current_op_discarded_by_other() {
insta::assert_snapshot!(stdout, @"");
insta::assert_snapshot!(get_log_output(&test_env, &main_path), @r###"
b0b400439a82 secondary@
96b31dafdc41
b0b400439a82 secondary@
96b31dafdc41
@ 6c051bd1ccd5 default@
7c5b25a4fc8f
7c5b25a4fc8f
000000000000
"###);
@ -795,10 +795,10 @@ fn test_workspaces_update_stale_snapshot() {
insta::assert_snapshot!(get_log_output(&test_env, &secondary_path), @r###"
@ e672fd8fefac secondary@
ea37b073f5ab default@
b13c81dedc64
ea37b073f5ab default@
b13c81dedc64
e6e9989f1179
e6e9989f1179
000000000000
"###);
}
@ -836,8 +836,8 @@ fn test_workspaces_forget() {
// there's only one workspace. We should show it when the command is not run
// from that workspace.
insta::assert_snapshot!(get_log_output(&test_env, &main_path), @r###"
18463f438cc9
4e8f9d2be039
18463f438cc9
4e8f9d2be039
000000000000
"###);
@ -902,14 +902,19 @@ fn test_workspaces_forget_multi_transaction() {
"###);
// now, undo, and that should restore both workspaces
test_env.jj_cmd_ok(&main_path, &["op", "undo"]);
let (stdout, stderr) = test_env.jj_cmd_ok(&main_path, &["op", "undo"]);
insta::assert_snapshot!(stdout, @"");
insta::assert_snapshot!(stderr, @r###"
Warning: The working-copy commit in workspace 'second' became immutable, so a new commit has been created on top of it.
Warning: The working-copy commit in workspace 'third' became immutable, so a new commit has been created on top of it.
"###);
// finally, there should be three workspaces at the end
let stdout = test_env.jj_cmd_success(&main_path, &["workspace", "list"]);
insta::assert_snapshot!(stdout, @r###"
default: rlvkpnrz 909d51b1 (empty) (no description set)
second: pmmvwywv 18463f43 (empty) (no description set)
third: rzvqmyuk cc383fa2 (empty) (no description set)
second: yostqsxw c6fb1379 (empty) (no description set)
third: wmwvqwsz 2c09d1de (empty) (no description set)
"###);
}
@ -925,9 +930,9 @@ fn test_workspaces_forget_abandon_commits() {
test_env.jj_cmd_ok(&main_path, &["workspace", "add", "../third"]);
test_env.jj_cmd_ok(&main_path, &["workspace", "add", "../fourth"]);
let third_path = test_env.env_root().join("third");
test_env.jj_cmd_ok(&third_path, &["edit", "second@"]);
test_env.jj_cmd_ok(&third_path, &["edit", "second@", "--ignore-immutable"]);
let fourth_path = test_env.env_root().join("fourth");
test_env.jj_cmd_ok(&fourth_path, &["edit", "second@"]);
test_env.jj_cmd_ok(&fourth_path, &["edit", "second@", "--ignore-immutable"]);
// there should be four workspaces, three of which are at the same empty commit
let stdout = test_env.jj_cmd_success(&main_path, &["workspace", "list"]);
@ -938,7 +943,7 @@ fn test_workspaces_forget_abandon_commits() {
third: uuqppmxq 57d63245 (empty) (no description set)
"###);
insta::assert_snapshot!(get_log_output(&test_env, &main_path), @r###"
57d63245a308 fourth@ second@ third@
57d63245a308 fourth@ second@ third@
@ 4e8f9d2be039 default@
000000000000
@ -947,7 +952,7 @@ fn test_workspaces_forget_abandon_commits() {
// delete the default workspace (should not abandon commit since not empty)
test_env.jj_cmd_success(&main_path, &["workspace", "forget", "default"]);
insta::assert_snapshot!(get_log_output(&test_env, &main_path), @r###"
57d63245a308 fourth@ second@ third@
57d63245a308 fourth@ second@ third@
4e8f9d2be039
000000000000
@ -957,7 +962,7 @@ fn test_workspaces_forget_abandon_commits() {
// still have commit checked out)
test_env.jj_cmd_success(&main_path, &["workspace", "forget", "second"]);
insta::assert_snapshot!(get_log_output(&test_env, &main_path), @r###"
57d63245a308 fourth@ third@
57d63245a308 fourth@ third@
4e8f9d2be039
000000000000