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
|
* 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
|
### Fixed bugs
|
||||||
|
|
||||||
* Update working copy before reporting changes. This prevents errors during reporting
|
* 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
|
/// No-op flag to pair with --no-edit
|
||||||
#[arg(long, hide = true)]
|
#[arg(long, hide = true)]
|
||||||
_edit: bool,
|
_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(
|
#[arg(
|
||||||
long,
|
long,
|
||||||
short = 'A',
|
short = 'A',
|
||||||
visible_alias = "after",
|
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_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(
|
#[arg(
|
||||||
long,
|
long,
|
||||||
short = 'B',
|
short = 'B',
|
||||||
visible_alias = "before",
|
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>,
|
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
|
* `-m`, `--message <MESSAGE>` — The change description to use
|
||||||
* `--no-edit` — Do not edit the newly created change
|
* `--no-edit` — Do not edit the newly created change
|
||||||
* `-A`, `--insert-after <INSERT_AFTER>` — Insert the new change after 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)
|
* `-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
|
// --after cannot be used with revisions
|
||||||
let stderr = test_env.jj_cmd_cli_error(&repo_path, &["new", "--after", "B", "D"]);
|
let stderr = test_env.jj_cmd_cli_error(&repo_path, &["new", "--after", "B", "D"]);
|
||||||
insta::assert_snapshot!(stderr, @r###"
|
insta::assert_snapshot!(stderr, @r#"
|
||||||
error: the argument '--insert-after <INSERT_AFTER>' cannot be used with '[REVISIONS]...'
|
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'.
|
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]
|
#[test]
|
||||||
|
@ -346,13 +441,13 @@ fn test_new_insert_before() {
|
||||||
|
|
||||||
// --before cannot be used with revisions
|
// --before cannot be used with revisions
|
||||||
let stderr = test_env.jj_cmd_cli_error(&repo_path, &["new", "--before", "B", "D"]);
|
let stderr = test_env.jj_cmd_cli_error(&repo_path, &["new", "--before", "B", "D"]);
|
||||||
insta::assert_snapshot!(stderr, @r###"
|
insta::assert_snapshot!(stderr, @r#"
|
||||||
error: the argument '--insert-before <INSERT_BEFORE>' cannot be used with '[REVISIONS]...'
|
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'.
|
For more information, try '--help'.
|
||||||
"###);
|
"#);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
Loading…
Reference in a new issue