Detect file renames in review diffs - #3916
jakeleventhal wants to merge 4 commits into
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 Plus 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 1 blocking correctness issue found. This PR introduces new rename detection capability in review diffs with substantial implementation complexity (temporary index manipulation, split-index handling, error recovery). The ~200 lines of new implementation logic, runtime behavior changes, and an unresolved High severity finding about silent error handling warrant 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".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 0fc42d53cc
ℹ️ 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".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: fd2f9f87ba
ℹ️ 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".
fd2f9f8 to
5c5c8da
Compare
There was a problem hiding this comment.
One error-modeling issue found in apps/server/src/vcs/GitVcsDriverCore.ts: the shared-index copyFile failure is not mapped to the service's domain error.
Posted via Macroscope — Effect Service Conventions
c762d03 to
1535d69
Compare
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.
There are 2 total unresolved issues (including 1 from previous review).
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 1535d69. Configure here.
There was a problem hiding this comment.
Reviewed the new working-tree review-diff helpers against the Effect service conventions. One unmapped platform failure remains in readWorkingTreeReviewDiff.
Posted via Macroscope — Effect Service Conventions
|
Note 🤖 GPT-5.6 Sol responding on behalf of Theo Closing this because the branch and screenshots are too far behind the current app. We are still interested in correct file rename detection. Please open a new, smaller PR based on the latest |
|

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
--no-indexdiffs for untracked files with a single unified diff built via a temporary Git index inGitVcsDriverCore.ts.--find-renamesto both the working-tree and branch-range diff invocations.readTrackedWorkingTreeReviewDiff(tracked changes only, no untracked files) if the temp-index approach fails with aGitCommandError.Macroscope summarized e226410.
Note
Medium Risk
Changes core Git diff preview behavior for dirty worktrees (new subprocess/index workflow) with fallbacks, but mistakes could misrepresent staged/untracked or rename state in the review UI.
Overview
Working-tree review previews no longer merge a tracked
git diff HEADwith per-filegit diff --no-indexfor untracked paths. They now build one patch viareadWorkingTreeReviewDiff: copy the real index into a tempGIT_INDEX_FILE, stage untracked paths withgit add --intent-to-add, run a singlegit diff --find-renamesagainstHEAD(or an empty tree before the first commit), and tear down the temp index without touching the user’s split/shared index. On failure,readTrackedWorkingTreeReviewDiffstill returns tracked changes with rename detection.Branch-range previews add
--find-renamesto the existing base…HEAD diff so committed renames show as one entry with content hunks.Integration tests cover pre-first-commit dirty trees, unstaged/committed renames with edits, sparse-checkout, staged index-only deletions (including truncated deletion lists), nested repos, split-index safety, and several fallback paths when temp-index steps fail.
Reviewed by Cursor Bugbot for commit e226410. Bugbot is set up for automated code reviews on this repo. Configure here.