nushell/crates/nu-utils/src/utils.rs

424 lines
14 KiB
Rust
Raw Normal View History

add some startup performance metrics (#7851) # Description This PR changes the old performance logging with `Instant` timers. I'm not sure if this is the best way to do it but it does help reveal where time is being spent on startup. This is what it looks like when you launch nushell with `cargo run -- --log-level info`. I'm using the `info` log level exclusively for performance monitoring at this point. ![image](https://user-images.githubusercontent.com/343840/214372903-fdfa9c99-b846-47f3-8faf-bd6ed98df3a9.png) ## After Startup Since you're in the repl, you can continue running commands. Here's the output of `ls`, for instance. ![image](https://user-images.githubusercontent.com/343840/214373035-4d2f6e2d-5c1d-43d3-b997-51d79d496ba3.png) Note that the above screenshots are in debug mode, so they're much slower than release. # User-Facing Changes # Tests + Formatting Don't forget to add tests that cover your changes. Make sure you've run and fixed any issues with these commands: - `cargo fmt --all -- --check` to check standard code formatting (`cargo fmt --all` applies these changes) - `cargo clippy --workspace -- -D warnings -D clippy::unwrap_used -A clippy::needless_collect` to check that you're using the standard code style - `cargo test --workspace` to check that all tests pass # After Submitting If your PR had any user-facing changes, update [the documentation](https://github.com/nushell/nushell.github.io) after the PR is merged, if necessary. This will help us keep the docs up to date.
2023-01-24 21:28:59 +01:00
use log::info;
use lscolors::LsColors;
use std::io::{Result, Write};
pub fn enable_vt_processing() -> Result<()> {
#[cfg(windows)]
{
use crossterm_winapi::{ConsoleMode, Handle};
pub const ENABLE_PROCESSED_OUTPUT: u32 = 0x0001;
pub const ENABLE_VIRTUAL_TERMINAL_PROCESSING: u32 = 0x0004;
let mask = ENABLE_VIRTUAL_TERMINAL_PROCESSING;
let console_mode = ConsoleMode::from(Handle::current_out_handle()?);
let old_mode = console_mode.mode()?;
// researching odd ansi behavior in windows terminal repo revealed that
// enable_processed_output and enable_virtual_terminal_processing should be used
if old_mode & mask == 0 {
console_mode
.set_mode(old_mode | ENABLE_PROCESSED_OUTPUT | ENABLE_VIRTUAL_TERMINAL_PROCESSING)?
}
}
Ok(())
}
pub fn stdout_write_all_and_flush<T>(output: T) -> Result<()>
where
T: AsRef<[u8]>,
{
let stdout = std::io::stdout();
stdout.lock().write_all(output.as_ref())?;
stdout.lock().flush()
}
pub fn stderr_write_all_and_flush<T>(output: T) -> Result<()>
where
T: AsRef<[u8]>,
{
let stderr = std::io::stderr();
let ret = match stderr.lock().write_all(output.as_ref()) {
Ok(_) => Ok(stderr.lock().flush()?),
Err(err) => Err(err),
};
ret
}
pub fn get_default_env() -> &'static str {
include_str!("sample_config/default_env.nu")
}
pub fn get_default_config() -> &'static str {
include_str!("sample_config/default_config.nu")
}
pub fn get_ls_colors(lscolors_env_string: Option<String>) -> LsColors {
if let Some(s) = lscolors_env_string {
LsColors::from_string(&s)
} else {
LsColors::from_string(
&[
"st=0",
"di=0;38;5;81",
"so=0;38;5;16;48;5;203",
"ln=0;38;5;203",
"cd=0;38;5;203;48;5;236",
"ex=1;38;5;203",
"or=0;38;5;16;48;5;203",
"fi=0",
"bd=0;38;5;81;48;5;236",
"ow=0",
"mi=0;38;5;16;48;5;203",
"*~=0;38;5;243",
"no=0",
"tw=0",
"pi=0;38;5;16;48;5;81",
"*.z=4;38;5;203",
"*.t=0;38;5;48",
"*.o=0;38;5;243",
"*.d=0;38;5;48",
"*.a=1;38;5;203",
"*.c=0;38;5;48",
"*.m=0;38;5;48",
"*.p=0;38;5;48",
"*.r=0;38;5;48",
"*.h=0;38;5;48",
"*.ml=0;38;5;48",
"*.ll=0;38;5;48",
"*.gv=0;38;5;48",
"*.cp=0;38;5;48",
"*.xz=4;38;5;203",
"*.hs=0;38;5;48",
"*css=0;38;5;48",
"*.ui=0;38;5;149",
"*.pl=0;38;5;48",
"*.ts=0;38;5;48",
"*.gz=4;38;5;203",
"*.so=1;38;5;203",
"*.cr=0;38;5;48",
"*.fs=0;38;5;48",
"*.bz=4;38;5;203",
"*.ko=1;38;5;203",
"*.as=0;38;5;48",
"*.sh=0;38;5;48",
"*.pp=0;38;5;48",
"*.el=0;38;5;48",
"*.py=0;38;5;48",
"*.lo=0;38;5;243",
"*.bc=0;38;5;243",
"*.cc=0;38;5;48",
"*.pm=0;38;5;48",
"*.rs=0;38;5;48",
"*.di=0;38;5;48",
"*.jl=0;38;5;48",
"*.rb=0;38;5;48",
"*.md=0;38;5;185",
"*.js=0;38;5;48",
"*.go=0;38;5;48",
"*.vb=0;38;5;48",
"*.hi=0;38;5;243",
"*.kt=0;38;5;48",
"*.hh=0;38;5;48",
"*.cs=0;38;5;48",
"*.mn=0;38;5;48",
"*.nb=0;38;5;48",
"*.7z=4;38;5;203",
"*.ex=0;38;5;48",
"*.rm=0;38;5;208",
"*.ps=0;38;5;186",
"*.td=0;38;5;48",
"*.la=0;38;5;243",
"*.aux=0;38;5;243",
"*.xmp=0;38;5;149",
"*.mp4=0;38;5;208",
"*.rpm=4;38;5;203",
"*.m4a=0;38;5;208",
"*.zip=4;38;5;203",
"*.dll=1;38;5;203",
"*.bcf=0;38;5;243",
"*.awk=0;38;5;48",
"*.aif=0;38;5;208",
"*.zst=4;38;5;203",
"*.bak=0;38;5;243",
"*.tgz=4;38;5;203",
"*.com=1;38;5;203",
"*.clj=0;38;5;48",
"*.sxw=0;38;5;186",
"*.vob=0;38;5;208",
"*.fsx=0;38;5;48",
"*.doc=0;38;5;186",
"*.mkv=0;38;5;208",
"*.tbz=4;38;5;203",
"*.ogg=0;38;5;208",
"*.wma=0;38;5;208",
"*.mid=0;38;5;208",
"*.kex=0;38;5;186",
"*.out=0;38;5;243",
"*.ltx=0;38;5;48",
"*.sql=0;38;5;48",
"*.ppt=0;38;5;186",
"*.tex=0;38;5;48",
"*.odp=0;38;5;186",
"*.log=0;38;5;243",
"*.arj=4;38;5;203",
"*.ipp=0;38;5;48",
"*.sbt=0;38;5;48",
"*.jpg=0;38;5;208",
"*.yml=0;38;5;149",
"*.txt=0;38;5;185",
"*.csv=0;38;5;185",
"*.dox=0;38;5;149",
"*.pro=0;38;5;149",
"*.bst=0;38;5;149",
"*TODO=1",
"*.mir=0;38;5;48",
"*.bat=1;38;5;203",
"*.m4v=0;38;5;208",
"*.pod=0;38;5;48",
"*.cfg=0;38;5;149",
"*.pas=0;38;5;48",
"*.tml=0;38;5;149",
"*.bib=0;38;5;149",
"*.ini=0;38;5;149",
"*.apk=4;38;5;203",
"*.h++=0;38;5;48",
"*.pyc=0;38;5;243",
"*.img=4;38;5;203",
"*.rst=0;38;5;185",
"*.swf=0;38;5;208",
"*.htm=0;38;5;185",
"*.ttf=0;38;5;208",
"*.elm=0;38;5;48",
"*hgrc=0;38;5;149",
"*.bmp=0;38;5;208",
"*.fsi=0;38;5;48",
"*.pgm=0;38;5;208",
"*.dpr=0;38;5;48",
"*.xls=0;38;5;186",
"*.tcl=0;38;5;48",
"*.mli=0;38;5;48",
"*.ppm=0;38;5;208",
"*.bbl=0;38;5;243",
"*.lua=0;38;5;48",
"*.asa=0;38;5;48",
"*.pbm=0;38;5;208",
"*.avi=0;38;5;208",
"*.def=0;38;5;48",
"*.mov=0;38;5;208",
"*.hxx=0;38;5;48",
"*.tif=0;38;5;208",
"*.fon=0;38;5;208",
"*.zsh=0;38;5;48",
"*.png=0;38;5;208",
"*.inc=0;38;5;48",
"*.jar=4;38;5;203",
"*.swp=0;38;5;243",
"*.pid=0;38;5;243",
"*.gif=0;38;5;208",
"*.ind=0;38;5;243",
"*.erl=0;38;5;48",
"*.ilg=0;38;5;243",
"*.eps=0;38;5;208",
"*.tsx=0;38;5;48",
"*.git=0;38;5;243",
"*.inl=0;38;5;48",
"*.rtf=0;38;5;186",
"*.hpp=0;38;5;48",
"*.kts=0;38;5;48",
"*.deb=4;38;5;203",
"*.svg=0;38;5;208",
"*.pps=0;38;5;186",
"*.ps1=0;38;5;48",
"*.c++=0;38;5;48",
"*.cpp=0;38;5;48",
"*.bsh=0;38;5;48",
"*.php=0;38;5;48",
"*.exs=0;38;5;48",
"*.toc=0;38;5;243",
"*.mp3=0;38;5;208",
"*.epp=0;38;5;48",
"*.rar=4;38;5;203",
"*.wav=0;38;5;208",
"*.xlr=0;38;5;186",
"*.tmp=0;38;5;243",
"*.cxx=0;38;5;48",
"*.iso=4;38;5;203",
"*.dmg=4;38;5;203",
"*.gvy=0;38;5;48",
"*.bin=4;38;5;203",
"*.wmv=0;38;5;208",
"*.blg=0;38;5;243",
"*.ods=0;38;5;186",
"*.psd=0;38;5;208",
"*.mpg=0;38;5;208",
"*.dot=0;38;5;48",
"*.cgi=0;38;5;48",
"*.xml=0;38;5;185",
"*.htc=0;38;5;48",
"*.ics=0;38;5;186",
"*.bz2=4;38;5;203",
"*.tar=4;38;5;203",
"*.csx=0;38;5;48",
"*.ico=0;38;5;208",
"*.sxi=0;38;5;186",
"*.nix=0;38;5;149",
"*.pkg=4;38;5;203",
"*.bag=4;38;5;203",
"*.fnt=0;38;5;208",
"*.idx=0;38;5;243",
"*.xcf=0;38;5;208",
"*.exe=1;38;5;203",
"*.flv=0;38;5;208",
"*.fls=0;38;5;243",
"*.otf=0;38;5;208",
"*.vcd=4;38;5;203",
"*.vim=0;38;5;48",
"*.sty=0;38;5;243",
"*.pdf=0;38;5;186",
"*.odt=0;38;5;186",
"*.purs=0;38;5;48",
"*.h264=0;38;5;208",
"*.jpeg=0;38;5;208",
"*.dart=0;38;5;48",
"*.pptx=0;38;5;186",
"*.lock=0;38;5;243",
"*.bash=0;38;5;48",
"*.rlib=0;38;5;243",
"*.hgrc=0;38;5;149",
"*.psm1=0;38;5;48",
"*.toml=0;38;5;149",
"*.tbz2=4;38;5;203",
"*.yaml=0;38;5;149",
"*.make=0;38;5;149",
"*.orig=0;38;5;243",
"*.html=0;38;5;185",
"*.fish=0;38;5;48",
"*.diff=0;38;5;48",
"*.xlsx=0;38;5;186",
"*.docx=0;38;5;186",
"*.json=0;38;5;149",
"*.psd1=0;38;5;48",
"*.tiff=0;38;5;208",
"*.flac=0;38;5;208",
"*.java=0;38;5;48",
"*.less=0;38;5;48",
"*.mpeg=0;38;5;208",
"*.conf=0;38;5;149",
"*.lisp=0;38;5;48",
"*.epub=0;38;5;186",
"*.cabal=0;38;5;48",
"*.patch=0;38;5;48",
"*.shtml=0;38;5;185",
"*.class=0;38;5;243",
"*.xhtml=0;38;5;185",
"*.mdown=0;38;5;185",
"*.dyn_o=0;38;5;243",
"*.cache=0;38;5;243",
"*.swift=0;38;5;48",
"*README=0;38;5;16;48;5;186",
"*passwd=0;38;5;149",
"*.ipynb=0;38;5;48",
"*shadow=0;38;5;149",
"*.toast=4;38;5;203",
"*.cmake=0;38;5;149",
"*.scala=0;38;5;48",
"*.dyn_hi=0;38;5;243",
"*.matlab=0;38;5;48",
"*.config=0;38;5;149",
"*.gradle=0;38;5;48",
"*.groovy=0;38;5;48",
"*.ignore=0;38;5;149",
"*LICENSE=0;38;5;249",
"*TODO.md=1",
"*COPYING=0;38;5;249",
"*.flake8=0;38;5;149",
"*INSTALL=0;38;5;16;48;5;186",
"*setup.py=0;38;5;149",
"*.gemspec=0;38;5;149",
"*.desktop=0;38;5;149",
"*Makefile=0;38;5;149",
"*Doxyfile=0;38;5;149",
"*TODO.txt=1",
"*README.md=0;38;5;16;48;5;186",
"*.kdevelop=0;38;5;149",
"*.rgignore=0;38;5;149",
"*configure=0;38;5;149",
"*.DS_Store=0;38;5;243",
"*.fdignore=0;38;5;149",
"*COPYRIGHT=0;38;5;249",
"*.markdown=0;38;5;185",
"*.cmake.in=0;38;5;149",
"*.gitconfig=0;38;5;149",
"*INSTALL.md=0;38;5;16;48;5;186",
"*CODEOWNERS=0;38;5;149",
"*.gitignore=0;38;5;149",
"*Dockerfile=0;38;5;149",
"*SConstruct=0;38;5;149",
"*.scons_opt=0;38;5;243",
"*README.txt=0;38;5;16;48;5;186",
"*SConscript=0;38;5;149",
"*.localized=0;38;5;243",
"*.travis.yml=0;38;5;186",
"*Makefile.in=0;38;5;243",
"*.gitmodules=0;38;5;149",
"*LICENSE-MIT=0;38;5;249",
"*Makefile.am=0;38;5;149",
"*INSTALL.txt=0;38;5;16;48;5;186",
"*MANIFEST.in=0;38;5;149",
"*.synctex.gz=0;38;5;243",
"*.fdb_latexmk=0;38;5;243",
"*CONTRIBUTORS=0;38;5;16;48;5;186",
"*configure.ac=0;38;5;149",
"*.applescript=0;38;5;48",
"*appveyor.yml=0;38;5;186",
"*.clang-format=0;38;5;149",
"*.gitattributes=0;38;5;149",
"*LICENSE-APACHE=0;38;5;249",
"*CMakeCache.txt=0;38;5;243",
"*CMakeLists.txt=0;38;5;149",
"*CONTRIBUTORS.md=0;38;5;16;48;5;186",
"*requirements.txt=0;38;5;149",
"*CONTRIBUTORS.txt=0;38;5;16;48;5;186",
"*.sconsign.dblite=0;38;5;243",
"*package-lock.json=0;38;5;243",
"*.CFUserTextEncoding=0;38;5;243",
"*.fb2=0;38;5;186",
]
.join(":"),
)
}
}
add some startup performance metrics (#7851) # Description This PR changes the old performance logging with `Instant` timers. I'm not sure if this is the best way to do it but it does help reveal where time is being spent on startup. This is what it looks like when you launch nushell with `cargo run -- --log-level info`. I'm using the `info` log level exclusively for performance monitoring at this point. ![image](https://user-images.githubusercontent.com/343840/214372903-fdfa9c99-b846-47f3-8faf-bd6ed98df3a9.png) ## After Startup Since you're in the repl, you can continue running commands. Here's the output of `ls`, for instance. ![image](https://user-images.githubusercontent.com/343840/214373035-4d2f6e2d-5c1d-43d3-b997-51d79d496ba3.png) Note that the above screenshots are in debug mode, so they're much slower than release. # User-Facing Changes # Tests + Formatting Don't forget to add tests that cover your changes. Make sure you've run and fixed any issues with these commands: - `cargo fmt --all -- --check` to check standard code formatting (`cargo fmt --all` applies these changes) - `cargo clippy --workspace -- -D warnings -D clippy::unwrap_used -A clippy::needless_collect` to check that you're using the standard code style - `cargo test --workspace` to check that all tests pass # After Submitting If your PR had any user-facing changes, update [the documentation](https://github.com/nushell/nushell.github.io) after the PR is merged, if necessary. This will help us keep the docs up to date.
2023-01-24 21:28:59 +01:00
// Log some performance metrics (green text with yellow timings)
pub fn perf(
msg: &str,
dur: std::time::Instant,
file: &str,
line: u32,
column: u32,
use_color: bool,
) {
if use_color {
info!(
"perf: {}:{}:{} \x1b[32m{}\x1b[0m took \x1b[33m{:?}\x1b[0m",
file,
line,
column,
msg,
dur.elapsed(),
);
} else {
info!(
"perf: {}:{}:{} {} took {:?}",
file,
line,
column,
msg,
dur.elapsed(),
);
}
add some startup performance metrics (#7851) # Description This PR changes the old performance logging with `Instant` timers. I'm not sure if this is the best way to do it but it does help reveal where time is being spent on startup. This is what it looks like when you launch nushell with `cargo run -- --log-level info`. I'm using the `info` log level exclusively for performance monitoring at this point. ![image](https://user-images.githubusercontent.com/343840/214372903-fdfa9c99-b846-47f3-8faf-bd6ed98df3a9.png) ## After Startup Since you're in the repl, you can continue running commands. Here's the output of `ls`, for instance. ![image](https://user-images.githubusercontent.com/343840/214373035-4d2f6e2d-5c1d-43d3-b997-51d79d496ba3.png) Note that the above screenshots are in debug mode, so they're much slower than release. # User-Facing Changes # Tests + Formatting Don't forget to add tests that cover your changes. Make sure you've run and fixed any issues with these commands: - `cargo fmt --all -- --check` to check standard code formatting (`cargo fmt --all` applies these changes) - `cargo clippy --workspace -- -D warnings -D clippy::unwrap_used -A clippy::needless_collect` to check that you're using the standard code style - `cargo test --workspace` to check that all tests pass # After Submitting If your PR had any user-facing changes, update [the documentation](https://github.com/nushell/nushell.github.io) after the PR is merged, if necessary. This will help us keep the docs up to date.
2023-01-24 21:28:59 +01:00
}