feat(git): inline file diffs in commit history rows (#1291)

* chore: add .worktrees/ to gitignore for worktree workflow

* feat(git): add getCommitFileDiff service function

* docs(git): document getCommitFileDiff in module docs

* feat(git): add GET /api/git/commit-file-diff route

* feat(git): add CommitFileDiffResponse type and GitAPI method signature

* feat(git): add getCommitFileDiff HTTP client function

* feat(git): add getCommitFileDiff API facade

* feat(git): add getCommitFileDiff stub to VS Code bridge

* feat(git): add getCommitFileDiff to VS Code gitService and bridge handler

* feat(git): add inline file diff to history commit rows

* fix(git): consolidate CommitFileDiffResponse import to gitApi facade

* fix(git): pass directory through history, validate hash, propagate git errors

* fix(git): use exit code check for VS Code getCommitFileDiff error detection

* fix(git): VS Code rename detection, hash validation parity, retry on error

* fix(git): register scroll container as virtualizer root to fix empty space in history diffs

* fix(git): address greptile review — rename key extraction, directory guard, language detection, isBinary cleanup

* fix(git): harden history inline diffs

---------

Co-authored-by: Bohdan Triapitsyn <artmore@protonmail.com>
This commit is contained in:
Erman HAVUÇ
2026-05-17 20:08:17 +03:00
committed by GitHub
co-authored by Bohdan Triapitsyn
parent fa8fac2590
commit 631905764e
19 changed files with 488 additions and 44 deletions
+26
View File
@@ -943,4 +943,30 @@ export function registerGitRoutes(app) {
}
});
app.get('/api/git/commit-file-diff', async (req, res) => {
const { getCommitFileDiff } = await getGitLibraries();
try {
const { directory, hash, path: filePath } = req.query;
if (!directory || typeof directory !== 'string') {
return res.status(400).json({ error: 'directory parameter is required' });
}
if (!hash || typeof hash !== 'string') {
return res.status(400).json({ error: 'hash parameter is required' });
}
if (!/^[0-9a-fA-F]{7,40}$/.test(hash)) {
return res.status(400).json({ error: 'hash must be a valid commit SHA' });
}
if (!filePath || typeof filePath !== 'string') {
return res.status(400).json({ error: 'path parameter is required' });
}
const isBinary = req.query.binary === 'true';
const result = await getCommitFileDiff(directory, hash, filePath, isBinary);
res.json(result);
} catch (error) {
console.error('Failed to get commit file diff:', error);
res.status(500).json({ error: error.message || 'Failed to get commit file diff' });
}
});
}