fix(checkpointing): improve error handling and messaging for Git issues (#6801)

This commit is contained in:
Arya Gummadi
2025-08-22 08:29:52 -07:00
committed by GitHub
parent 31cd35b8c4
commit e1d5dc545d
2 changed files with 38 additions and 12 deletions

View File

@@ -912,17 +912,31 @@ export const useGeminiStream = (
} }
try { try {
let commitHash = await gitService?.createFileSnapshot( if (!gitService) {
`Snapshot for ${toolCall.request.name}`, onDebugMessage(
); `Checkpointing is enabled but Git service is not available. Failed to create snapshot for ${filePath}. Ensure Git is installed and working properly.`,
);
continue;
}
let commitHash: string | undefined;
try {
commitHash = await gitService.createFileSnapshot(
`Snapshot for ${toolCall.request.name}`,
);
} catch (error) {
onDebugMessage(
`Failed to create new snapshot: ${getErrorMessage(error)}. Attempting to use current commit.`,
);
}
if (!commitHash) { if (!commitHash) {
commitHash = await gitService?.getCurrentCommitHash(); commitHash = await gitService.getCurrentCommitHash();
} }
if (!commitHash) { if (!commitHash) {
onDebugMessage( onDebugMessage(
`Failed to create snapshot for ${filePath}. Skipping restorable tool call.`, `Failed to create snapshot for ${filePath}. Checkpointing may not be working properly. Ensure Git is installed and the project directory is accessible.`,
); );
continue; continue;
} }
@@ -959,9 +973,9 @@ export const useGeminiStream = (
); );
} catch (error) { } catch (error) {
onDebugMessage( onDebugMessage(
`Failed to write restorable tool call file: ${getErrorMessage( `Failed to create checkpoint for ${filePath}: ${getErrorMessage(
error, error,
)}`, )}. This may indicate a problem with Git or file system permissions.`,
); );
} }
} }

View File

@@ -31,7 +31,13 @@ export class GitService {
'Checkpointing is enabled, but Git is not installed. Please install Git or disable checkpointing to continue.', 'Checkpointing is enabled, but Git is not installed. Please install Git or disable checkpointing to continue.',
); );
} }
this.setupShadowGitRepository(); try {
await this.setupShadowGitRepository();
} catch (error) {
throw new Error(
`Failed to initialize checkpointing: ${error instanceof Error ? error.message : 'Unknown error'}. Please check that Git is working properly or disable checkpointing.`,
);
}
} }
verifyGitAvailability(): Promise<boolean> { verifyGitAvailability(): Promise<boolean> {
@@ -105,10 +111,16 @@ export class GitService {
} }
async createFileSnapshot(message: string): Promise<string> { async createFileSnapshot(message: string): Promise<string> {
const repo = this.shadowGitRepository; try {
await repo.add('.'); const repo = this.shadowGitRepository;
const commitResult = await repo.commit(message); await repo.add('.');
return commitResult.commit; const commitResult = await repo.commit(message);
return commitResult.commit;
} catch (error) {
throw new Error(
`Failed to create checkpoint snapshot: ${error instanceof Error ? error.message : 'Unknown error'}. Checkpointing may not be working properly.`,
);
}
} }
async restoreProjectFromSnapshot(commitHash: string): Promise<void> { async restoreProjectFromSnapshot(commitHash: string): Promise<void> {