perf: dedupe VS Code git read execs
Reduce duplicate git rev-parse work in VS Code Cache only safe git read commands Add VS Code bridge cache coverage
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
import { beforeEach, describe, expect, it, mock } from 'bun:test';
|
||||
import { promisify } from 'node:util';
|
||||
|
||||
const execCalls = [];
|
||||
const execMock = mock(() => {
|
||||
throw new Error('exec should be called through promisify');
|
||||
});
|
||||
|
||||
execMock[promisify.custom] = (command, options) => {
|
||||
execCalls.push({ command, options });
|
||||
return new Promise((resolve) => {
|
||||
setTimeout(() => {
|
||||
resolve({ stdout: '/repo/.git\n/repo/.git\n', stderr: '' });
|
||||
}, 10);
|
||||
});
|
||||
};
|
||||
|
||||
mock.module('child_process', () => ({
|
||||
exec: execMock,
|
||||
}));
|
||||
|
||||
mock.module('vscode', () => ({
|
||||
workspace: {
|
||||
workspaceFolders: [{ uri: { fsPath: '/workspace' } }],
|
||||
fs: {},
|
||||
},
|
||||
Uri: {
|
||||
file: (fsPath) => ({ fsPath }),
|
||||
},
|
||||
FileType: {
|
||||
Directory: 2,
|
||||
},
|
||||
window: {},
|
||||
}));
|
||||
|
||||
const { clearGitReadCacheForTests, handleFsBridgeMessage } = await import('./bridge-fs-runtime');
|
||||
|
||||
const deps = {
|
||||
resolveUserPath: (value) => value,
|
||||
listDirectoryEntries: mock(),
|
||||
normalizeFsPath: (value) => value,
|
||||
execGit: mock(),
|
||||
searchDirectory: mock(),
|
||||
resolveFileReadPath: mock(),
|
||||
parseDroppedFileReference: mock(),
|
||||
readUriAsAttachment: mock(),
|
||||
};
|
||||
|
||||
describe('bridge fs exec git read cache', () => {
|
||||
beforeEach(() => {
|
||||
execCalls.length = 0;
|
||||
clearGitReadCacheForTests();
|
||||
});
|
||||
|
||||
it('dedupes in-flight cacheable git reads and reuses fresh results', async () => {
|
||||
const command = 'git rev-parse --absolute-git-dir --git-common-dir';
|
||||
const cwd = '/repo';
|
||||
|
||||
const [first, second] = await Promise.all([
|
||||
handleFsBridgeMessage({ id: '1', type: 'api:fs:exec', payload: { commands: [command], cwd } }, deps),
|
||||
handleFsBridgeMessage({ id: '2', type: 'api:fs:exec', payload: { commands: [command], cwd } }, deps),
|
||||
]);
|
||||
|
||||
expect(first?.success).toBe(true);
|
||||
expect(second?.success).toBe(true);
|
||||
expect(execCalls).toHaveLength(1);
|
||||
|
||||
const spacedCommand = 'git rev-parse --absolute-git-dir --git-common-dir';
|
||||
const cached = await handleFsBridgeMessage({ id: '3', type: 'api:fs:exec', payload: { commands: [spacedCommand], cwd } }, deps);
|
||||
|
||||
expect(execCalls).toHaveLength(1);
|
||||
expect(cached?.data?.results?.[0]).toMatchObject({
|
||||
command: spacedCommand,
|
||||
success: true,
|
||||
stdout: '/repo/.git\n/repo/.git',
|
||||
});
|
||||
});
|
||||
|
||||
it('does not cache arbitrary exec commands', async () => {
|
||||
const command = 'git status --porcelain';
|
||||
const cwd = '/repo';
|
||||
|
||||
await handleFsBridgeMessage({ id: '1', type: 'api:fs:exec', payload: { commands: [command], cwd } }, deps);
|
||||
await handleFsBridgeMessage({ id: '2', type: 'api:fs:exec', payload: { commands: [command], cwd } }, deps);
|
||||
|
||||
expect(execCalls).toHaveLength(2);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user