mirror of
https://github.com/denoland/deno.git
synced 2024-11-28 16:20:57 -05:00
feat(watcher): clear screen on each restart (#12613)
This commit adds automatic clearing of terminal screen after restarting execution on file change.
This commit is contained in:
parent
11a2a3593d
commit
13d7d57227
2 changed files with 45 additions and 5 deletions
|
@ -21,6 +21,7 @@ use tokio::select;
|
||||||
use tokio::sync::mpsc;
|
use tokio::sync::mpsc;
|
||||||
use tokio::time::sleep;
|
use tokio::time::sleep;
|
||||||
|
|
||||||
|
const CLEAR_SCREEN: &str = "\x1B[2J\x1B[1;1H";
|
||||||
const DEBOUNCE_INTERVAL: Duration = Duration::from_millis(200);
|
const DEBOUNCE_INTERVAL: Duration = Duration::from_millis(200);
|
||||||
|
|
||||||
struct DebouncedReceiver {
|
struct DebouncedReceiver {
|
||||||
|
@ -90,6 +91,8 @@ where
|
||||||
paths_to_watch,
|
paths_to_watch,
|
||||||
result,
|
result,
|
||||||
} => {
|
} => {
|
||||||
|
// Clear screen first
|
||||||
|
eprint!("{}", CLEAR_SCREEN);
|
||||||
info!(
|
info!(
|
||||||
"{} File change detected! Restarting!",
|
"{} File change detected! Restarting!",
|
||||||
colors::intense_blue("Watcher"),
|
colors::intense_blue("Watcher"),
|
||||||
|
@ -156,6 +159,10 @@ where
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Clear screen first
|
||||||
|
eprint!("{}", CLEAR_SCREEN);
|
||||||
|
info!("{} {} started.", colors::intense_blue("Watcher"), job_name,);
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
let watcher = new_watcher(&paths_to_watch, sender.clone())?;
|
let watcher = new_watcher(&paths_to_watch, sender.clone())?;
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,8 @@ use std::io::BufRead;
|
||||||
use tempfile::TempDir;
|
use tempfile::TempDir;
|
||||||
use test_util as util;
|
use test_util as util;
|
||||||
|
|
||||||
|
const CLEAR_SCREEN: &str = r#"[2J"#;
|
||||||
|
|
||||||
macro_rules! assert_contains {
|
macro_rules! assert_contains {
|
||||||
($string:expr, $($test:expr),+) => {
|
($string:expr, $($test:expr),+) => {
|
||||||
let string = $string; // This might be a function call or something
|
let string = $string; // This might be a function call or something
|
||||||
|
@ -115,7 +117,9 @@ fn lint_watch_test() {
|
||||||
.spawn()
|
.spawn()
|
||||||
.expect("Failed to spawn script");
|
.expect("Failed to spawn script");
|
||||||
let (_stdout_lines, mut stderr_lines) = child_lines(&mut child);
|
let (_stdout_lines, mut stderr_lines) = child_lines(&mut child);
|
||||||
|
let next_line = stderr_lines.next().unwrap();
|
||||||
|
assert_contains!(&next_line, CLEAR_SCREEN);
|
||||||
|
assert_contains!(&next_line, "Lint started");
|
||||||
let mut output = read_all_lints(&mut stderr_lines);
|
let mut output = read_all_lints(&mut stderr_lines);
|
||||||
let expected = std::fs::read_to_string(badly_linted_output).unwrap();
|
let expected = std::fs::read_to_string(badly_linted_output).unwrap();
|
||||||
assert_eq!(output, expected);
|
assert_eq!(output, expected);
|
||||||
|
@ -175,6 +179,9 @@ fn lint_watch_without_args_test() {
|
||||||
.expect("Failed to spawn script");
|
.expect("Failed to spawn script");
|
||||||
let (_stdout_lines, mut stderr_lines) = child_lines(&mut child);
|
let (_stdout_lines, mut stderr_lines) = child_lines(&mut child);
|
||||||
|
|
||||||
|
let next_line = stderr_lines.next().unwrap();
|
||||||
|
assert_contains!(&next_line, CLEAR_SCREEN);
|
||||||
|
assert_contains!(&next_line, "Lint started");
|
||||||
let mut output = read_all_lints(&mut stderr_lines);
|
let mut output = read_all_lints(&mut stderr_lines);
|
||||||
let expected = std::fs::read_to_string(badly_linted_output).unwrap();
|
let expected = std::fs::read_to_string(badly_linted_output).unwrap();
|
||||||
assert_eq!(output, expected);
|
assert_eq!(output, expected);
|
||||||
|
@ -266,6 +273,9 @@ fn fmt_watch_test() {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let (_stdout_lines, mut stderr_lines) = child_lines(&mut child);
|
let (_stdout_lines, mut stderr_lines) = child_lines(&mut child);
|
||||||
|
|
||||||
|
let next_line = stderr_lines.next().unwrap();
|
||||||
|
assert_contains!(&next_line, CLEAR_SCREEN);
|
||||||
|
assert_contains!(&next_line, "Fmt started");
|
||||||
assert_contains!(
|
assert_contains!(
|
||||||
skip_restarting_line(&mut stderr_lines),
|
skip_restarting_line(&mut stderr_lines),
|
||||||
"badly_formatted.js"
|
"badly_formatted.js"
|
||||||
|
@ -312,6 +322,9 @@ fn fmt_watch_without_args_test() {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let (_stdout_lines, mut stderr_lines) = child_lines(&mut child);
|
let (_stdout_lines, mut stderr_lines) = child_lines(&mut child);
|
||||||
|
|
||||||
|
let next_line = stderr_lines.next().unwrap();
|
||||||
|
assert_contains!(&next_line, CLEAR_SCREEN);
|
||||||
|
assert_contains!(&next_line, "Fmt started");
|
||||||
assert_contains!(
|
assert_contains!(
|
||||||
skip_restarting_line(&mut stderr_lines),
|
skip_restarting_line(&mut stderr_lines),
|
||||||
"badly_formatted.js"
|
"badly_formatted.js"
|
||||||
|
@ -402,6 +415,9 @@ fn bundle_js_watch() {
|
||||||
let (_stdout_lines, mut stderr_lines) = child_lines(&mut deno);
|
let (_stdout_lines, mut stderr_lines) = child_lines(&mut deno);
|
||||||
|
|
||||||
assert_contains!(stderr_lines.next().unwrap(), "Check");
|
assert_contains!(stderr_lines.next().unwrap(), "Check");
|
||||||
|
let next_line = stderr_lines.next().unwrap();
|
||||||
|
assert_contains!(&next_line, CLEAR_SCREEN);
|
||||||
|
assert_contains!(&next_line, "Bundle started");
|
||||||
assert_contains!(stderr_lines.next().unwrap(), "file_to_watch.js");
|
assert_contains!(stderr_lines.next().unwrap(), "file_to_watch.js");
|
||||||
assert_contains!(stderr_lines.next().unwrap(), "mod6.bundle.js");
|
assert_contains!(stderr_lines.next().unwrap(), "mod6.bundle.js");
|
||||||
let file = PathBuf::from(&bundle);
|
let file = PathBuf::from(&bundle);
|
||||||
|
@ -411,7 +427,9 @@ fn bundle_js_watch() {
|
||||||
write(&file_to_watch, "console.log('Hello world2');").unwrap();
|
write(&file_to_watch, "console.log('Hello world2');").unwrap();
|
||||||
|
|
||||||
assert_contains!(stderr_lines.next().unwrap(), "Check");
|
assert_contains!(stderr_lines.next().unwrap(), "Check");
|
||||||
assert_contains!(stderr_lines.next().unwrap(), "File change detected!");
|
let next_line = stderr_lines.next().unwrap();
|
||||||
|
assert_contains!(&next_line, CLEAR_SCREEN);
|
||||||
|
assert_contains!(&next_line, "File change detected!");
|
||||||
assert_contains!(stderr_lines.next().unwrap(), "file_to_watch.js");
|
assert_contains!(stderr_lines.next().unwrap(), "file_to_watch.js");
|
||||||
assert_contains!(stderr_lines.next().unwrap(), "mod6.bundle.js");
|
assert_contains!(stderr_lines.next().unwrap(), "mod6.bundle.js");
|
||||||
let file = PathBuf::from(&bundle);
|
let file = PathBuf::from(&bundle);
|
||||||
|
@ -449,6 +467,9 @@ fn bundle_watch_not_exit() {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let (_stdout_lines, mut stderr_lines) = child_lines(&mut deno);
|
let (_stdout_lines, mut stderr_lines) = child_lines(&mut deno);
|
||||||
|
|
||||||
|
let next_line = stderr_lines.next().unwrap();
|
||||||
|
assert_contains!(&next_line, CLEAR_SCREEN);
|
||||||
|
assert_contains!(&next_line, "Bundle started");
|
||||||
assert_contains!(stderr_lines.next().unwrap(), "error:");
|
assert_contains!(stderr_lines.next().unwrap(), "error:");
|
||||||
assert_contains!(stderr_lines.next().unwrap(), "Bundle failed");
|
assert_contains!(stderr_lines.next().unwrap(), "Bundle failed");
|
||||||
// the target file hasn't been created yet
|
// the target file hasn't been created yet
|
||||||
|
@ -458,7 +479,9 @@ fn bundle_watch_not_exit() {
|
||||||
write(&file_to_watch, "console.log(42);").unwrap();
|
write(&file_to_watch, "console.log(42);").unwrap();
|
||||||
|
|
||||||
assert_contains!(stderr_lines.next().unwrap(), "Check");
|
assert_contains!(stderr_lines.next().unwrap(), "Check");
|
||||||
assert_contains!(stderr_lines.next().unwrap(), "File change detected!");
|
let next_line = stderr_lines.next().unwrap();
|
||||||
|
assert_contains!(&next_line, CLEAR_SCREEN);
|
||||||
|
assert_contains!(&next_line, "File change detected!");
|
||||||
assert_contains!(stderr_lines.next().unwrap(), "file_to_watch.js");
|
assert_contains!(stderr_lines.next().unwrap(), "file_to_watch.js");
|
||||||
assert_contains!(stderr_lines.next().unwrap(), "target.js");
|
assert_contains!(stderr_lines.next().unwrap(), "target.js");
|
||||||
|
|
||||||
|
@ -603,6 +626,9 @@ fn run_watch_load_unload_events() {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
// Wait for the restart
|
// Wait for the restart
|
||||||
|
let next_line = stderr_lines.next().unwrap();
|
||||||
|
assert_contains!(&next_line, CLEAR_SCREEN);
|
||||||
|
assert_contains!(&next_line, "Process started");
|
||||||
assert_contains!(stderr_lines.next().unwrap(), "Restarting");
|
assert_contains!(stderr_lines.next().unwrap(), "Restarting");
|
||||||
|
|
||||||
// Confirm that the unload event was dispatched from the first run
|
// Confirm that the unload event was dispatched from the first run
|
||||||
|
@ -636,13 +662,18 @@ fn run_watch_not_exit() {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let (mut stdout_lines, mut stderr_lines) = child_lines(&mut child);
|
let (mut stdout_lines, mut stderr_lines) = child_lines(&mut child);
|
||||||
|
|
||||||
|
let next_line = stderr_lines.next().unwrap();
|
||||||
|
assert_contains!(&next_line, CLEAR_SCREEN);
|
||||||
|
assert_contains!(&next_line, "Process started");
|
||||||
assert_contains!(stderr_lines.next().unwrap(), "error:");
|
assert_contains!(stderr_lines.next().unwrap(), "error:");
|
||||||
assert_contains!(stderr_lines.next().unwrap(), "Process failed");
|
assert_contains!(stderr_lines.next().unwrap(), "Process failed");
|
||||||
|
|
||||||
// Make sure the watcher actually restarts and works fine with the proper syntax
|
// Make sure the watcher actually restarts and works fine with the proper syntax
|
||||||
write(&file_to_watch, "console.log(42);").unwrap();
|
write(&file_to_watch, "console.log(42);").unwrap();
|
||||||
|
|
||||||
assert_contains!(stderr_lines.next().unwrap(), "Restarting");
|
let next_line = stderr_lines.next().unwrap();
|
||||||
|
assert_contains!(&next_line, CLEAR_SCREEN);
|
||||||
|
assert_contains!(&next_line, "Restarting");
|
||||||
assert_contains!(stdout_lines.next().unwrap(), "42");
|
assert_contains!(stdout_lines.next().unwrap(), "42");
|
||||||
wait_for("Process finished", &mut stderr_lines);
|
wait_for("Process finished", &mut stderr_lines);
|
||||||
check_alive_then_kill(child);
|
check_alive_then_kill(child);
|
||||||
|
@ -690,7 +721,9 @@ fn run_watch_with_import_map_and_relative_paths() {
|
||||||
.spawn()
|
.spawn()
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let (mut stdout_lines, mut stderr_lines) = child_lines(&mut child);
|
let (mut stdout_lines, mut stderr_lines) = child_lines(&mut child);
|
||||||
|
let next_line = stderr_lines.next().unwrap();
|
||||||
|
assert_contains!(&next_line, CLEAR_SCREEN);
|
||||||
|
assert_contains!(&next_line, "Process started");
|
||||||
assert_contains!(stderr_lines.next().unwrap(), "Process finished");
|
assert_contains!(stderr_lines.next().unwrap(), "Process finished");
|
||||||
assert_contains!(stdout_lines.next().unwrap(), "Hello world");
|
assert_contains!(stdout_lines.next().unwrap(), "Hello world");
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue