Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions cli/util/file_watcher.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ use deno_core::futures::FutureExt;
use deno_core::parking_lot::Mutex;
use deno_lib::util::result::js_error_downcast_ref;
use deno_runtime::fmt_errors::format_js_error;
use deno_signals;
use log::info;
use notify::Error as NotifyError;
use notify::RecommendedWatcher;
Expand Down Expand Up @@ -374,6 +375,9 @@ where

select! {
_ = receiver_future => {},
_ = deno_signals::ctrl_c() => {
return Ok(());
},
_ = restart_rx.recv() => {
print_after_restart();
continue;
Expand Down Expand Up @@ -407,6 +411,9 @@ where
// watched paths has changed.
select! {
_ = receiver_future => {},
_ = deno_signals::ctrl_c() => {
return Ok(());
},
_ = restart_rx.recv() => {
print_after_restart();
continue;
Expand Down
69 changes: 68 additions & 1 deletion tests/unit/process_test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -583,7 +583,7 @@ Deno.test(
permissions: { run: true, read: true, write: true },
ignore: Deno.build.os === "windows",
},
async function non_existent_cwd(): Promise<void> {
async function nonExistentCwd(): Promise<void> {
// @ts-ignore `Deno.run()` was soft-removed in Deno 2.
const p = Deno.run({
cmd: [
Expand All @@ -610,3 +610,70 @@ Deno.test(
assertStringIncludes(stderr, "failed resolving cwd:");
},
);

Deno.test(
{
permissions: { run: true, read: true, write: true },
ignore: Deno.build.os === "windows",
},
async function runWatchAndSigint(): Promise<void> {
const tempDir = await Deno.makeTempDir();
const tempFile = `${tempDir}/temp_watch_file.ts`;
await Deno.writeTextFile(tempFile, "console.log('watch test');");

// @ts-ignore `Deno.run()` was soft-removed in Deno 2.
const p = Deno.run({
cmd: ["deno", "run", "--watch", tempFile],
stdout: "piped",
stderr: "null",
});

Deno.kill(p.pid, "SIGINT");
const data = new Uint8Array(10);
const out = await p.stdout.read(data);
assertEquals(out, null);
p.stdout.close();
p.close();

await Deno.remove(tempFile);
await Deno.remove(tempDir);
},
);

Deno.test(
{
permissions: { run: true, read: true, write: true },
ignore: Deno.build.os === "windows",
},
async function runWatchWaitForSigint(): Promise<void> {
const tempDir = await Deno.makeTempDir();
const tempFile = `${tempDir}/temp_watch_file.ts`;
await Deno.writeTextFile(
tempFile,
`Deno.addSignalListener("SIGINT", () => {
console.log("SIGINT");
ac.abort();
});

Deno.serve({ signal: ac.signal }, () => new Response("Hello World"));
`,
);

// @ts-ignore `Deno.run()` was soft-removed in Deno 2.
const p = Deno.run({
cmd: ["deno", "run", "--watch", tempFile],
stdout: "piped",
stderr: "null",
});

Deno.kill(p.pid, "SIGINT");
const data = new Uint8Array(10);
const out = await p.stdout.read(data);
assertEquals(out, null);
p.stdout.close();
p.close();

await Deno.remove(tempFile);
await Deno.remove(tempDir);
},
);
Loading