aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar zhiyuan <32867472+zhiyuang@users.noreply.github.com> 2022-10-23 00:41:56 +0800
committerGravatar GitHub <noreply@github.com> 2022-10-22 09:41:56 -0700
commit55c42f166332b143649b5770ae9f9c48104c1ea0 (patch)
tree02d326f96f9bf1e46146bd85ee7edaf75ca30d73
parent85808700c8a89f82cfce55330a2c8c592a5623d2 (diff)
downloadbun-55c42f166332b143649b5770ae9f9c48104c1ea0.tar.gz
bun-55c42f166332b143649b5770ae9f9c48104c1ea0.tar.zst
bun-55c42f166332b143649b5770ae9f9c48104c1ea0.zip
Fix spawn exitcode (#1371)
-rw-r--r--src/bun.js/api/bun/subprocess.zig9
-rw-r--r--test/bun.js/spawn.test.ts22
2 files changed, 30 insertions, 1 deletions
diff --git a/src/bun.js/api/bun/subprocess.zig b/src/bun.js/api/bun/subprocess.zig
index 638c8ffef..467a3a842 100644
--- a/src/bun.js/api/bun/subprocess.zig
+++ b/src/bun.js/api/bun/subprocess.zig
@@ -1177,7 +1177,7 @@ pub const Subprocess = struct {
subprocess.finalize();
const sync_value = JSC.JSValue.createEmptyObject(globalThis, 4);
- sync_value.put(globalThis, JSC.ZigString.static("exitCode"), JSValue.jsNumber(@intCast(i32, exitCode) * -1));
+ sync_value.put(globalThis, JSC.ZigString.static("exitCode"), JSValue.jsNumber(@intCast(i32, exitCode)));
sync_value.put(globalThis, JSC.ZigString.static("stdout"), stdout);
sync_value.put(globalThis, JSC.ZigString.static("stderr"), stderr);
sync_value.put(globalThis, JSC.ZigString.static("success"), JSValue.jsBoolean(exitCode == 0));
@@ -1203,6 +1203,13 @@ pub const Subprocess = struct {
},
.result => |status| {
this.exit_code = @truncate(u8, status.status);
+ // Do WEXITSTATUS macro check: https://linux.die.net/man/3/waitpid
+ // https://code.woboq.org/gtk/include/bits/waitstatus.h.html
+ const w_if_exited = (status.status & 0x7f) == 0;
+ if (w_if_exited) {
+ const w_exit_status = (status.status & 0xff00) >> 8;
+ this.exit_code = @truncate(u8, w_exit_status);
+ }
},
}
diff --git a/test/bun.js/spawn.test.ts b/test/bun.js/spawn.test.ts
index 9e4144024..1b62542cf 100644
--- a/test/bun.js/spawn.test.ts
+++ b/test/bun.js/spawn.test.ts
@@ -28,6 +28,17 @@ for (let [gcTick, label] of [
expect(stdout.toString()).toBe(hugeString);
expect(stderr.byteLength).toBe(0);
});
+
+ it("check exit code", async () => {
+ const { exitCode: exitCode1 } = spawnSync({
+ cmd: ["ls"]
+ });
+ const { exitCode: exitCode2 } = spawnSync({
+ cmd: ["false"]
+ });
+ expect(exitCode1).toBe(0);
+ expect(exitCode2).toBe(1);
+ });
});
describe("spawn", () => {
@@ -70,6 +81,17 @@ for (let [gcTick, label] of [
expect(await Bun.file("/tmp/out.123.txt").text()).toBe(hugeString);
});
+ it("check exit code", async () => {
+ const exitCode1 = await spawn({
+ cmd: ["ls"],
+ }).exited;
+ const exitCode2 = await spawn({
+ cmd: ["false"]
+ }).exited;
+ expect(exitCode1).toBe(0);
+ expect(exitCode2).toBe(1);
+ });
+
it("Blob works as stdin", async () => {
rmSync("/tmp/out.123.txt", { force: true });
gcTick();