Skip to content

Commit

Permalink
cli: add better error message when immutable_heads() cannot be resolved
Browse files Browse the repository at this point in the history
  • Loading branch information
noahmayr committed Apr 2, 2024
1 parent 320f50e commit 53a6d71
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 2 deletions.
7 changes: 6 additions & 1 deletion cli/src/cli_util.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1012,7 +1012,12 @@ impl WorkspaceCommandHelper {
let immutable = revset_util::parse_immutable_expression(&self.revset_parse_context())?;
let mut expression = self.attach_revset_evaluator(immutable)?;
expression.intersect_with(&to_rewrite_revset);
if let Some(commit_id) = expression.evaluate_to_commit_ids()?.next() {

let mut commit_id_iter = expression.evaluate_to_commit_ids().map_err(|e| {
config_error_with_message("Invalid `revset-aliases.immutable_heads()`", e)
})?;

if let Some(commit_id) = commit_id_iter.next() {
let error = if &commit_id == self.repo().store().root_commit_id() {
user_error(format!(
"The root commit {} is immutable",
Expand Down
23 changes: 23 additions & 0 deletions cli/tests/test_immutable_commits.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,29 @@ fn test_rewrite_immutable_generic() {
insta::assert_snapshot!(stderr, @r###"
Error: The root commit 000000000000 is immutable
"###);

// Error mutating the repo if immutable_heads() uses a ref that can't be resolved
test_env.add_config(r#"revset-aliases."immutable_heads()" = "branch_that_does_not_exist""#);
let stderr = test_env.jj_cmd_failure(&repo_path, &["new", "main"]);
insta::assert_snapshot!(stderr, @r###"
Config error: Invalid `revset-aliases.immutable_heads()`
Caused by: Revision "branch_that_does_not_exist" doesn't exist
For help, see https://github.com/martinvonz/jj/blob/main/docs/config.md.
"###);

// Mutating the repo works if ref is wrapped in present()
test_env.add_config(
r#"revset-aliases."immutable_heads()" = "present(branch_that_does_not_exist)""#,
);
let (stdout, stderr) = test_env.jj_cmd_ok(&repo_path, &["new", "main"]);
insta::assert_snapshot!(stdout, @r###"
"###);
insta::assert_snapshot!(stderr, @r###"
Working copy now at: kpqxywon dbce15b4 (empty) (no description set)
Parent commit : kkmpptxz c8d4c7ca main | b
Added 0 files, modified 1 files, removed 0 files
"###);

// Error if we redefine immutable_heads() with an argument
test_env.add_config(r#"revset-aliases."immutable_heads(foo)" = "none()""#);
let stderr = test_env.jj_cmd_failure(&repo_path, &["edit", "root()"]);
Expand Down
2 changes: 1 addition & 1 deletion docs/contributing.md
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ You will probably also want to make the `gh-pages` branch immutable (and thereby
hidden from the default `jj log` output) by running the following in your repo:

```shell
jj config set --repo "revset-aliases.immutable_heads()" "main@origin | gh-pages@origin"
jj config set --repo "revset-aliases.immutable_heads()" 'remote_branches(exact:"main") | remote_branches(exact:"gh-pages")'
```

### Summary
Expand Down

0 comments on commit 53a6d71

Please sign in to comment.