Detect file renames in review diffs#3916
Conversation
|
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
ApprovabilityVerdict: Needs human review This PR fundamentally changes how working tree review diffs are computed, replacing per-file untracked diff generation with a temporary index-based approach. This is a significant architectural change to core diff logic that affects the review workflow and warrants human review. You can customize Macroscope's approvability policy. Learn more. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 0ac42fc27c
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Verification
1. File rename with no changes
Git detects one rename and the viewer renders a single
exact-original.ts → exact-renamed.tsentry with-0 +0and no content hunk.2. File rename with minimal changes
Git detects an 84% similar rename, so the viewer keeps one
minimal-original.ts → minimal-renamed.tsentry and renders the-1 +1content diff.3. File rename with too many changes
The files are below Git's rename-similarity threshold, so the viewer correctly renders
replaced-new.tsas an addition andreplaced-original.tsas a deletion.Summary
Root cause
Working-tree previews generated tracked and untracked patches separately. A normal filesystem rename therefore appeared as an unrelated deletion and addition because Git never saw both paths in the same comparison.
Impact
The diff viewer now renders qualifying file moves as one renamed file while still showing any content changes. Branch comparisons use the same explicit Git rename detection.
Validation
pnpm exec vp test apps/server/src/vcs/GitVcsDriverCore.test.ts(27 tests)pnpm exec vp checkpnpm exec vp run typecheckgit diff --checkNote
Detect file renames in working-tree and branch-range review diffs
git diff --no-indexper untracked file) with a single unified diff via the newreadWorkingTreeReviewDifffunction in GitVcsDriverCore.ts.--find-renamesand--minimalagainst HEAD (or an empty tree when no commits exist yet).--find-renamesto the branch-range diff so committed renames are also detected./dev/nulldiff approach is removed.Macroscope summarized aa8d932.
Note
Medium Risk
Core review diff generation changed for all dirty worktrees and branch comparisons; behavior is broader (renames, empty repos) but relies on temp-index Git orchestration where regressions would affect the diff viewer.
Overview
Review working-tree previews no longer merge a tracked
git diff HEADwith per-file untrackeddiff --no-indexpatches. They now go throughreadWorkingTreeReviewDiff, which copies the real index into a temporaryGIT_INDEX_FILE, stages the tree withgit add --intent-to-add -A, and emits onegit diff --find-renamesagainst HEAD (or an empty tree before the first commit).Branch-range previews also pass
--find-renames, so committed renames show as renames with content hunks instead of unrelated add/delete pairs.Integration tests cover pre-first-commit untracked/staged files, unstaged renames with edits, sparse-checkout scope, staged index-only deletions (
git rm --cached), and committed renames on the branch diff. Truncation for the dirty worktree now follows that single diff’s byte limit (the old separate untracked/workspace caps are removed).Reviewed by Cursor Bugbot for commit aa8d932. Bugbot is set up for automated code reviews on this repo. Configure here.