forked from mirrors/jj
cli: support multiple --revision
arguments to workspace add
Summary: A natural extension of the existing support, as suggested by Scott Olson. Closes #2496. Signed-off-by: Austin Seipp <aseipp@pobox.com> Change-Id: I91c9c8c377ad67ccde7945ed41af6c79
This commit is contained in:
parent
e701b08f42
commit
e1193db4cf
3 changed files with 94 additions and 6 deletions
|
@ -11,6 +11,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||
|
||||
### New features
|
||||
|
||||
* `jj workspace add` can now take _multiple_ `--revision` arguments, which will
|
||||
create a new workspace with its working-copy commit on top of all the parents,
|
||||
as if you had run `jj new r1 r2 r3 ...`.
|
||||
|
||||
### Fixed bugs
|
||||
|
||||
|
||||
|
|
|
@ -61,10 +61,20 @@ pub(crate) struct WorkspaceAddArgs {
|
|||
/// directory.
|
||||
#[arg(long)]
|
||||
name: Option<String>,
|
||||
/// The revision that the workspace should be created at; a new working copy
|
||||
/// commit will be created on top of it.
|
||||
/// A list of parent revisions for the working-copy commit of the newly
|
||||
/// created workspace. You may specify nothing, or any number of parents.
|
||||
///
|
||||
/// If no revisions are specified, the new workspace will be created, and
|
||||
/// its working-copy commit will exist on top of the parent(s) of the
|
||||
/// working-copy commit in the current workspace, i.e. they will share the
|
||||
/// same parent(s).
|
||||
///
|
||||
/// If any revisions are specified, the new workspace will be created, and
|
||||
/// the new working-copy commit will be created with all these revisions as
|
||||
/// parents, i.e. the working-copy commit will exist as if you had run `jj
|
||||
/// new r1 r2 r3 ...`.
|
||||
#[arg(long, short)]
|
||||
revision: Option<RevisionArg>,
|
||||
revision: Vec<RevisionArg>,
|
||||
}
|
||||
|
||||
/// Stop tracking a workspace's working-copy commit in the repo
|
||||
|
@ -167,9 +177,9 @@ fn cmd_workspace_add(
|
|||
&name
|
||||
));
|
||||
|
||||
let parents = if let Some(specific_rev) = &args.revision {
|
||||
vec![old_workspace_command.resolve_single_rev(specific_rev, ui)?]
|
||||
} else {
|
||||
// If no parent revisions are specified, create a working-copy commit based
|
||||
// on the parent of the current working-copy commit.
|
||||
let parents = if args.revision.is_empty() {
|
||||
// Check out parents of the current workspace's working-copy commit, or the
|
||||
// root if there is no working-copy commit in the current workspace.
|
||||
if let Some(old_wc_commit_id) = tx
|
||||
|
@ -181,6 +191,14 @@ fn cmd_workspace_add(
|
|||
} else {
|
||||
vec![tx.repo().store().root_commit()]
|
||||
}
|
||||
} else {
|
||||
crate::commands::rebase::resolve_destination_revs(
|
||||
&old_workspace_command,
|
||||
ui,
|
||||
&args.revision,
|
||||
)?
|
||||
.into_iter()
|
||||
.collect_vec()
|
||||
};
|
||||
|
||||
let tree = merge_commit_trees(tx.repo(), &parents)?;
|
||||
|
|
|
@ -164,6 +164,72 @@ fn test_workspaces_add_workspace_at_revision() {
|
|||
"###);
|
||||
}
|
||||
|
||||
/// Test multiple `-r` flags to `workspace add` to create a workspace
|
||||
/// working-copy commit with multiple parents.
|
||||
#[test]
|
||||
fn test_workspaces_add_workspace_multiple_revisions() {
|
||||
let test_env = TestEnvironment::default();
|
||||
test_env.jj_cmd_ok(test_env.env_root(), &["init", "--git", "main"]);
|
||||
let main_path = test_env.env_root().join("main");
|
||||
|
||||
std::fs::write(main_path.join("file-1"), "contents").unwrap();
|
||||
test_env.jj_cmd_ok(&main_path, &["commit", "-m", "first"]);
|
||||
test_env.jj_cmd_ok(&main_path, &["new", "-r", "root()"]);
|
||||
|
||||
std::fs::write(main_path.join("file-2"), "contents").unwrap();
|
||||
test_env.jj_cmd_ok(&main_path, &["commit", "-m", "second"]);
|
||||
test_env.jj_cmd_ok(&main_path, &["new", "-r", "root()"]);
|
||||
|
||||
std::fs::write(main_path.join("file-3"), "contents").unwrap();
|
||||
test_env.jj_cmd_ok(&main_path, &["commit", "-m", "third"]);
|
||||
test_env.jj_cmd_ok(&main_path, &["new", "-r", "root()"]);
|
||||
|
||||
insta::assert_snapshot!(get_log_output(&test_env, &main_path), @r###"
|
||||
@ 5b36783cd11c4607a329c5e8c2fd9097c9ce2add
|
||||
│ ◉ 23881f07b53ce1ea936ca8842e344dea9c3356e5
|
||||
├─╯
|
||||
│ ◉ 1f6a15f0af2a985703864347f5fdf27a82fc3d73
|
||||
├─╯
|
||||
│ ◉ e7d7dbb91c5a543ea680711093e689916d5f31df
|
||||
├─╯
|
||||
◉ 0000000000000000000000000000000000000000
|
||||
"###);
|
||||
|
||||
let (_, stderr) = test_env.jj_cmd_ok(
|
||||
&main_path,
|
||||
&[
|
||||
"workspace",
|
||||
"add",
|
||||
"--name=merge",
|
||||
"../merged",
|
||||
"-r=238",
|
||||
"-r=1f6",
|
||||
"-r=e7d",
|
||||
],
|
||||
);
|
||||
insta::assert_snapshot!(stderr.replace('\\', "/"), @r###"
|
||||
Created workspace in "../merged"
|
||||
Working copy now at: wmwvqwsz fa8fdc28 (empty) (no description set)
|
||||
Parent commit : mzvwutvl 23881f07 third
|
||||
Parent commit : kkmpptxz 1f6a15f0 second
|
||||
Parent commit : qpvuntsm e7d7dbb9 first
|
||||
Added 3 files, modified 0 files, removed 0 files
|
||||
"###);
|
||||
|
||||
insta::assert_snapshot!(get_log_output(&test_env, &main_path), @r###"
|
||||
◉ fa8fdc28af12d3c96b1e0ed062f5a8f9a99818f0 merge@
|
||||
├─┬─╮
|
||||
│ │ ◉ e7d7dbb91c5a543ea680711093e689916d5f31df
|
||||
│ ◉ │ 1f6a15f0af2a985703864347f5fdf27a82fc3d73
|
||||
│ ├─╯
|
||||
◉ │ 23881f07b53ce1ea936ca8842e344dea9c3356e5
|
||||
├─╯
|
||||
│ @ 5b36783cd11c4607a329c5e8c2fd9097c9ce2add default@
|
||||
├─╯
|
||||
◉ 0000000000000000000000000000000000000000
|
||||
"###);
|
||||
}
|
||||
|
||||
/// Test making changes to the working copy in a workspace as it gets rewritten
|
||||
/// from another workspace
|
||||
#[test]
|
||||
|
|
Loading…
Reference in a new issue