Skip to content

Commit 0cb76d9

Browse files
MuriloFPdaniel-lxs
andauthored
fix: add Git installation check for checkpoints feature (RooCodeInc#3109) (RooCodeInc#5920)
Co-authored-by: Daniel Riccio <[email protected]>
1 parent 8dcc078 commit 0cb76d9

File tree

21 files changed

+159
-23
lines changed

21 files changed

+159
-23
lines changed

src/core/checkpoints/index.ts

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import { TelemetryService } from "@roo-code/telemetry"
66
import { Task } from "../task/Task"
77

88
import { getWorkspacePath } from "../../utils/path"
9+
import { checkGitInstalled } from "../../utils/git"
10+
import { t } from "../../i18n"
911

1012
import { ClineApiReqInfo } from "../../shared/ExtensionMessage"
1113
import { getApiMetrics } from "../../shared/getApiMetrics"
@@ -70,6 +72,47 @@ export function getCheckpointService(cline: Task) {
7072

7173
cline.checkpointServiceInitializing = true
7274

75+
// Check if Git is installed before initializing the service
76+
// Note: This is intentionally fire-and-forget to match the original IIFE pattern
77+
// The service is returned immediately while Git check happens asynchronously
78+
checkGitInstallation(cline, service, log, provider)
79+
80+
return service
81+
} catch (err) {
82+
log(`[Task#getCheckpointService] ${err.message}`)
83+
cline.enableCheckpoints = false
84+
return undefined
85+
}
86+
}
87+
88+
async function checkGitInstallation(
89+
cline: Task,
90+
service: RepoPerTaskCheckpointService,
91+
log: (message: string) => void,
92+
provider: any,
93+
) {
94+
try {
95+
const gitInstalled = await checkGitInstalled()
96+
97+
if (!gitInstalled) {
98+
log("[Task#getCheckpointService] Git is not installed, disabling checkpoints")
99+
cline.enableCheckpoints = false
100+
cline.checkpointServiceInitializing = false
101+
102+
// Show user-friendly notification
103+
const selection = await vscode.window.showWarningMessage(
104+
t("common:errors.git_not_installed"),
105+
t("common:buttons.learn_more"),
106+
)
107+
108+
if (selection === t("common:buttons.learn_more")) {
109+
await vscode.env.openExternal(vscode.Uri.parse("https://git-scm.com/downloads"))
110+
}
111+
112+
return
113+
}
114+
115+
// Git is installed, proceed with initialization
73116
service.on("initialize", () => {
74117
log("[Task#getCheckpointService] service initialized")
75118

@@ -115,12 +158,11 @@ export function getCheckpointService(cline: Task) {
115158
log(`[Task#getCheckpointService] initShadowGit -> ${err.message}`)
116159
cline.enableCheckpoints = false
117160
})
118-
119-
return service
120161
} catch (err) {
121-
log(`[Task#getCheckpointService] ${err.message}`)
162+
log(`[Task#getCheckpointService] Unexpected error during Git check: ${err.message}`)
163+
console.error("Git check error:", err)
122164
cline.enableCheckpoints = false
123-
return undefined
165+
cline.checkpointServiceInitializing = false
124166
}
125167
}
126168

src/i18n/locales/ca/common.json

Lines changed: 3 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/i18n/locales/de/common.json

Lines changed: 3 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/i18n/locales/en/common.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
"could_not_open_file_generic": "Could not open file!",
2929
"checkpoint_timeout": "Timed out when attempting to restore checkpoint.",
3030
"checkpoint_failed": "Failed to restore checkpoint.",
31+
"git_not_installed": "Git is required for the checkpoints feature. Please install Git to enable checkpoints.",
3132
"no_workspace": "Please open a project folder first",
3233
"update_support_prompt": "Failed to update support prompt",
3334
"reset_support_prompt": "Failed to reset support prompt",
@@ -107,7 +108,8 @@
107108
},
108109
"buttons": {
109110
"save": "Save",
110-
"edit": "Edit"
111+
"edit": "Edit",
112+
"learn_more": "Learn More"
111113
},
112114
"tasks": {
113115
"canceled": "Task error: It was stopped and canceled by the user.",

src/i18n/locales/es/common.json

Lines changed: 3 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/i18n/locales/fr/common.json

Lines changed: 3 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/i18n/locales/hi/common.json

Lines changed: 3 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/i18n/locales/id/common.json

Lines changed: 3 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/i18n/locales/it/common.json

Lines changed: 3 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/i18n/locales/ja/common.json

Lines changed: 3 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)