jj/cli/tests/test_metaedit_command.rs
Cole Helbling d1d8048538
Some checks failed
binaries / Build binary artifacts (push) Has been cancelled
website / prerelease-docs-build-deploy (ubuntu-24.04) (push) Has been cancelled
Scorecards supply-chain security / Scorecards analysis (push) Has been cancelled
metaedit: replace --update-committer-timestamp with --force-rewrite
Just moments ago, I ran into a case where I wanted to change both the
author and committer of a change. I knew about the new `jj metaedit`
command, but until now that only gave me the ability to update the
author of my change, so the committer would remain the same. My only
other option was to reach for `jj desc ... --reset-author`, which has
a deprecation warning:

    Warning: `jj describe --reset-author` is deprecated; use `jj metaedit --update-author` instead

In spite of that warning, this had the desired effect: both the author
and committer were updated.

So I figured I'd help `metaedit` grow these flags so it can be a _true_
replacement for `jj desc --reset-author`.

---

The above all happened before I was kindly informed in Discord
(https://discord.com/channels/968932220549103686/1431315533164314674)
that `jj metaedit --update-committer-timestamp` should do what I was
hoping for, which I had initially disregarded and never tried because
the help text originally said:

    This updates the committer date to now, without modifying the committer.

However, after trying it out, I noticed it actually _did_ modify the
committer.

So, I set out to improve the situation by renaming the flag (so it's
not partially-wrong: it does update the committer timestamp, as well as
everything else about the committer) and improving the help text in the
various flags.

---

In no particular order, thanks to:

* obtuse, for informing me that the `--update-committer-timestamp`
flag does what I wanted in the first place
* gaetan, for pointing out that my way of thinking was not quite meshing
with how jj does things (every modification will update the committer)
* Martin, for the new flag name
2025-10-25 22:31:16 +00:00

842 lines
32 KiB
Rust

// 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::CommandOutput;
use crate::common::TestEnvironment;
use crate::common::TestWorkDir;
#[test]
fn test_metaedit() {
let mut 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(["bookmark", "create", "-r@", "a"])
.success();
work_dir.write_file("file1", "a\n");
work_dir.run_jj(["new"]).success();
work_dir
.run_jj(["bookmark", "create", "-r@", "b"])
.success();
work_dir.write_file("file1", "b\n");
work_dir.run_jj(["new"]).success();
work_dir
.run_jj(["bookmark", "create", "-r@", "c"])
.success();
work_dir.write_file("file1", "c\n");
// Test the setup
insta::assert_snapshot!(get_log(&work_dir), @r"
@ Commit ID: 22be6c4e01da7039a1a8c3adb91b8841252bb354
│ Change ID: mzvwutvlkqwtuzoztpszkqxkqmqyqyxo
│ Bookmarks: c
│ Author : Test User <test.user@example.com> (2001-02-03 04:05:13.000 +07:00)
│ Committer: Test User <test.user@example.com> (2001-02-03 04:05:13.000 +07:00)
│ (no description set)
○ Commit ID: 75591b1896b4990e7695701fd7cdbb32dba3ff50
│ Change ID: kkmpptxzrspxrzommnulwmwkkqwworpl
│ Bookmarks: b
│ Author : Test User <test.user@example.com> (2001-02-03 04:05:11.000 +07:00)
│ Committer: Test User <test.user@example.com> (2001-02-03 04:05:11.000 +07:00)
│ (no description set)
○ Commit ID: e6086990958c236d72030f0a2651806aa629f5dd
│ Change ID: qpvuntsmwlqtpsluzzsnyyzlmlwvmlnu
│ Bookmarks: a
│ Author : Test User <test.user@example.com> (2001-02-03 04:05:09.000 +07:00)
│ Committer: Test User <test.user@example.com> (2001-02-03 04:05:09.000 +07:00)
│ (no description set)
◆ Commit ID: 0000000000000000000000000000000000000000
Change ID: zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
Author : (no name set) <(no email set)> (1970-01-01 00:00:00.000 +00:00)
Committer: (no name set) <(no email set)> (1970-01-01 00:00:00.000 +00:00)
(no description set)
[EOF]
");
let setup_opid = work_dir.current_operation_id();
// Without arguments, the commits are not rewritten.
// TODO: Require an argument?
let output = work_dir.run_jj(["metaedit", "kkmpptxzrspx"]);
insta::assert_snapshot!(output, @r"
------- stderr -------
Nothing changed.
[EOF]
");
// When resetting the author has no effect, the commits are not rewritten.
let output = work_dir.run_jj([
"metaedit",
"--config=user.name=Test User",
"--update-author",
"kkmpptxzrspx",
]);
insta::assert_snapshot!(output, @r"
------- stderr -------
Nothing changed.
[EOF]
");
// Update author, ensure the commit can be specified with -r too
work_dir.run_jj(["op", "restore", &setup_opid]).success();
work_dir
.run_jj([
"metaedit",
"--config=user.name=Ove Ridder",
"--config=user.email=ove.ridder@example.com",
"--update-author",
"-r",
"kkmpptxzrspx",
])
.success();
insta::assert_snapshot!(get_log(&work_dir), @r"
@ Commit ID: 6f31b2555777ac2261dd17008b6fdc42619ebe1f
│ Change ID: mzvwutvlkqwtuzoztpszkqxkqmqyqyxo
│ Bookmarks: c
│ Author : Test User <test.user@example.com> (2001-02-03 04:05:13.000 +07:00)
│ Committer: Ove Ridder <ove.ridder@example.com> (2001-02-03 04:05:17.000 +07:00)
│ (no description set)
○ Commit ID: 590c8b6945666401d01269190c1b82cd3311a0cd
│ Change ID: kkmpptxzrspxrzommnulwmwkkqwworpl
│ Bookmarks: b
│ Author : Ove Ridder <ove.ridder@example.com> (2001-02-03 04:05:11.000 +07:00)
│ Committer: Ove Ridder <ove.ridder@example.com> (2001-02-03 04:05:17.000 +07:00)
│ (no description set)
○ Commit ID: e6086990958c236d72030f0a2651806aa629f5dd
│ Change ID: qpvuntsmwlqtpsluzzsnyyzlmlwvmlnu
│ Bookmarks: a
│ Author : Test User <test.user@example.com> (2001-02-03 04:05:09.000 +07:00)
│ Committer: Test User <test.user@example.com> (2001-02-03 04:05:09.000 +07:00)
│ (no description set)
◆ Commit ID: 0000000000000000000000000000000000000000
Change ID: zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
Author : (no name set) <(no email set)> (1970-01-01 00:00:00.000 +00:00)
Committer: (no name set) <(no email set)> (1970-01-01 00:00:00.000 +00:00)
(no description set)
[EOF]
");
// Update author timestamp
work_dir.run_jj(["op", "restore", &setup_opid]).success();
work_dir
.run_jj(["metaedit", "--update-author-timestamp", "kkmpptxzrspx"])
.success();
insta::assert_snapshot!(get_log(&work_dir), @r"
@ Commit ID: b23f6a3f160d122f8d8dacd8d2acff2d29d5ba84
│ Change ID: mzvwutvlkqwtuzoztpszkqxkqmqyqyxo
│ Bookmarks: c
│ Author : Test User <test.user@example.com> (2001-02-03 04:05:13.000 +07:00)
│ Committer: Test User <test.user@example.com> (2001-02-03 04:05:20.000 +07:00)
│ (no description set)
○ Commit ID: f121a0fb72e1790e4116b2e3b6989c795ac7f74b
│ Change ID: kkmpptxzrspxrzommnulwmwkkqwworpl
│ Bookmarks: b
│ Author : Test User <test.user@example.com> (2001-02-03 04:05:20.000 +07:00)
│ Committer: Test User <test.user@example.com> (2001-02-03 04:05:20.000 +07:00)
│ (no description set)
○ Commit ID: e6086990958c236d72030f0a2651806aa629f5dd
│ Change ID: qpvuntsmwlqtpsluzzsnyyzlmlwvmlnu
│ Bookmarks: a
│ Author : Test User <test.user@example.com> (2001-02-03 04:05:09.000 +07:00)
│ Committer: Test User <test.user@example.com> (2001-02-03 04:05:09.000 +07:00)
│ (no description set)
◆ Commit ID: 0000000000000000000000000000000000000000
Change ID: zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
Author : (no name set) <(no email set)> (1970-01-01 00:00:00.000 +00:00)
Committer: (no name set) <(no email set)> (1970-01-01 00:00:00.000 +00:00)
(no description set)
[EOF]
");
// Set author
work_dir.run_jj(["op", "restore", &setup_opid]).success();
work_dir
.run_jj([
"metaedit",
"--author",
"Alice <alice@example.com>",
"kkmpptxzrspx",
])
.success();
insta::assert_snapshot!(get_log(&work_dir), @r"
@ Commit ID: 74007c679b9e4f13d1e3d553ef8397586b033421
│ Change ID: mzvwutvlkqwtuzoztpszkqxkqmqyqyxo
│ Bookmarks: c
│ Author : Test User <test.user@example.com> (2001-02-03 04:05:13.000 +07:00)
│ Committer: Test User <test.user@example.com> (2001-02-03 04:05:23.000 +07:00)
│ (no description set)
○ Commit ID: d070c8adbc590813c81e296591d6b2cac8f3bb41
│ Change ID: kkmpptxzrspxrzommnulwmwkkqwworpl
│ Bookmarks: b
│ Author : Alice <alice@example.com> (2001-02-03 04:05:11.000 +07:00)
│ Committer: Test User <test.user@example.com> (2001-02-03 04:05:23.000 +07:00)
│ (no description set)
○ Commit ID: e6086990958c236d72030f0a2651806aa629f5dd
│ Change ID: qpvuntsmwlqtpsluzzsnyyzlmlwvmlnu
│ Bookmarks: a
│ Author : Test User <test.user@example.com> (2001-02-03 04:05:09.000 +07:00)
│ Committer: Test User <test.user@example.com> (2001-02-03 04:05:09.000 +07:00)
│ (no description set)
◆ Commit ID: 0000000000000000000000000000000000000000
Change ID: zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
Author : (no name set) <(no email set)> (1970-01-01 00:00:00.000 +00:00)
Committer: (no name set) <(no email set)> (1970-01-01 00:00:00.000 +00:00)
(no description set)
[EOF]
");
// new author date
work_dir.run_jj(["op", "restore", &setup_opid]).success();
work_dir
.run_jj([
"metaedit",
"--author-timestamp",
"1995-12-19T16:39:57-08:00",
])
.success();
insta::assert_snapshot!(get_log(&work_dir), @r"
@ Commit ID: a527219f85839d58ddb6115fbc4f0f8bc6649266
│ Change ID: mzvwutvlkqwtuzoztpszkqxkqmqyqyxo
│ Bookmarks: c
│ Author : Test User <test.user@example.com> (1995-12-19 16:39:57.000 -08:00)
│ Committer: Test User <test.user@example.com> (2001-02-03 04:05:26.000 +07:00)
│ (no description set)
○ Commit ID: 75591b1896b4990e7695701fd7cdbb32dba3ff50
│ Change ID: kkmpptxzrspxrzommnulwmwkkqwworpl
│ Bookmarks: b
│ Author : Test User <test.user@example.com> (2001-02-03 04:05:11.000 +07:00)
│ Committer: Test User <test.user@example.com> (2001-02-03 04:05:11.000 +07:00)
│ (no description set)
○ Commit ID: e6086990958c236d72030f0a2651806aa629f5dd
│ Change ID: qpvuntsmwlqtpsluzzsnyyzlmlwvmlnu
│ Bookmarks: a
│ Author : Test User <test.user@example.com> (2001-02-03 04:05:09.000 +07:00)
│ Committer: Test User <test.user@example.com> (2001-02-03 04:05:09.000 +07:00)
│ (no description set)
◆ Commit ID: 0000000000000000000000000000000000000000
Change ID: zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
Author : (no name set) <(no email set)> (1970-01-01 00:00:00.000 +00:00)
Committer: (no name set) <(no email set)> (1970-01-01 00:00:00.000 +00:00)
(no description set)
[EOF]
");
// invalid date gives an error
work_dir.run_jj(["op", "restore", &setup_opid]).success();
let output = work_dir.run_jj(["metaedit", "--author-timestamp", "aaaaaa"]);
insta::assert_snapshot!(output, @r"
------- stderr -------
error: invalid value 'aaaaaa' for '--author-timestamp <AUTHOR_TIMESTAMP>': input contains invalid characters
For more information, try '--help'.
[EOF]
[exit status: 2]
");
// Update committer timestamp
work_dir.run_jj(["op", "restore", &setup_opid]).success();
work_dir
.run_jj(["metaedit", "--force-rewrite", "kkmpptxzrspx"])
.success();
insta::assert_snapshot!(get_log(&work_dir), @r"
@ Commit ID: 6c0aa6574ef6450eaf7eae1391cc6c769c53a50c
│ Change ID: mzvwutvlkqwtuzoztpszkqxkqmqyqyxo
│ Bookmarks: c
│ Author : Test User <test.user@example.com> (2001-02-03 04:05:13.000 +07:00)
│ Committer: Test User <test.user@example.com> (2001-02-03 04:05:31.000 +07:00)
│ (no description set)
○ Commit ID: 0a570dfbbaf794cd15bbdbf28f94785405ef5b3b
│ Change ID: kkmpptxzrspxrzommnulwmwkkqwworpl
│ Bookmarks: b
│ Author : Test User <test.user@example.com> (2001-02-03 04:05:11.000 +07:00)
│ Committer: Test User <test.user@example.com> (2001-02-03 04:05:31.000 +07:00)
│ (no description set)
○ Commit ID: e6086990958c236d72030f0a2651806aa629f5dd
│ Change ID: qpvuntsmwlqtpsluzzsnyyzlmlwvmlnu
│ Bookmarks: a
│ Author : Test User <test.user@example.com> (2001-02-03 04:05:09.000 +07:00)
│ Committer: Test User <test.user@example.com> (2001-02-03 04:05:09.000 +07:00)
│ (no description set)
◆ Commit ID: 0000000000000000000000000000000000000000
Change ID: zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
Author : (no name set) <(no email set)> (1970-01-01 00:00:00.000 +00:00)
Committer: (no name set) <(no email set)> (1970-01-01 00:00:00.000 +00:00)
(no description set)
[EOF]
");
// change test author config for changing committer
test_env.add_env_var("JJ_USER", "Test Committer");
test_env.add_env_var("JJ_EMAIL", "test.committer@example.com");
let work_dir = test_env.work_dir("repo");
// update existing commit with restored test author config
insta::assert_snapshot!(work_dir.run_jj(["metaedit", "--force-rewrite"]), @r"
------- stderr -------
Modified 1 commits:
mzvwutvl 75259df4 c | (no description set)
Working copy (@) now at: mzvwutvl 75259df4 c | (no description set)
Parent commit (@-) : kkmpptxz 0a570dfb b | (no description set)
[EOF]
");
insta::assert_snapshot!(work_dir.run_jj(["show"]), @r"
Commit ID: 75259df433eebc10b3ad78a9814d6647b764ce28
Change ID: mzvwutvlkqwtuzoztpszkqxkqmqyqyxo
Bookmarks: c
Author : Test User <test.user@example.com> (2001-02-03 08:05:13)
Committer: Test Committer <test.committer@example.com> (2001-02-03 08:05:33)
(no description set)
Modified regular file file1:
1 1: bc
[EOF]
");
// When resetting the description has no effect, the commits are not rewritten.
work_dir.run_jj(["op", "restore", &setup_opid]).success();
let output = work_dir.run_jj(["metaedit", "--message", "", "kkmpptxzrspx"]);
insta::assert_snapshot!(output, @r"
------- stderr -------
Nothing changed.
[EOF]
");
// Update description
work_dir
.run_jj(["metaedit", "--message", "d\ne\nf"])
.success();
insta::assert_snapshot!(get_log(&work_dir), @r"
@ Commit ID: 502004368461738c866bc690ce08f7c219a4de10
│ Change ID: mzvwutvlkqwtuzoztpszkqxkqmqyqyxo
│ Bookmarks: c
│ Author : Test User <test.user@example.com> (2001-02-03 04:05:13.000 +07:00)
│ Committer: Test Committer <test.committer@example.com> (2001-02-03 04:05:37.000 +07:00)
│ d
│ e
│ f
○ Commit ID: 75591b1896b4990e7695701fd7cdbb32dba3ff50
│ Change ID: kkmpptxzrspxrzommnulwmwkkqwworpl
│ Bookmarks: b
│ Author : Test User <test.user@example.com> (2001-02-03 04:05:11.000 +07:00)
│ Committer: Test User <test.user@example.com> (2001-02-03 04:05:11.000 +07:00)
│ (no description set)
○ Commit ID: e6086990958c236d72030f0a2651806aa629f5dd
│ Change ID: qpvuntsmwlqtpsluzzsnyyzlmlwvmlnu
│ Bookmarks: a
│ Author : Test User <test.user@example.com> (2001-02-03 04:05:09.000 +07:00)
│ Committer: Test User <test.user@example.com> (2001-02-03 04:05:09.000 +07:00)
│ (no description set)
◆ Commit ID: 0000000000000000000000000000000000000000
Change ID: zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
Author : (no name set) <(no email set)> (1970-01-01 00:00:00.000 +00:00)
Committer: (no name set) <(no email set)> (1970-01-01 00:00:00.000 +00:00)
(no description set)
[EOF]
");
// Set empty description
work_dir.run_jj(["metaedit", "--message", ""]).success();
insta::assert_snapshot!(get_log(&work_dir), @r"
@ Commit ID: a44f230f9af7eed606af7713774feba5e39f36f7
│ Change ID: mzvwutvlkqwtuzoztpszkqxkqmqyqyxo
│ Bookmarks: c
│ Author : Test User <test.user@example.com> (2001-02-03 04:05:13.000 +07:00)
│ Committer: Test Committer <test.committer@example.com> (2001-02-03 04:05:39.000 +07:00)
│ (no description set)
○ Commit ID: 75591b1896b4990e7695701fd7cdbb32dba3ff50
│ Change ID: kkmpptxzrspxrzommnulwmwkkqwworpl
│ Bookmarks: b
│ Author : Test User <test.user@example.com> (2001-02-03 04:05:11.000 +07:00)
│ Committer: Test User <test.user@example.com> (2001-02-03 04:05:11.000 +07:00)
│ (no description set)
○ Commit ID: e6086990958c236d72030f0a2651806aa629f5dd
│ Change ID: qpvuntsmwlqtpsluzzsnyyzlmlwvmlnu
│ Bookmarks: a
│ Author : Test User <test.user@example.com> (2001-02-03 04:05:09.000 +07:00)
│ Committer: Test User <test.user@example.com> (2001-02-03 04:05:09.000 +07:00)
│ (no description set)
◆ Commit ID: 0000000000000000000000000000000000000000
Change ID: zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
Author : (no name set) <(no email set)> (1970-01-01 00:00:00.000 +00:00)
Committer: (no name set) <(no email set)> (1970-01-01 00:00:00.000 +00:00)
(no description set)
[EOF]
");
}
#[test]
fn test_metaedit_no_matching_revisions() {
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(["metaedit", "--update-change-id", "none()"]);
insta::assert_snapshot!(output, @r"
------- stderr -------
No revisions to modify.
[EOF]
");
}
#[test]
fn test_metaedit_multiple_revisions() {
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(["bookmark", "create", "-r@", "a"])
.success();
work_dir.write_file("file1", "a\n");
work_dir.run_jj(["new"]).success();
work_dir
.run_jj(["bookmark", "create", "-r@", "b"])
.success();
work_dir.write_file("file1", "b\n");
work_dir.run_jj(["new"]).success();
work_dir
.run_jj(["bookmark", "create", "-r@", "c"])
.success();
work_dir.write_file("file1", "c\n");
// Test the setup
insta::assert_snapshot!(get_log(&work_dir), @r"
@ Commit ID: 22be6c4e01da7039a1a8c3adb91b8841252bb354
│ Change ID: mzvwutvlkqwtuzoztpszkqxkqmqyqyxo
│ Bookmarks: c
│ Author : Test User <test.user@example.com> (2001-02-03 04:05:13.000 +07:00)
│ Committer: Test User <test.user@example.com> (2001-02-03 04:05:13.000 +07:00)
│ (no description set)
○ Commit ID: 75591b1896b4990e7695701fd7cdbb32dba3ff50
│ Change ID: kkmpptxzrspxrzommnulwmwkkqwworpl
│ Bookmarks: b
│ Author : Test User <test.user@example.com> (2001-02-03 04:05:11.000 +07:00)
│ Committer: Test User <test.user@example.com> (2001-02-03 04:05:11.000 +07:00)
│ (no description set)
○ Commit ID: e6086990958c236d72030f0a2651806aa629f5dd
│ Change ID: qpvuntsmwlqtpsluzzsnyyzlmlwvmlnu
│ Bookmarks: a
│ Author : Test User <test.user@example.com> (2001-02-03 04:05:09.000 +07:00)
│ Committer: Test User <test.user@example.com> (2001-02-03 04:05:09.000 +07:00)
│ (no description set)
◆ Commit ID: 0000000000000000000000000000000000000000
Change ID: zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
Author : (no name set) <(no email set)> (1970-01-01 00:00:00.000 +00:00)
Committer: (no name set) <(no email set)> (1970-01-01 00:00:00.000 +00:00)
(no description set)
[EOF]
");
let setup_opid = work_dir.current_operation_id();
// Update multiple revisions
work_dir.run_jj(["op", "restore", &setup_opid]).success();
work_dir.run_jj(["new"]).success();
let output = work_dir.run_jj([
"metaedit",
"--config=user.name=Ove Ridder",
"--config=user.email=ove.ridder@example.com",
"--update-author",
"kkmpptxz::mzvwutvl",
]);
insta::assert_snapshot!(output, @r"
------- stderr -------
Modified 2 commits:
kkmpptxz d84add51 b | (no description set)
mzvwutvl 447d6d8a c | (no description set)
Rebased 1 descendant commits
Working copy (@) now at: yostqsxw ebd66676 (empty) (no description set)
Parent commit (@-) : mzvwutvl 447d6d8a c | (no description set)
[EOF]
");
insta::assert_snapshot!(get_log(&work_dir), @r"
@ Commit ID: ebd66676fa9e0cd2c9f560bc0dc343b8809e4dfe
│ Change ID: yostqsxwqrltovqlrlzszywzslusmuup
│ Author : Test User <test.user@example.com> (2001-02-03 04:05:15.000 +07:00)
│ Committer: Ove Ridder <ove.ridder@example.com> (2001-02-03 04:05:16.000 +07:00)
│ (no description set)
○ Commit ID: 447d6d8a12d90ff0f10bbefc552f9272694389d6
│ Change ID: mzvwutvlkqwtuzoztpszkqxkqmqyqyxo
│ Bookmarks: c
│ Author : Ove Ridder <ove.ridder@example.com> (2001-02-03 04:05:13.000 +07:00)
│ Committer: Ove Ridder <ove.ridder@example.com> (2001-02-03 04:05:16.000 +07:00)
│ (no description set)
○ Commit ID: d84add5150537e89db428790c0f9413320127f00
│ Change ID: kkmpptxzrspxrzommnulwmwkkqwworpl
│ Bookmarks: b
│ Author : Ove Ridder <ove.ridder@example.com> (2001-02-03 04:05:11.000 +07:00)
│ Committer: Ove Ridder <ove.ridder@example.com> (2001-02-03 04:05:16.000 +07:00)
│ (no description set)
○ Commit ID: e6086990958c236d72030f0a2651806aa629f5dd
│ Change ID: qpvuntsmwlqtpsluzzsnyyzlmlwvmlnu
│ Bookmarks: a
│ Author : Test User <test.user@example.com> (2001-02-03 04:05:09.000 +07:00)
│ Committer: Test User <test.user@example.com> (2001-02-03 04:05:09.000 +07:00)
│ (no description set)
◆ Commit ID: 0000000000000000000000000000000000000000
Change ID: zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
Author : (no name set) <(no email set)> (1970-01-01 00:00:00.000 +00:00)
Committer: (no name set) <(no email set)> (1970-01-01 00:00:00.000 +00:00)
(no description set)
[EOF]
");
}
#[test]
fn test_new_change_id() {
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(["bookmark", "create", "-r@", "a"])
.success();
work_dir.write_file("file1", "a\n");
work_dir.run_jj(["new"]).success();
work_dir
.run_jj(["bookmark", "create", "-r@", "b"])
.success();
work_dir.write_file("file1", "b\n");
work_dir.run_jj(["new"]).success();
work_dir
.run_jj(["bookmark", "create", "-r@", "c"])
.success();
work_dir.write_file("file1", "c\n");
let output = work_dir.run_jj(["metaedit", "--update-change-id", "kkmpptxzrspx"]);
insta::assert_snapshot!(output, @r"
------- stderr -------
Modified 1 commits:
yqosqzyt 01d6741e b | (no description set)
Rebased 1 descendant commits
Working copy (@) now at: mzvwutvl 0c3fe2d8 c | (no description set)
Parent commit (@-) : yqosqzyt 01d6741e b | (no description set)
[EOF]
");
insta::assert_snapshot!(get_log(&work_dir), @r"
@ Commit ID: 0c3fe2d854b2b492a053156a505d6c40fe783138
│ Change ID: mzvwutvlkqwtuzoztpszkqxkqmqyqyxo
│ Bookmarks: c
│ Author : Test User <test.user@example.com> (2001-02-03 04:05:13.000 +07:00)
│ Committer: Test User <test.user@example.com> (2001-02-03 04:05:13.000 +07:00)
│ (no description set)
○ Commit ID: 01d6741ed708318bcd5911320237066db4b63b53
│ Change ID: yqosqzytrlswkspswpqrmlplxylrzsnz
│ Bookmarks: b
│ Author : Test User <test.user@example.com> (2001-02-03 04:05:11.000 +07:00)
│ Committer: Test User <test.user@example.com> (2001-02-03 04:05:13.000 +07:00)
│ (no description set)
○ Commit ID: e6086990958c236d72030f0a2651806aa629f5dd
│ Change ID: qpvuntsmwlqtpsluzzsnyyzlmlwvmlnu
│ Bookmarks: a
│ Author : Test User <test.user@example.com> (2001-02-03 04:05:09.000 +07:00)
│ Committer: Test User <test.user@example.com> (2001-02-03 04:05:09.000 +07:00)
│ (no description set)
◆ Commit ID: 0000000000000000000000000000000000000000
Change ID: zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
Author : (no name set) <(no email set)> (1970-01-01 00:00:00.000 +00:00)
Committer: (no name set) <(no email set)> (1970-01-01 00:00:00.000 +00:00)
(no description set)
[EOF]
");
insta::assert_snapshot!(work_dir.run_jj(["evolog", "-r", "yqosqzytrlswkspswpqrmlplxylrzsnz"]), @r"
○ yqosqzyt test.user@example.com 2001-02-03 08:05:13 b 01d6741e
│ (no description set)
│ -- operation adf0af78a0fd edit commit metadata for commit 75591b1896b4990e7695701fd7cdbb32dba3ff50
○ kkmpptxz hidden test.user@example.com 2001-02-03 08:05:11 75591b18
│ (no description set)
│ -- operation 4b33c26502f8 snapshot working copy
○ kkmpptxz hidden test.user@example.com 2001-02-03 08:05:09 acebf2bd
(empty) (no description set)
-- operation 686c6e44c08d new empty commit
[EOF]
");
insta::assert_snapshot!(work_dir.run_jj(["evolog", "-r", "mzvwut"]), @r"
@ mzvwutvl test.user@example.com 2001-02-03 08:05:13 c 0c3fe2d8
│ (no description set)
│ -- operation adf0af78a0fd edit commit metadata for commit 75591b1896b4990e7695701fd7cdbb32dba3ff50
○ mzvwutvl hidden test.user@example.com 2001-02-03 08:05:13 22be6c4e
│ (no description set)
│ -- operation 92fee3ece32c snapshot working copy
○ mzvwutvl hidden test.user@example.com 2001-02-03 08:05:11 b9f5490a
(empty) (no description set)
-- operation e3fbc5040416 new empty commit
[EOF]
");
}
#[test]
fn test_metaedit_option_mutual_exclusion() {
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=a"]).success();
work_dir.run_jj(["describe", "-m=b"]).success();
insta::assert_snapshot!(work_dir.run_jj([
"metaedit",
"--author=Alice <alice@example.com>",
"--update-author",
]), @r"
------- stderr -------
error: the argument '--author <AUTHOR>' cannot be used with '--update-author'
Usage: jj metaedit --author <AUTHOR> [REVSETS]...
For more information, try '--help'.
[EOF]
[exit status: 2]
");
insta::assert_snapshot!(work_dir.run_jj([
"metaedit",
"--update-committer-timestamp",
"--force-rewrite",
]), @r"
------- stderr -------
error: the argument '--update-committer-timestamp' cannot be used with '--force-rewrite'
Usage: jj metaedit [OPTIONS] [REVSETS]...
For more information, try '--help'.
[EOF]
[exit status: 2]
");
}
#[test]
fn test_update_empty_author_or_email() {
let mut test_env = TestEnvironment::default();
// get rid of test author config
test_env.add_env_var("JJ_USER", "");
test_env.add_env_var("JJ_EMAIL", "");
test_env.run_jj_in(".", ["git", "init", "repo"]).success();
// show that commit has no author set
insta::assert_snapshot!(test_env.work_dir("repo").run_jj(["show"]), @r"
Commit ID: 42c91a3e183efb4499038d0d9aa3d14b5deafde0
Change ID: qpvuntsmwlqtpsluzzsnyyzlmlwvmlnu
Author : (no name set) <(no email set)> (2001-02-03 08:05:07)
Committer: (no name set) <(no email set)> (2001-02-03 08:05:07)
(no description set)
[EOF]
");
// restore test author config, exercise --quiet
test_env.add_env_var("JJ_USER", "Test User");
test_env.add_env_var("JJ_EMAIL", "test.user@example.com");
let work_dir = test_env.work_dir("repo");
// update existing commit with restored test author config
insta::assert_snapshot!(work_dir.run_jj(["metaedit", "--update-author", "--quiet"]), @"");
insta::assert_snapshot!(work_dir.run_jj(["show"]), @r"
Commit ID: 0f13b5f2ea7fad147c133c81b87d31e7b1b8c564
Change ID: qpvuntsmwlqtpsluzzsnyyzlmlwvmlnu
Author : Test User <test.user@example.com> (2001-02-03 08:05:09)
Committer: Test User <test.user@example.com> (2001-02-03 08:05:09)
(no description set)
[EOF]
");
// confirm user / email can be cleared/restored separately
// leave verbose to see no-email warning + hint
test_env.add_env_var("JJ_EMAIL", "");
let work_dir = test_env.work_dir("repo");
insta::assert_snapshot!(work_dir.run_jj(["metaedit", "--update-author"]), @r#"
------- stderr -------
Modified 1 commits:
qpvuntsm 234908d4 (empty) (no description set)
Working copy (@) now at: qpvuntsm 234908d4 (empty) (no description set)
Parent commit (@-) : zzzzzzzz 00000000 (empty) (no description set)
Warning: Email not configured. Until configured, your commits will be created with the empty identity, and can't be pushed to remotes.
Hint: To configure, run:
jj config set --user user.email "someone@example.com"
[EOF]
"#);
insta::assert_snapshot!(work_dir.run_jj(["show"]), @r"
Commit ID: 234908d4748ff3224a87888d8b52a4923e1a89a5
Change ID: qpvuntsmwlqtpsluzzsnyyzlmlwvmlnu
Author : Test User <(no email set)> (2001-02-03 08:05:09)
Committer: Test User <(no email set)> (2001-02-03 08:05:11)
(no description set)
[EOF]
");
// confirm no-name warning + hint
test_env.add_env_var("JJ_USER", "");
test_env.add_env_var("JJ_EMAIL", "test.user@example.com");
let work_dir = test_env.work_dir("repo");
insta::assert_snapshot!(work_dir.run_jj(["metaedit", "--update-author"]), @r#"
------- stderr -------
Modified 1 commits:
qpvuntsm ac5048cf (empty) (no description set)
Working copy (@) now at: qpvuntsm ac5048cf (empty) (no description set)
Parent commit (@-) : zzzzzzzz 00000000 (empty) (no description set)
Warning: Name not configured. Until configured, your commits will be created with the empty identity, and can't be pushed to remotes.
Hint: To configure, run:
jj config set --user user.name "Some One"
[EOF]
"#);
insta::assert_snapshot!(work_dir.run_jj(["show"]), @r"
Commit ID: ac5048cf35372ddc30e2590271781a3eab0bcaf8
Change ID: qpvuntsmwlqtpsluzzsnyyzlmlwvmlnu
Author : (no name set) <test.user@example.com> (2001-02-03 08:05:09)
Committer: (no name set) <test.user@example.com> (2001-02-03 08:05:13)
(no description set)
[EOF]
");
}
#[test]
/// Test that setting the same timestamp twice does nothing (issue #7602)
fn test_metaedit_set_same_timestamp_twice() {
let test_env = TestEnvironment::default();
test_env.run_jj_in(".", ["git", "init", "repo"]).success();
let work_dir = test_env.work_dir("repo");
// Set the author-timestamp to the same value twice
// and check that the second time it does nothing
let output = work_dir.run_jj([
"metaedit",
"--author-timestamp",
"2001-02-03 04:05:14.000+07:00",
]);
insta::assert_snapshot!(output, @r"
------- stderr -------
Modified 1 commits:
qpvuntsm 51b97b23 (empty) (no description set)
Working copy (@) now at: qpvuntsm 51b97b23 (empty) (no description set)
Parent commit (@-) : zzzzzzzz 00000000 (empty) (no description set)
[EOF]
");
// Running it again with the same date has no effect
let output = work_dir.run_jj([
"metaedit",
"--author-timestamp",
"2001-02-03 04:05:14.000+07:00",
]);
insta::assert_snapshot!(output, @r"
------- stderr -------
Nothing changed.
[EOF]
");
}
#[must_use]
fn get_log(work_dir: &TestWorkDir) -> CommandOutput {
work_dir.run_jj([
"--config",
"template-aliases.'format_timestamp(t)'='t'",
"log",
"-T",
"builtin_log_detailed",
])
}