mirror of
https://github.com/denoland/deno.git
synced 2025-02-07 23:06:50 -05:00
fix(task): strip ansi codes and control chars when printing tasks (#27100)
This commit is contained in:
parent
e943c6a25d
commit
93adf37bdf
2 changed files with 91 additions and 3 deletions
|
@ -8,6 +8,7 @@ use std::path::PathBuf;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
use console_static_text::ansi::strip_ansi_codes;
|
||||||
use deno_config::workspace::FolderConfigs;
|
use deno_config::workspace::FolderConfigs;
|
||||||
use deno_config::workspace::TaskDefinition;
|
use deno_config::workspace::TaskDefinition;
|
||||||
use deno_config::workspace::TaskOrScript;
|
use deno_config::workspace::TaskOrScript;
|
||||||
|
@ -722,19 +723,47 @@ fn print_available_tasks(
|
||||||
if let Some(description) = &desc.task.description {
|
if let Some(description) = &desc.task.description {
|
||||||
let slash_slash = colors::italic_gray("//");
|
let slash_slash = colors::italic_gray("//");
|
||||||
for line in description.lines() {
|
for line in description.lines() {
|
||||||
writeln!(writer, " {slash_slash} {}", colors::italic_gray(line))?;
|
writeln!(
|
||||||
|
writer,
|
||||||
|
" {slash_slash} {}",
|
||||||
|
colors::italic_gray(strip_ansi_codes_and_escape_control_chars(line))
|
||||||
|
)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
writeln!(writer, " {}", desc.task.command)?;
|
writeln!(
|
||||||
|
writer,
|
||||||
|
" {}",
|
||||||
|
strip_ansi_codes_and_escape_control_chars(&desc.task.command)
|
||||||
|
)?;
|
||||||
if !desc.task.dependencies.is_empty() {
|
if !desc.task.dependencies.is_empty() {
|
||||||
|
let dependencies = desc
|
||||||
|
.task
|
||||||
|
.dependencies
|
||||||
|
.into_iter()
|
||||||
|
.map(|d| strip_ansi_codes_and_escape_control_chars(&d))
|
||||||
|
.collect::<Vec<_>>()
|
||||||
|
.join(", ");
|
||||||
writeln!(
|
writeln!(
|
||||||
writer,
|
writer,
|
||||||
" {} {}",
|
" {} {}",
|
||||||
colors::gray("depends on:"),
|
colors::gray("depends on:"),
|
||||||
colors::cyan(desc.task.dependencies.join(", "))
|
colors::cyan(dependencies)
|
||||||
)?;
|
)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn strip_ansi_codes_and_escape_control_chars(s: &str) -> String {
|
||||||
|
strip_ansi_codes(s)
|
||||||
|
.chars()
|
||||||
|
.map(|c| match c {
|
||||||
|
'\n' => "\\n".to_string(),
|
||||||
|
'\r' => "\\r".to_string(),
|
||||||
|
'\t' => "\\t".to_string(),
|
||||||
|
c if c.is_control() => format!("\\x{:02x}", c as u8),
|
||||||
|
c => c.to_string(),
|
||||||
|
})
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
|
|
|
@ -3,6 +3,9 @@
|
||||||
// Most of the tests for this are in deno_task_shell.
|
// Most of the tests for this are in deno_task_shell.
|
||||||
// These tests are intended to only test integration.
|
// These tests are intended to only test integration.
|
||||||
|
|
||||||
|
use test_util as util;
|
||||||
|
use util::TestContextBuilder;
|
||||||
|
|
||||||
// use test_util::env_vars_for_npm_tests;
|
// use test_util::env_vars_for_npm_tests;
|
||||||
// use test_util::itest;
|
// use test_util::itest;
|
||||||
// use test_util::TestContext;
|
// use test_util::TestContext;
|
||||||
|
@ -28,3 +31,59 @@
|
||||||
// exit_code: 1,
|
// exit_code: 1,
|
||||||
// http_server: true,
|
// http_server: true,
|
||||||
// });
|
// });
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn deno_task_ansi_escape_codes() {
|
||||||
|
let context = TestContextBuilder::default().use_temp_cwd().build();
|
||||||
|
let temp_dir = context.temp_dir();
|
||||||
|
temp_dir.write("deno.json", r#"{
|
||||||
|
"tasks": {
|
||||||
|
"dev": "echo 'BOOO!!!'",
|
||||||
|
"next": "\u001b[3F\u001b[0G- dev\u001b[1E\u001b[2K echo 'I am your friend.'"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"#);
|
||||||
|
|
||||||
|
context
|
||||||
|
.new_command()
|
||||||
|
.args_vec(["task"])
|
||||||
|
.with_pty(|mut console| {
|
||||||
|
console.expect("Available tasks:");
|
||||||
|
console.expect("- dev");
|
||||||
|
console.expect(" echo 'BOOO!!!'");
|
||||||
|
console.expect("- next");
|
||||||
|
console.expect(" - dev echo 'I am your friend.'");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn deno_task_control_chars() {
|
||||||
|
let context = TestContextBuilder::default().use_temp_cwd().build();
|
||||||
|
let temp_dir = context.temp_dir();
|
||||||
|
temp_dir.write(
|
||||||
|
"deno.json",
|
||||||
|
r#"{
|
||||||
|
"tasks": {
|
||||||
|
"dev": "echo 'BOOO!!!' && \r echo hi there is my command",
|
||||||
|
"serve": {
|
||||||
|
"description": "this is a\tm\rangled description",
|
||||||
|
"command": "echo hello"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"#,
|
||||||
|
);
|
||||||
|
|
||||||
|
context
|
||||||
|
.new_command()
|
||||||
|
.args_vec(["task"])
|
||||||
|
.with_pty(|mut console| {
|
||||||
|
console.expect("Available tasks:");
|
||||||
|
console.expect("- dev");
|
||||||
|
console
|
||||||
|
.expect(" echo 'BOOO!!!' && \\r echo hi there is my command");
|
||||||
|
console.expect("- serve");
|
||||||
|
console.expect(" // this is a\\tm\\rangled description");
|
||||||
|
console.expect(" echo hello");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue