From 07294e147190a3cac9d661091157a6fa7fec39ad Mon Sep 17 00:00:00 2001 From: Louis Knight-Webb Date: Fri, 11 Jul 2025 10:28:01 +0100 Subject: [PATCH] Diff with base branch (#129) * Diff with base branch * fmt --- backend/src/models/task_attempt.rs | 12 ++++++++++-- backend/src/services/git_service.rs | 15 +++++++++++---- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/backend/src/models/task_attempt.rs b/backend/src/models/task_attempt.rs index ba9a8b60..d3aeec9d 100644 --- a/backend/src/models/task_attempt.rs +++ b/backend/src/models/task_attempt.rs @@ -683,7 +683,11 @@ impl TaskAttempt { if let Some(merge_commit_id) = &ctx.task_attempt.merge_commit { // Task attempt has been merged - show the diff from the merge commit git_service - .get_enhanced_diff(Path::new(""), Some(merge_commit_id)) + .get_enhanced_diff( + Path::new(""), + Some(merge_commit_id), + &ctx.task_attempt.base_branch, + ) .map_err(TaskAttemptError::from) } else { // Task attempt not yet merged - get worktree diff @@ -692,7 +696,11 @@ impl TaskAttempt { Self::ensure_worktree_exists(pool, attempt_id, project_id, "diff").await?; git_service - .get_enhanced_diff(Path::new(&worktree_path), None) + .get_enhanced_diff( + Path::new(&worktree_path), + None, + &ctx.task_attempt.base_branch, + ) .map_err(TaskAttemptError::from) } } diff --git a/backend/src/services/git_service.rs b/backend/src/services/git_service.rs index 3e222fc8..2fc8c2a8 100644 --- a/backend/src/services/git_service.rs +++ b/backend/src/services/git_service.rs @@ -309,6 +309,7 @@ impl GitService { &self, worktree_path: &Path, merge_commit_id: Option<&str>, + base_branch: &str, ) -> Result { let mut files = Vec::new(); @@ -317,7 +318,7 @@ impl GitService { self.get_merged_diff(merge_commit_id, &mut files)?; } else { // Task attempt not yet merged - get worktree diff - self.get_worktree_diff(worktree_path, &mut files)?; + self.get_worktree_diff(worktree_path, base_branch, &mut files)?; } Ok(WorktreeDiff { files }) @@ -417,18 +418,24 @@ impl GitService { fn get_worktree_diff( &self, worktree_path: &Path, + base_branch: &str, files: &mut Vec, ) -> Result<(), GitServiceError> { let worktree_repo = Repository::open(worktree_path)?; let main_repo = self.open_repo()?; - let main_head_oid = main_repo.head()?.peel_to_commit()?.id(); + + // Get the base branch commit + let base_branch_ref = main_repo + .find_branch(base_branch, BranchType::Local) + .map_err(|_| GitServiceError::BranchNotFound(base_branch.to_string()))?; + let base_branch_oid = base_branch_ref.get().peel_to_commit()?.id(); // Get the current worktree HEAD commit let worktree_head = worktree_repo.head()?; let worktree_head_oid = worktree_head.peel_to_commit()?.id(); - // Find the merge base (common ancestor) - let base_oid = worktree_repo.merge_base(main_head_oid, worktree_head_oid)?; + // Find the merge base (common ancestor) between the base branch and worktree head + let base_oid = worktree_repo.merge_base(base_branch_oid, worktree_head_oid)?; let base_commit = worktree_repo.find_commit(base_oid)?; let base_tree = base_commit.tree()?;