Bladeren bron

fix(opencode): fallback to sh for curl upgrade (#30499)

Co-authored-by: Shoubhit Dash <shoubhit2005@gmail.com>
Ulises Jeremias 3 maanden geleden
bovenliggende
commit
01cc475923

+ 8 - 1
packages/opencode/src/installation/index.ts

@@ -149,13 +149,20 @@ export const layer: Layer.Layer<Service, never, HttpClient.HttpClient | AppProce
       return `Upgrade failed for ${method}.`
     }
 
+    const upgradeScriptShell = Effect.fnUntraced(function* () {
+      const bashVersion = yield* text(["bash", "--version"])
+      if (bashVersion) return "bash"
+      return "sh"
+    })
+
     const upgradeCurl = Effect.fnUntraced(
       function* (target: string) {
         const response = yield* httpOk.execute(HttpClientRequest.get("https://opencode.ai/install"))
         const body = yield* response.text
         const bodyBytes = new TextEncoder().encode(body)
+        const shell = yield* upgradeScriptShell()
         const result = yield* appProcess.run(
-          ChildProcess.make("bash", [], {
+          ChildProcess.make(shell, [], {
             stdin: Stream.make(bodyBytes),
             env: { VERSION: target },
             extendEnv: true,

+ 19 - 2
packages/opencode/test/installation/installation.test.ts

@@ -194,8 +194,9 @@ describe("installation", () => {
     testEffect(
       testLayer(
         () => new Response("install script with token=secret", { status: 200 }),
-        (cmd) => {
-          if (cmd === "bash") return { code: 1, stderr: "script output with token=secret" }
+        (cmd, args) => {
+          if (cmd === "bash" && args[0] === "--version") return "GNU bash"
+          if (cmd === "bash" || cmd === "sh") return { code: 1, stderr: "script output with token=secret" }
           return ""
         },
       ),
@@ -209,5 +210,21 @@ describe("installation", () => {
         expect(error.stderr).not.toContain("script output")
       }),
     )
+
+    testEffect(
+      testLayer(
+        () => new Response("install script", { status: 200 }),
+        (cmd, args) => {
+          if (cmd === "bash" && args[0] === "--version") return { code: 1, stderr: "missing" }
+          if (cmd === "bash") return { code: 1, stderr: "should not execute installer with bash" }
+          if (cmd === "sh") return "ok"
+          return ""
+        },
+      ),
+    ).effect("falls back to sh when bash is unavailable during curl upgrade", () =>
+      Effect.gen(function* () {
+        yield* Installation.use.upgrade("curl", "9.9.9")
+      }),
+    )
   })
 })