use anyhow::Context;
use worktrunk::git::Repository;
pub fn step_diff(
branch: Option<&str>,
target: Option<&str>,
extra_args: &[String],
) -> anyhow::Result<()> {
let repo = match branch {
Some(b) => {
let worktree_path =
Repository::current()?
.worktree_for_branch(b)?
.ok_or_else(|| worktrunk::git::GitError::WorktreeNotFound {
branch: b.to_string(),
})?;
Repository::at(&worktree_path)?
}
None => Repository::current()?,
};
let wt = repo.current_worktree();
let integration_target = repo.require_target_ref(target)?;
let merge_base = repo
.merge_base("HEAD", &integration_target)?
.context("No common ancestor with target branch")?;
let idx = wt.temp_index()?;
idx.git(["add", "--intent-to-add", "."])
.run()
.context("Failed to register untracked files")?;
let mut diff_args = vec!["diff".to_string(), merge_base];
diff_args.extend_from_slice(extra_args);
idx.git(diff_args).stream()?;
Ok(())
}