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

cli new: Allow --before/--after without a value to default to @

Without this, I find it a bit jarring that `jj new` works but `jj new
--before` does not. By contrast, since `jj rebase` does not currently
work, I don't think `jj rebase --before` should either.

Note that `jj new --before @ another_revision` is invalid, so `jj new
--before another_revision` can only be parsed correctly in one way. I am
slightly concerned that `clap` might forbids this in the future even in
the cases where a human can tell there is no ambiguity, but I'm hoping
for the best.
This commit is contained in:
Ilya Grigoriev 2024-09-29 14:25:04 -07:00
parent d34198d111
commit 8c11a8ea3e
4 changed files with 119 additions and 13 deletions

View file

@ -97,6 +97,9 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
* Color author and committer names yellow
* Without a specified revision, `jj new --insert-before` is now equivalent to
`jj new --insert-before @`; same for `--insert-after`.
### Fixed bugs
* Update working copy before reporting changes. This prevents errors during reporting

View file

@ -63,20 +63,28 @@ pub(crate) struct NewArgs {
/// No-op flag to pair with --no-edit
#[arg(long, hide = true)]
_edit: bool,
/// Insert the new change after the given commit(s)
/// Insert the new change after the given commit(s), or after `@` if no
/// commit is specified
#[arg(
long,
short = 'A',
visible_alias = "after",
conflicts_with = "revisions"
conflicts_with = "revisions",
default_missing_value = "@",
// At most one argument per --after, does not restrict repeating --after
num_args=0..=1,
)]
insert_after: Vec<RevisionArg>,
/// Insert the new change before the given commit(s)
/// Insert the new change before the given commit(s), or before `@` if no
/// commit is specified
#[arg(
long,
short = 'B',
visible_alias = "before",
conflicts_with = "revisions"
conflicts_with = "revisions",
default_missing_value = "@",
// At most one argument per --before, does not restrict repeating --before
num_args=0..=1,
)]
insert_before: Vec<RevisionArg>,
}

View file

@ -1268,8 +1268,8 @@ For more information, see https://martinvonz.github.io/jj/latest/working-copy/.
* `-m`, `--message <MESSAGE>` — The change description to use
* `--no-edit` — Do not edit the newly created change
* `-A`, `--insert-after <INSERT_AFTER>` — Insert the new change after the given commit(s)
* `-B`, `--insert-before <INSERT_BEFORE>` — Insert the new change before the given commit(s)
* `-A`, `--insert-after <INSERT_AFTER>` — Insert the new change after the given commit(s), or after `@` if no commit is specified
* `-B`, `--insert-before <INSERT_BEFORE>` — Insert the new change before the given commit(s), or before `@` if no commit is specified

View file

@ -224,13 +224,108 @@ fn test_new_insert_after() {
// --after cannot be used with revisions
let stderr = test_env.jj_cmd_cli_error(&repo_path, &["new", "--after", "B", "D"]);
insta::assert_snapshot!(stderr, @r###"
error: the argument '--insert-after <INSERT_AFTER>' cannot be used with '[REVISIONS]...'
insta::assert_snapshot!(stderr, @r#"
error: the argument '--insert-after [<INSERT_AFTER>]' cannot be used with '[REVISIONS]...'
Usage: jj new --insert-after <INSERT_AFTER> [REVISIONS]...
Usage: jj new --insert-after [<INSERT_AFTER>] [REVISIONS]...
For more information, try '--help'.
"#);
}
#[test]
fn test_new_insert_before_after_no_arg() {
let test_env = TestEnvironment::default();
test_env.jj_cmd_ok(test_env.env_root(), &["git", "init", "repo"]);
let repo_path = test_env.env_root().join("repo");
setup_before_insertion(&test_env, &repo_path);
test_env.jj_cmd_ok(&repo_path, &["edit", "-r", "B"]);
insta::assert_snapshot!(get_short_log_output(&test_env, &repo_path), @r###"
F
E
D
C
@ B
A
root
"###);
let (stdout, stderr) = test_env.jj_cmd_ok(&repo_path, &["new", "--after", "-m", "G"]);
insta::assert_snapshot!(stdout, @"");
insta::assert_snapshot!(stderr, @r#"
Rebased 1 descendant commits
Working copy now at: nkmrtpmo cf1ca757 (empty) G
Parent commit : kkmpptxz bfd4157e B | (empty) B
"#);
insta::assert_snapshot!(get_short_log_output(&test_env, &repo_path), @r#"
C
@ G
B
A
F
E
D
root
"#);
let (stdout, stderr) = test_env.jj_cmd_ok(&repo_path, &["new", "-m", "H", "--before"]);
insta::assert_snapshot!(stdout, @"");
insta::assert_snapshot!(stderr, @r#"
Rebased 2 descendant commits
Working copy now at: xznxytkn f9f74f27 (empty) H
Parent commit : kkmpptxz bfd4157e B | (empty) B
"#);
insta::assert_snapshot!(get_short_log_output(&test_env, &repo_path), @r#"
C
G
@ H
B
A
F
E
D
root
"#);
let (stdout, stderr) = test_env.jj_cmd_ok(
&repo_path,
&["new", "-m", "I", "--after", "--after", "D", "--no-edit"],
);
insta::assert_snapshot!(stdout, @"");
insta::assert_snapshot!(stderr, @r#"
Created new commit nmzmmopx 56056dac (empty) I
Rebased 3 descendant commits
"#);
insta::assert_snapshot!(get_short_log_output(&test_env, &repo_path), @r#"
C
G
F
I
D
@ H
B
A
E
root
"#);
let stderr = test_env.jj_cmd_failure(&repo_path, &["new", "--before", "--after"]);
insta::assert_snapshot!(stderr, @r#"
Error: Refusing to create a loop: commit f9f74f27408e would be both an ancestor and a descendant of the new commit
"#);
}
#[test]
@ -346,13 +441,13 @@ fn test_new_insert_before() {
// --before cannot be used with revisions
let stderr = test_env.jj_cmd_cli_error(&repo_path, &["new", "--before", "B", "D"]);
insta::assert_snapshot!(stderr, @r###"
error: the argument '--insert-before <INSERT_BEFORE>' cannot be used with '[REVISIONS]...'
insta::assert_snapshot!(stderr, @r#"
error: the argument '--insert-before [<INSERT_BEFORE>]' cannot be used with '[REVISIONS]...'
Usage: jj new --insert-before <INSERT_BEFORE> [REVISIONS]...
Usage: jj new --insert-before [<INSERT_BEFORE>] [REVISIONS]...
For more information, try '--help'.
"###);
"#);
}
#[test]