absorb: wrap absorb_hunks() result in struct

This patch also renames rewritten_commits as I'm going to add rewritten_source
field.
This commit is contained in:
Yuya Nishihara 2025-01-15 14:23:28 +09:00
parent 3711979a8f
commit e910ac4040
2 changed files with 31 additions and 11 deletions

View File

@ -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(())
}

View File

@ -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<Commit>,
/// 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<CommitId, MergedTreeBuilder>,
) -> BackendResult<(Vec<Commit>, usize)> {
) -> BackendResult<AbsorbStats> {
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 {