mirror of
https://github.com/nushell/nushell.git
synced 2024-11-25 09:53:43 +01:00
Finish removing profile
command and related data (#10807)
This commit is contained in:
parent
a01ef85bda
commit
a35ecb4837
@ -289,11 +289,9 @@ fn to_html(
|
|||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
return Ok(
|
return Ok(
|
||||||
Value::list(result, head).into_pipeline_data_with_metadata(Box::new(
|
Value::list(result, head).into_pipeline_data_with_metadata(PipelineMetadata {
|
||||||
PipelineMetadata {
|
|
||||||
data_source: DataSource::HtmlThemes,
|
data_source: DataSource::HtmlThemes,
|
||||||
},
|
}),
|
||||||
)),
|
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
let theme_span = match &theme {
|
let theme_span = match &theme {
|
||||||
|
@ -55,36 +55,30 @@ impl Command for Metadata {
|
|||||||
let origin = stack.get_var_with_origin(*var_id, *span)?;
|
let origin = stack.get_var_with_origin(*var_id, *span)?;
|
||||||
|
|
||||||
Ok(
|
Ok(
|
||||||
build_metadata_record(&origin, input.metadata().as_deref(), head)
|
build_metadata_record(&origin, input.metadata().as_ref(), head)
|
||||||
.into_pipeline_data(),
|
.into_pipeline_data(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
let val: Value = call.req(engine_state, stack, 0)?;
|
let val: Value = call.req(engine_state, stack, 0)?;
|
||||||
Ok(
|
Ok(build_metadata_record(&val, input.metadata().as_ref(), head)
|
||||||
build_metadata_record(&val, input.metadata().as_deref(), head)
|
.into_pipeline_data())
|
||||||
.into_pipeline_data(),
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
let val: Value = call.req(engine_state, stack, 0)?;
|
let val: Value = call.req(engine_state, stack, 0)?;
|
||||||
Ok(
|
Ok(build_metadata_record(&val, input.metadata().as_ref(), head)
|
||||||
build_metadata_record(&val, input.metadata().as_deref(), head)
|
.into_pipeline_data())
|
||||||
.into_pipeline_data(),
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Some(_) => {
|
Some(_) => {
|
||||||
let val: Value = call.req(engine_state, stack, 0)?;
|
let val: Value = call.req(engine_state, stack, 0)?;
|
||||||
Ok(
|
Ok(build_metadata_record(&val, input.metadata().as_ref(), head)
|
||||||
build_metadata_record(&val, input.metadata().as_deref(), head)
|
.into_pipeline_data())
|
||||||
.into_pipeline_data(),
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
None => {
|
None => {
|
||||||
let mut record = Record::new();
|
let mut record = Record::new();
|
||||||
if let Some(x) = input.metadata().as_deref() {
|
if let Some(x) = input.metadata().as_ref() {
|
||||||
match x {
|
match x {
|
||||||
PipelineMetadata {
|
PipelineMetadata {
|
||||||
data_source: DataSource::Ls,
|
data_source: DataSource::Ls,
|
||||||
@ -92,9 +86,6 @@ impl Command for Metadata {
|
|||||||
PipelineMetadata {
|
PipelineMetadata {
|
||||||
data_source: DataSource::HtmlThemes,
|
data_source: DataSource::HtmlThemes,
|
||||||
} => record.push("source", Value::string("into html --list", head)),
|
} => record.push("source", Value::string("into html --list", head)),
|
||||||
PipelineMetadata {
|
|
||||||
data_source: DataSource::Profiling(values),
|
|
||||||
} => record.push("profiling", Value::list(values.clone(), head)),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -142,9 +133,6 @@ fn build_metadata_record(arg: &Value, metadata: Option<&PipelineMetadata>, head:
|
|||||||
PipelineMetadata {
|
PipelineMetadata {
|
||||||
data_source: DataSource::HtmlThemes,
|
data_source: DataSource::HtmlThemes,
|
||||||
} => record.push("source", Value::string("into html --list", head)),
|
} => record.push("source", Value::string("into html --list", head)),
|
||||||
PipelineMetadata {
|
|
||||||
data_source: DataSource::Profiling(values),
|
|
||||||
} => record.push("profiling", Value::list(values.clone(), head)),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,7 +5,6 @@ mod info;
|
|||||||
mod inspect;
|
mod inspect;
|
||||||
mod inspect_table;
|
mod inspect_table;
|
||||||
mod metadata;
|
mod metadata;
|
||||||
mod profile;
|
|
||||||
mod timeit;
|
mod timeit;
|
||||||
mod view;
|
mod view;
|
||||||
mod view_files;
|
mod view_files;
|
||||||
@ -19,7 +18,6 @@ pub use info::DebugInfo;
|
|||||||
pub use inspect::Inspect;
|
pub use inspect::Inspect;
|
||||||
pub use inspect_table::build_table;
|
pub use inspect_table::build_table;
|
||||||
pub use metadata::Metadata;
|
pub use metadata::Metadata;
|
||||||
pub use profile::Profile;
|
|
||||||
pub use timeit::TimeIt;
|
pub use timeit::TimeIt;
|
||||||
pub use view::View;
|
pub use view::View;
|
||||||
pub use view_files::ViewFiles;
|
pub use view_files::ViewFiles;
|
||||||
|
@ -1,102 +0,0 @@
|
|||||||
use nu_engine::{eval_block, CallExt};
|
|
||||||
use nu_protocol::ast::Call;
|
|
||||||
use nu_protocol::engine::{Closure, Command, EngineState, Stack};
|
|
||||||
use nu_protocol::{
|
|
||||||
Category, DataSource, Example, IntoPipelineData, PipelineData, PipelineMetadata, Signature,
|
|
||||||
Spanned, SyntaxShape, Type, Value,
|
|
||||||
};
|
|
||||||
|
|
||||||
#[derive(Clone)]
|
|
||||||
pub struct Profile;
|
|
||||||
|
|
||||||
impl Command for Profile {
|
|
||||||
fn name(&self) -> &str {
|
|
||||||
"profile"
|
|
||||||
}
|
|
||||||
|
|
||||||
fn usage(&self) -> &str {
|
|
||||||
"Profile each pipeline element in a closure."
|
|
||||||
}
|
|
||||||
|
|
||||||
fn extra_usage(&self) -> &str {
|
|
||||||
r#"The command collects run time of every pipeline element, recursively stepping into child closures
|
|
||||||
until a maximum depth. Optionally, it also collects the source code and intermediate values.
|
|
||||||
|
|
||||||
Current known limitations are:
|
|
||||||
* profiling data from subexpressions is not tracked
|
|
||||||
* it does not step into loop iterations"#
|
|
||||||
}
|
|
||||||
|
|
||||||
fn signature(&self) -> nu_protocol::Signature {
|
|
||||||
Signature::build("profile")
|
|
||||||
.required(
|
|
||||||
"closure",
|
|
||||||
SyntaxShape::Closure(Some(vec![SyntaxShape::Any])),
|
|
||||||
"the closure to run",
|
|
||||||
)
|
|
||||||
.switch("source", "Collect source code in the report", Some('s'))
|
|
||||||
.switch("values", "Collect values in the report", Some('v'))
|
|
||||||
.named(
|
|
||||||
"max-depth",
|
|
||||||
SyntaxShape::Int,
|
|
||||||
"How many levels of blocks to step into (default: 1)",
|
|
||||||
Some('d'),
|
|
||||||
)
|
|
||||||
.input_output_types(vec![(Type::Any, Type::Table(vec![]))])
|
|
||||||
.allow_variants_without_examples(true)
|
|
||||||
.category(Category::Debug)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn run(
|
|
||||||
&self,
|
|
||||||
engine_state: &EngineState,
|
|
||||||
stack: &mut Stack,
|
|
||||||
call: &Call,
|
|
||||||
input: PipelineData,
|
|
||||||
) -> Result<nu_protocol::PipelineData, nu_protocol::ShellError> {
|
|
||||||
let capture_block: Spanned<Closure> = call.req(engine_state, stack, 0)?;
|
|
||||||
let block = engine_state.get_block(capture_block.item.block_id);
|
|
||||||
|
|
||||||
let redirect_stdout = call.redirect_stdout;
|
|
||||||
let redirect_stderr = call.redirect_stderr;
|
|
||||||
|
|
||||||
let mut stack = stack.captures_to_stack(&capture_block.item.captures);
|
|
||||||
|
|
||||||
let input_val = input.into_value(call.head);
|
|
||||||
|
|
||||||
if let Some(var) = block.signature.get_positional(0) {
|
|
||||||
if let Some(var_id) = &var.var_id {
|
|
||||||
stack.add_var(*var_id, input_val.clone());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let result = if let Some(PipelineMetadata {
|
|
||||||
data_source: DataSource::Profiling(values),
|
|
||||||
}) = eval_block(
|
|
||||||
engine_state,
|
|
||||||
&mut stack,
|
|
||||||
block,
|
|
||||||
input_val.into_pipeline_data(),
|
|
||||||
redirect_stdout,
|
|
||||||
redirect_stderr,
|
|
||||||
)?
|
|
||||||
.metadata()
|
|
||||||
.map(|m| *m)
|
|
||||||
{
|
|
||||||
Value::list(values, call.head)
|
|
||||||
} else {
|
|
||||||
Value::nothing(call.head)
|
|
||||||
};
|
|
||||||
|
|
||||||
Ok(result.into_pipeline_data())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn examples(&self) -> Vec<Example> {
|
|
||||||
vec![Example {
|
|
||||||
description:
|
|
||||||
"Profile some code, stepping into the `spam` command and collecting source.",
|
|
||||||
example: r#"def spam [] { "spam" }; profile {|| spam | str length } --max-depth 2 --source"#,
|
|
||||||
result: None,
|
|
||||||
}]
|
|
||||||
}
|
|
||||||
}
|
|
@ -138,7 +138,6 @@ pub fn add_shell_command_context(mut engine_state: EngineState) -> EngineState {
|
|||||||
Explain,
|
Explain,
|
||||||
Inspect,
|
Inspect,
|
||||||
Metadata,
|
Metadata,
|
||||||
Profile,
|
|
||||||
TimeIt,
|
TimeIt,
|
||||||
View,
|
View,
|
||||||
ViewFiles,
|
ViewFiles,
|
||||||
|
@ -266,9 +266,9 @@ impl Command for Ls {
|
|||||||
_ => Some(Value::nothing(call_span)),
|
_ => Some(Value::nothing(call_span)),
|
||||||
})
|
})
|
||||||
.into_pipeline_data_with_metadata(
|
.into_pipeline_data_with_metadata(
|
||||||
Box::new(PipelineMetadata {
|
PipelineMetadata {
|
||||||
data_source: DataSource::Ls,
|
data_source: DataSource::Ls,
|
||||||
}),
|
},
|
||||||
engine_state.ctrlc.clone(),
|
engine_state.ctrlc.clone(),
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
@ -258,7 +258,7 @@ pub fn uniq(
|
|||||||
call: &Call,
|
call: &Call,
|
||||||
input: Vec<Value>,
|
input: Vec<Value>,
|
||||||
item_mapper: Box<dyn Fn(ItemMapperState) -> ValueCounter>,
|
item_mapper: Box<dyn Fn(ItemMapperState) -> ValueCounter>,
|
||||||
metadata: Option<Box<PipelineMetadata>>,
|
metadata: Option<PipelineMetadata>,
|
||||||
) -> Result<PipelineData, ShellError> {
|
) -> Result<PipelineData, ShellError> {
|
||||||
let ctrlc = engine_state.ctrlc.clone();
|
let ctrlc = engine_state.ctrlc.clone();
|
||||||
let head = call.head;
|
let head = call.head;
|
||||||
|
@ -444,11 +444,11 @@ fn handle_row_stream(
|
|||||||
input: CmdInput<'_>,
|
input: CmdInput<'_>,
|
||||||
cfg: TableConfig,
|
cfg: TableConfig,
|
||||||
stream: ListStream,
|
stream: ListStream,
|
||||||
metadata: Option<Box<PipelineMetadata>>,
|
metadata: Option<PipelineMetadata>,
|
||||||
) -> Result<PipelineData, ShellError> {
|
) -> Result<PipelineData, ShellError> {
|
||||||
let ctrlc = input.engine_state.ctrlc.clone();
|
let ctrlc = input.engine_state.ctrlc.clone();
|
||||||
|
|
||||||
let stream = match metadata.as_deref() {
|
let stream = match metadata.as_ref() {
|
||||||
// First, `ls` sources:
|
// First, `ls` sources:
|
||||||
Some(PipelineMetadata {
|
Some(PipelineMetadata {
|
||||||
data_source: DataSource::Ls,
|
data_source: DataSource::Ls,
|
||||||
|
@ -19,7 +19,7 @@ pub fn collect_pipeline(input: PipelineData) -> (Vec<String>, Vec<Vec<Value>>) {
|
|||||||
metadata,
|
metadata,
|
||||||
span,
|
span,
|
||||||
..
|
..
|
||||||
} => collect_external_stream(stdout, stderr, exit_code, metadata.map(|m| *m), span),
|
} => collect_external_stream(stdout, stderr, exit_code, metadata, span),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,16 +40,14 @@ const LINE_ENDING_PATTERN: &[char] = &['\r', '\n'];
|
|||||||
/// Nushell.
|
/// Nushell.
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub enum PipelineData {
|
pub enum PipelineData {
|
||||||
// Note: the PipelineMetadata is boxed everywhere because the DataSource::Profiling caused
|
Value(Value, Option<PipelineMetadata>),
|
||||||
// stack overflow on Windows CI when testing virtualenv
|
ListStream(ListStream, Option<PipelineMetadata>),
|
||||||
Value(Value, Option<Box<PipelineMetadata>>),
|
|
||||||
ListStream(ListStream, Option<Box<PipelineMetadata>>),
|
|
||||||
ExternalStream {
|
ExternalStream {
|
||||||
stdout: Option<RawStream>,
|
stdout: Option<RawStream>,
|
||||||
stderr: Option<RawStream>,
|
stderr: Option<RawStream>,
|
||||||
exit_code: Option<ListStream>,
|
exit_code: Option<ListStream>,
|
||||||
span: Span,
|
span: Span,
|
||||||
metadata: Option<Box<PipelineMetadata>>,
|
metadata: Option<PipelineMetadata>,
|
||||||
trim_end_newline: bool,
|
trim_end_newline: bool,
|
||||||
},
|
},
|
||||||
Empty,
|
Empty,
|
||||||
@ -64,11 +62,10 @@ pub struct PipelineMetadata {
|
|||||||
pub enum DataSource {
|
pub enum DataSource {
|
||||||
Ls,
|
Ls,
|
||||||
HtmlThemes,
|
HtmlThemes,
|
||||||
Profiling(Vec<Value>),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PipelineData {
|
impl PipelineData {
|
||||||
pub fn new_with_metadata(metadata: Option<Box<PipelineMetadata>>, span: Span) -> PipelineData {
|
pub fn new_with_metadata(metadata: Option<PipelineMetadata>, span: Span) -> PipelineData {
|
||||||
PipelineData::Value(Value::nothing(span), metadata)
|
PipelineData::Value(Value::nothing(span), metadata)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -93,7 +90,7 @@ impl PipelineData {
|
|||||||
PipelineData::Empty
|
PipelineData::Empty
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn metadata(&self) -> Option<Box<PipelineMetadata>> {
|
pub fn metadata(&self) -> Option<PipelineMetadata> {
|
||||||
match self {
|
match self {
|
||||||
PipelineData::ListStream(_, x) => x.clone(),
|
PipelineData::ListStream(_, x) => x.clone(),
|
||||||
PipelineData::ExternalStream { metadata: x, .. } => x.clone(),
|
PipelineData::ExternalStream { metadata: x, .. } => x.clone(),
|
||||||
@ -102,7 +99,7 @@ impl PipelineData {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_metadata(mut self, metadata: Option<Box<PipelineMetadata>>) -> Self {
|
pub fn set_metadata(mut self, metadata: Option<PipelineMetadata>) -> Self {
|
||||||
match &mut self {
|
match &mut self {
|
||||||
PipelineData::ListStream(_, x) => *x = metadata,
|
PipelineData::ListStream(_, x) => *x = metadata,
|
||||||
PipelineData::ExternalStream { metadata: x, .. } => *x = metadata,
|
PipelineData::ExternalStream { metadata: x, .. } => *x = metadata,
|
||||||
@ -354,7 +351,7 @@ impl PipelineData {
|
|||||||
pub fn collect_string_strict(
|
pub fn collect_string_strict(
|
||||||
self,
|
self,
|
||||||
span: Span,
|
span: Span,
|
||||||
) -> Result<(String, Span, Option<Box<PipelineMetadata>>), ShellError> {
|
) -> Result<(String, Span, Option<PipelineMetadata>), ShellError> {
|
||||||
match self {
|
match self {
|
||||||
PipelineData::Empty => Ok((String::new(), span, None)),
|
PipelineData::Empty => Ok((String::new(), span, None)),
|
||||||
PipelineData::Value(Value::String { val, .. }, metadata) => Ok((val, span, metadata)),
|
PipelineData::Value(Value::String { val, .. }, metadata) => Ok((val, span, metadata)),
|
||||||
@ -926,7 +923,7 @@ pub trait IntoPipelineData {
|
|||||||
|
|
||||||
fn into_pipeline_data_with_metadata(
|
fn into_pipeline_data_with_metadata(
|
||||||
self,
|
self,
|
||||||
metadata: impl Into<Option<Box<PipelineMetadata>>>,
|
metadata: impl Into<Option<PipelineMetadata>>,
|
||||||
) -> PipelineData;
|
) -> PipelineData;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -940,7 +937,7 @@ where
|
|||||||
|
|
||||||
fn into_pipeline_data_with_metadata(
|
fn into_pipeline_data_with_metadata(
|
||||||
self,
|
self,
|
||||||
metadata: impl Into<Option<Box<PipelineMetadata>>>,
|
metadata: impl Into<Option<PipelineMetadata>>,
|
||||||
) -> PipelineData {
|
) -> PipelineData {
|
||||||
PipelineData::Value(self.into(), metadata.into())
|
PipelineData::Value(self.into(), metadata.into())
|
||||||
}
|
}
|
||||||
@ -950,7 +947,7 @@ pub trait IntoInterruptiblePipelineData {
|
|||||||
fn into_pipeline_data(self, ctrlc: Option<Arc<AtomicBool>>) -> PipelineData;
|
fn into_pipeline_data(self, ctrlc: Option<Arc<AtomicBool>>) -> PipelineData;
|
||||||
fn into_pipeline_data_with_metadata(
|
fn into_pipeline_data_with_metadata(
|
||||||
self,
|
self,
|
||||||
metadata: impl Into<Option<Box<PipelineMetadata>>>,
|
metadata: impl Into<Option<PipelineMetadata>>,
|
||||||
ctrlc: Option<Arc<AtomicBool>>,
|
ctrlc: Option<Arc<AtomicBool>>,
|
||||||
) -> PipelineData;
|
) -> PipelineData;
|
||||||
}
|
}
|
||||||
@ -973,7 +970,7 @@ where
|
|||||||
|
|
||||||
fn into_pipeline_data_with_metadata(
|
fn into_pipeline_data_with_metadata(
|
||||||
self,
|
self,
|
||||||
metadata: impl Into<Option<Box<PipelineMetadata>>>,
|
metadata: impl Into<Option<PipelineMetadata>>,
|
||||||
ctrlc: Option<Arc<AtomicBool>>,
|
ctrlc: Option<Arc<AtomicBool>>,
|
||||||
) -> PipelineData {
|
) -> PipelineData {
|
||||||
PipelineData::ListStream(
|
PipelineData::ListStream(
|
||||||
|
Loading…
Reference in New Issue
Block a user