forked from mirrors/jj
cli: add jj describe --reset-author
I think requests to reset the author came up twice in the last week, so let's just add support for it. I copied git's behavior of resetting the name, email, and timestamp. The flag name is also from git.
This commit is contained in:
parent
f758b646a9
commit
3bacc367cd
3 changed files with 64 additions and 5 deletions
|
@ -55,6 +55,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
* `jj debug completion`, `jj debug mangen` and `jj debug config-schema` have
|
* `jj debug completion`, `jj debug mangen` and `jj debug config-schema` have
|
||||||
been moved from `jj debug` to `jj support`.
|
been moved from `jj debug` to `jj support`.
|
||||||
|
|
||||||
|
* `jj describe` now supports `--reset-author` for resetting a commit's author
|
||||||
|
to the configured user.
|
||||||
|
|
||||||
### Fixed bugs
|
### Fixed bugs
|
||||||
|
|
||||||
* Modify/delete conflicts now include context lines
|
* Modify/delete conflicts now include context lines
|
||||||
|
|
|
@ -395,7 +395,7 @@ struct InterdiffArgs {
|
||||||
format: DiffFormatArgs,
|
format: DiffFormatArgs,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Edit the change description
|
/// Update the change description or other metadata
|
||||||
///
|
///
|
||||||
/// Starts an editor to let you edit the description of a change. The editor
|
/// Starts an editor to let you edit the description of a change. The editor
|
||||||
/// will be $EDITOR, or `pico` if that's not defined.
|
/// will be $EDITOR, or `pico` if that's not defined.
|
||||||
|
@ -413,6 +413,11 @@ struct DescribeArgs {
|
||||||
/// Read the change description from stdin
|
/// Read the change description from stdin
|
||||||
#[arg(long)]
|
#[arg(long)]
|
||||||
stdin: bool,
|
stdin: bool,
|
||||||
|
/// Reset the author to the configured user
|
||||||
|
///
|
||||||
|
/// This resets the author name, email, and timestamp.
|
||||||
|
#[arg(long)]
|
||||||
|
reset_author: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Update the description and create a new change on top.
|
/// Update the description and create a new change on top.
|
||||||
|
@ -1806,15 +1811,20 @@ fn cmd_describe(
|
||||||
let template = description_template_for_commit(&workspace_command, &commit)?;
|
let template = description_template_for_commit(&workspace_command, &commit)?;
|
||||||
edit_description(workspace_command.repo(), &template, command.settings())?
|
edit_description(workspace_command.repo(), &template, command.settings())?
|
||||||
};
|
};
|
||||||
if description == *commit.description() {
|
if description == *commit.description() && !args.reset_author {
|
||||||
ui.write("Nothing changed.\n")?;
|
ui.write("Nothing changed.\n")?;
|
||||||
} else {
|
} else {
|
||||||
let mut tx =
|
let mut tx =
|
||||||
workspace_command.start_transaction(&format!("describe commit {}", commit.id().hex()));
|
workspace_command.start_transaction(&format!("describe commit {}", commit.id().hex()));
|
||||||
tx.mut_repo()
|
let mut commit_builder = tx
|
||||||
|
.mut_repo()
|
||||||
.rewrite_commit(command.settings(), &commit)
|
.rewrite_commit(command.settings(), &commit)
|
||||||
.set_description(description)
|
.set_description(description);
|
||||||
.write()?;
|
if args.reset_author {
|
||||||
|
let new_author = commit_builder.committer().clone();
|
||||||
|
commit_builder = commit_builder.set_author(new_author);
|
||||||
|
}
|
||||||
|
commit_builder.write()?;
|
||||||
tx.finish(ui)?;
|
tx.finish(ui)?;
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
|
@ -141,3 +141,49 @@ fn test_describe() {
|
||||||
.failure();
|
.failure();
|
||||||
assert!(get_stderr_string(&assert).contains("bad-jj-editor-from-jj-editor-env"));
|
assert!(get_stderr_string(&assert).contains("bad-jj-editor-from-jj-editor-env"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_describe_author() {
|
||||||
|
let test_env = TestEnvironment::default();
|
||||||
|
test_env.jj_cmd_success(test_env.env_root(), &["init", "repo", "--git"]);
|
||||||
|
let repo_path = test_env.env_root().join("repo");
|
||||||
|
|
||||||
|
test_env.add_config(
|
||||||
|
r#"[template-aliases]
|
||||||
|
'format_signature(signature)' = 'signature.name() ++ " " ++ signature.email() ++ " " ++ signature.timestamp()'"#,
|
||||||
|
);
|
||||||
|
let get_signatures = || {
|
||||||
|
test_env.jj_cmd_success(
|
||||||
|
&repo_path,
|
||||||
|
&[
|
||||||
|
"log",
|
||||||
|
"-r@",
|
||||||
|
"-T",
|
||||||
|
r#"format_signature(author) ++ "\n" ++ format_signature(committer)"#,
|
||||||
|
],
|
||||||
|
)
|
||||||
|
};
|
||||||
|
insta::assert_snapshot!(get_signatures(), @r###"
|
||||||
|
@ Test User test.user@example.com 2001-02-03 04:05:07.000 +07:00
|
||||||
|
│ Test User test.user@example.com 2001-02-03 04:05:07.000 +07:00
|
||||||
|
~
|
||||||
|
"###);
|
||||||
|
|
||||||
|
// Reset the author (the committer is always reset)
|
||||||
|
test_env.jj_cmd_success(
|
||||||
|
&repo_path,
|
||||||
|
&[
|
||||||
|
"describe",
|
||||||
|
"--config-toml",
|
||||||
|
r#"user.name = "Ove Ridder"
|
||||||
|
user.email = "ove.ridder@example.com""#,
|
||||||
|
"-m=description",
|
||||||
|
"--reset-author",
|
||||||
|
],
|
||||||
|
);
|
||||||
|
insta::assert_snapshot!(get_signatures(), @r###"
|
||||||
|
@ Ove Ridder ove.ridder@example.com 2001-02-03 04:05:09.000 +07:00
|
||||||
|
│ Ove Ridder ove.ridder@example.com 2001-02-03 04:05:09.000 +07:00
|
||||||
|
~
|
||||||
|
"###);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue