diff --git a/apps/open-swe/src/utils/git.ts b/apps/open-swe/src/utils/git.ts index 9311153a..7e72070d 100644 --- a/apps/open-swe/src/utils/git.ts +++ b/apps/open-swe/src/utils/git.ts @@ -596,8 +596,54 @@ export async function cloneRepo( // Don't log the full command with token for security reasons repoPath: `${targetRepository.owner}/${targetRepository.repo}`, branch: branchName, + baseCommit: targetRepository.baseCommit, }); - return await sandbox.process.executeCommand(gitCloneCommand.join(" ")); + + const cloneResult = await sandbox.process.executeCommand( + gitCloneCommand.join(" "), + ); + + if (!targetRepository.baseCommit) { + if (cloneResult.exitCode !== 0) { + logger.error("Failed to clone repository", { + targetRepository, + cloneResult, + }); + throw new Error("Failed to clone repository"); + } + return cloneResult; + } + + // If a baseCommit is specified, checkout that commit after cloning + const absoluteRepoDir = getRepoAbsolutePath(targetRepository); + + logger.info("Checking out base commit", { + baseCommit: targetRepository.baseCommit, + repoPath: `${targetRepository.owner}/${targetRepository.repo}`, + }); + + const checkoutResult = await sandbox.process.executeCommand( + `git checkout ${targetRepository.baseCommit}`, + absoluteRepoDir, + undefined, + TIMEOUT_SEC, + ); + + if (checkoutResult.exitCode !== 0) { + logger.error("Failed to checkout base commit", { + baseCommit: targetRepository.baseCommit, + checkoutResult, + }); + throw new Error( + `Failed to checkout base commit ${targetRepository.baseCommit}: ${checkoutResult.result}`, + ); + } + + logger.info("Successfully checked out base commit", { + baseCommit: targetRepository.baseCommit, + }); + + return cloneResult; } catch (e) { const errorFields = getSandboxErrorFields(e); logger.error("Failed to clone repository", errorFields ?? e); diff --git a/packages/shared/src/open-swe/types.ts b/packages/shared/src/open-swe/types.ts index b3740a91..0eb5f815 100644 --- a/packages/shared/src/open-swe/types.ts +++ b/packages/shared/src/open-swe/types.ts @@ -111,6 +111,7 @@ export type TargetRepository = { owner: string; repo: string; branch?: string; + baseCommit?: string; }; export const GraphAnnotation = MessagesZodState.extend({