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:
parent
d34198d111
commit
8c11a8ea3e
4 changed files with 119 additions and 13 deletions
|
@ -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
|
||||
|
|
|
@ -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>,
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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]
|
||||
|
|
Loading…
Reference in a new issue