From d58664d40cf60531d2abe4b73114b9e01a15e23b Mon Sep 17 00:00:00 2001 From: Waleed Khan Date: Mon, 25 Sep 2023 02:48:17 +0200 Subject: [PATCH] command: add `--interactive` flag to `jj commit` --- CHANGELOG.md | 2 ++ cli/src/commands/mod.rs | 22 +++++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 42a2dc3bb..f43bd58db 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,6 +44,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * `jj commit` accepts an optional list of paths indicating a subset of files to include in the first commit +* `jj commit` accepts the `--interactive` flag. + ### Fixed bugs ## [0.9.0] - 2023-09-06 diff --git a/cli/src/commands/mod.rs b/cli/src/commands/mod.rs index f03abb33c..837451cce 100644 --- a/cli/src/commands/mod.rs +++ b/cli/src/commands/mod.rs @@ -469,6 +469,9 @@ struct DescribeArgs { #[derive(clap::Args, Clone, Debug)] #[command(visible_aliases=&["ci"])] struct CommitArgs { + /// Interactively choose which changes to include in the first commit + #[arg(short, long)] + interactive: bool, /// The change description to use (don't open editor) #[arg(long = "message", short, value_name = "MESSAGE")] message_paragraphs: Vec, @@ -2141,7 +2144,24 @@ fn cmd_commit(ui: &mut Ui, command: &CommandHelper, args: &CommitArgs) -> Result let matcher = workspace_command.matcher_from_values(&args.paths)?; let mut tx = workspace_command.start_transaction(&format!("commit {}", commit.id().hex())); let base_tree = merge_commit_trees(tx.repo(), &commit.parents())?; - let tree_id = tx.select_diff(ui, &base_tree, &commit.tree()?, matcher.as_ref(), "", false)?; + let instructions = format!( + "\ +You are splitting the working-copy commit: {} + +The diff initially shows all changes. Adjust the right side until it shows the +contents you want for the first commit. The remainder will be included in the +new working-copy commit. +", + tx.format_commit_summary(&commit) + ); + let tree_id = tx.select_diff( + ui, + &base_tree, + &commit.tree()?, + matcher.as_ref(), + &instructions, + args.interactive, + )?; let middle_tree = tx.repo().store().get_root_tree(&tree_id)?; if !args.paths.is_empty() && middle_tree.id() == base_tree.id() { writeln!(