cli fix: add revsets.fix config for default revset to be fixed

This commit is contained in:
Danny Hooper 2024-06-06 21:42:50 -05:00
parent 3acf985ac0
commit faf9a9d757
6 changed files with 77 additions and 10 deletions

View file

@ -22,6 +22,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
* Show paths to config files when configuration errors occur
* `jj fix` now supports configuring the default revset for `-s` using the
`revsets.fix` config.
### Fixed bugs
## [0.18.0] - 2024-06-05

View file

@ -65,7 +65,9 @@ use crate::ui::Ui;
#[derive(clap::Args, Clone, Debug)]
#[command(verbatim_doc_comment)]
pub(crate) struct FixArgs {
/// Fix files in the specified revision(s) and their descendants
/// Fix files in the specified revision(s) and their descendants. If no
/// revisions are specified, this defaults to the `revsets.fix` setting, or
/// `@` if it is not set.
#[arg(long, short)]
source: Vec<RevisionArg>,
/// Fix only these paths
@ -80,14 +82,15 @@ pub(crate) fn cmd_fix(
args: &FixArgs,
) -> Result<(), CommandError> {
let mut workspace_command = command.workspace_helper(ui)?;
let root_commits: Vec<CommitId> = workspace_command
.parse_union_revsets(if args.source.is_empty() {
&[RevisionArg::AT]
} else {
&args.source
})?
.evaluate_to_commit_ids()?
.collect();
let root_commits: Vec<CommitId> = if args.source.is_empty() {
workspace_command.parse_revset(&RevisionArg::from(
command.settings().config().get_string("revsets.fix")?,
))?
} else {
workspace_command.parse_union_revsets(&args.source)?
}
.evaluate_to_commit_ids()?
.collect();
workspace_command.check_rewritable(root_commits.iter())?;
let matcher = workspace_command
.parse_file_patterns(&args.paths)?

View file

@ -346,6 +346,11 @@
"type": "object",
"description": "Revset expressions used by various commands",
"properties": {
"fix": {
"type": "string",
"description": "Default set of revisions to fix when no explicit revset is given for jj fix",
"default": "@"
},
"log": {
"type": "string",
"description": "Default set of revisions to show when no explicit revset is given for jj log and similar commands",

View file

@ -2,6 +2,7 @@
# adding/updating any of these aliases
[revsets]
fix = "@"
log = "@ | ancestors(immutable_heads().., 2) | trunk()"
[revset-aliases]

View file

@ -798,7 +798,7 @@ And then run the command `jj fix -s @`.
###### **Options:**
* `-s`, `--source <SOURCE>` — Fix files in the specified revision(s) and their descendants
* `-s`, `--source <SOURCE>` — Fix files in the specified revision(s) and their descendants. If no revisions are specified, this defaults to the `revsets.fix` setting, or `@` if it is not set

View file

@ -139,6 +139,61 @@ fn test_fix_sibling_commit() {
insta::assert_snapshot!(content, @"child2");
}
#[test]
fn test_default_revset() {
let (test_env, repo_path) = init_with_fake_formatter(&["--uppercase"]);
std::fs::write(repo_path.join("file"), "foo").unwrap();
test_env.jj_cmd_ok(&repo_path, &["branch", "create", "foo"]);
test_env.jj_cmd_ok(&repo_path, &["new"]);
std::fs::write(repo_path.join("file"), "bar").unwrap();
test_env.jj_cmd_ok(&repo_path, &["branch", "create", "bar"]);
test_env.jj_cmd_ok(&repo_path, &["new", "foo"]);
std::fs::write(repo_path.join("file"), "baz").unwrap();
test_env.jj_cmd_ok(&repo_path, &["branch", "create", "baz"]);
// With no args and no revset configuration, we fix `@`.
let (stdout, stderr) = test_env.jj_cmd_ok(&repo_path, &["fix"]);
insta::assert_snapshot!(stdout, @"");
insta::assert_snapshot!(stderr, @r###"
Fixed 1 commits of 1 checked.
Working copy now at: mzvwutvl 5205c5f1 baz | (no description set)
Parent commit : qpvuntsm 34af74d0 foo | (no description set)
Added 0 files, modified 1 files, removed 0 files
"###);
let content = test_env.jj_cmd_success(&repo_path, &["print", "file", "-r", "foo"]);
insta::assert_snapshot!(content, @"foo");
let content = test_env.jj_cmd_success(&repo_path, &["print", "file", "-r", "bar"]);
insta::assert_snapshot!(content, @"bar");
let content = test_env.jj_cmd_success(&repo_path, &["print", "file", "-r", "baz"]);
insta::assert_snapshot!(content, @"BAZ");
}
#[test]
fn test_custom_default_revset() {
let (test_env, repo_path) = init_with_fake_formatter(&["--uppercase"]);
std::fs::write(repo_path.join("file"), "foo").unwrap();
test_env.jj_cmd_ok(&repo_path, &["branch", "create", "foo"]);
test_env.jj_cmd_ok(&repo_path, &["new"]);
std::fs::write(repo_path.join("file"), "bar").unwrap();
test_env.jj_cmd_ok(&repo_path, &["branch", "create", "bar"]);
// Check out a different commit so that the schema default `@` would behave
// differently from our customized default.
test_env.jj_cmd_ok(&repo_path, &["new", "-r", "foo"]);
test_env.add_config(r#"revsets.fix = "bar""#);
let (stdout, stderr) = test_env.jj_cmd_ok(&repo_path, &["fix"]);
insta::assert_snapshot!(stdout, @"");
insta::assert_snapshot!(stderr, @r###"
Fixed 1 commits of 1 checked.
"###);
let content = test_env.jj_cmd_success(&repo_path, &["print", "file", "-r", "foo"]);
insta::assert_snapshot!(content, @"foo");
let content = test_env.jj_cmd_success(&repo_path, &["print", "file", "-r", "bar"]);
insta::assert_snapshot!(content, @"BAR");
}
#[test]
fn test_fix_immutable_commit() {
let (test_env, repo_path) = init_with_fake_formatter(&["--uppercase"]);