From 41cdd8debe1d8584d5b5dee3f65f9bf4474d6e26 Mon Sep 17 00:00:00 2001 From: "open-swe-dev[bot]" <214404619+open-swe-dev[bot]@users.noreply.github.com> Date: Tue, 10 Jun 2025 12:58:19 -0700 Subject: [PATCH] feat: add baseCommit support for repository initialization (#101) * Apply patch * Apply patch * format * small logic changes --------- Co-authored-by: Brace Sproul <46789226+bracesproul@users.noreply.github.com> Co-authored-by: bracesproul --- apps/open-swe/src/utils/git.ts | 48 ++++++++++++++++++++++++++- packages/shared/src/open-swe/types.ts | 1 + 2 files changed, 48 insertions(+), 1 deletion(-) 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({