diff --git a/cli/src/commands/absorb.rs b/cli/src/commands/absorb.rs index 7f0584cfc..e843b5d17 100644 --- a/cli/src/commands/absorb.rs +++ b/cli/src/commands/absorb.rs @@ -91,27 +91,33 @@ pub(crate) fn cmd_absorb( workspace_command.check_rewritable(selected_trees.target_commits.keys())?; let mut tx = workspace_command.start_transaction(); - let (rewritten_commits, num_rebased) = - absorb_hunks(tx.repo_mut(), &source, selected_trees.target_commits)?; + let stats = absorb_hunks(tx.repo_mut(), &source, selected_trees.target_commits)?; if let Some(mut formatter) = ui.status_formatter() { - if !rewritten_commits.is_empty() { + if !stats.rewritten_destinations.is_empty() { writeln!(formatter, "Absorbed changes into these revisions:")?; let template = tx.commit_summary_template(); - for commit in rewritten_commits.iter().rev() { + for commit in stats.rewritten_destinations.iter().rev() { write!(formatter, " ")?; template.format(commit, formatter.as_mut())?; writeln!(formatter)?; } } - if num_rebased > 0 { - writeln!(formatter, "Rebased {num_rebased} descendant commits.")?; + if stats.num_rebased > 0 { + writeln!( + formatter, + "Rebased {} descendant commits.", + stats.num_rebased + )?; } } tx.finish( ui, - format!("absorb changes into {} commits", rewritten_commits.len()), + format!( + "absorb changes into {} commits", + stats.rewritten_destinations.len() + ), )?; Ok(()) } diff --git a/lib/src/absorb.rs b/lib/src/absorb.rs index 37d14ef5b..cb15a49b7 100644 --- a/lib/src/absorb.rs +++ b/lib/src/absorb.rs @@ -268,15 +268,26 @@ fn combine_texts(text1: &[u8], text2: &[u8], selected_ranges: &[SelectedRange]) .collect() } +/// Describes changes made by [`absorb_hunks()`]. +#[derive(Clone, Debug)] +pub struct AbsorbStats { + /// Rewritten commits which the source hunks were absorbed into, in forward + /// topological order. + pub rewritten_destinations: Vec, + /// Number of descendant commits which were rebased. The number of rewritten + /// destination commits are not included. + pub num_rebased: usize, +} + /// Merges selected trees into the specified commits. Abandons the source commit /// if it becomes discardable. pub fn absorb_hunks( repo: &mut MutableRepo, source: &AbsorbSource, mut selected_trees: HashMap, -) -> BackendResult<(Vec, usize)> { +) -> BackendResult { let store = repo.store().clone(); - let mut rewritten_commits = Vec::new(); + let mut rewritten_destinations = Vec::new(); let mut num_rebased = 0; // Rewrite commits in topological order so that descendant commits wouldn't // be rewritten multiple times. @@ -309,10 +320,13 @@ pub fn absorb_hunks( .set_tree_id(new_tree.id()) .set_predecessors(predecessors) .write()?; - rewritten_commits.push(new_commit); + rewritten_destinations.push(new_commit); Ok(()) })?; - Ok((rewritten_commits, num_rebased)) + Ok(AbsorbStats { + rewritten_destinations, + num_rebased, + }) } struct FileValue {