Support version option in Nu bin. (#3632)

Additionally we remove the little pieces that we relied on `clap` (for version number in this case).
This commit is contained in:
Andrés N. Robalino
2021-06-16 14:53:28 -05:00
committed by GitHub
parent 18be6768c9
commit 2a946af81e
13 changed files with 129 additions and 56 deletions

View File

@ -6,11 +6,12 @@ pub use options::{CliOptions, NuScript, Options};
use options_parser::{NuParser, OptionsParser};
use nu_command::{commands::nu::Nu, utils::test_bins as binaries};
use nu_engine::get_full_help;
use nu_engine::{get_full_help, EvaluationContext};
use nu_errors::ShellError;
use nu_protocol::hir::{Call, Expression, SpannedExpression};
use nu_protocol::hir::{Call, Expression, SpannedExpression, Synthetic};
use nu_protocol::{Primitive, UntaggedValue};
use nu_source::{Span, Tag};
use nu_stream::InputStream;
pub struct App {
parser: Box<dyn OptionsParser>,
@ -43,29 +44,55 @@ impl App {
}
if self.help() {
let ctx = self.parser.context();
let autoview_cmd = ctx
.get_command("autoview")
.expect("could not find autoview command");
let context = self.parser.context();
let stream = nu_stream::OutputStream::one(
UntaggedValue::string(get_full_help(&Nu, &context.scope))
.into_value(nu_source::Tag::unknown()),
);
if let Ok(output_stream) = ctx.run_command(
autoview_cmd,
Tag::unknown(),
Call::new(
Box::new(SpannedExpression::new(
Expression::string("autoview".to_string()),
consume(context, stream)?;
std::process::exit(0);
}
if self.version() {
let context = self.parser.context();
let stream = nu_command::commands::version::version(nu_engine::CommandArgs {
context: context.clone(),
call_info: nu_engine::UnevaluatedCallInfo {
args: Call::new(
Box::new(SpannedExpression::new(
Expression::Synthetic(Synthetic::String("version".to_string())),
Span::unknown(),
)),
Span::unknown(),
)),
Span::unknown(),
),
nu_stream::OutputStream::one(
UntaggedValue::string(get_full_help(&Nu, &ctx.scope))
.into_value(nu_source::Tag::unknown()),
),
) {
for _ in output_stream {}
}
),
name_tag: Tag::unknown(),
},
input: InputStream::empty(),
})?;
let stream = {
let command = context
.get_command("pivot")
.expect("could not find version command");
context.run_command(
command,
Tag::unknown(),
Call::new(
Box::new(SpannedExpression::new(
Expression::Synthetic(Synthetic::String("pivot".to_string())),
Span::unknown(),
)),
Span::unknown(),
),
stream,
)?
};
consume(context, stream)?;
std::process::exit(0);
}
@ -169,6 +196,13 @@ impl App {
.unwrap_or(false)
}
pub fn version(&self) -> bool {
self.options
.get("version")
.map(|v| matches!(v.as_bool(), Ok(true)))
.unwrap_or(false)
}
pub fn scripts(&self) -> Option<Vec<Result<String, ShellError>>> {
self.options.get("args").map(|v| {
v.table_entries()
@ -284,6 +318,29 @@ fn quote_positionals(parameters: &[String]) -> Vec<String> {
.collect::<Vec<_>>()
}
fn consume(context: &EvaluationContext, stream: InputStream) -> Result<(), ShellError> {
let autoview_cmd = context
.get_command("autoview")
.expect("could not find autoview command");
let stream = context.run_command(
autoview_cmd,
Tag::unknown(),
Call::new(
Box::new(SpannedExpression::new(
Expression::Synthetic(Synthetic::String("autoview".to_string())),
Span::unknown(),
)),
Span::unknown(),
),
stream,
)?;
for _ in stream {}
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
@ -300,6 +357,7 @@ mod tests {
let ui = cli_app();
ui.parse("nu")?;
assert_eq!(ui.version(), false);
assert_eq!(ui.help(), false);
assert_eq!(ui.takes_stdin(), false);
assert_eq!(ui.save_history(), true);
@ -397,6 +455,15 @@ mod tests {
Ok(())
}
#[test]
fn has_version() -> Result<(), ShellError> {
let ui = cli_app();
ui.parse("nu --version")?;
assert_eq!(ui.version(), true);
Ok(())
}
#[test]
fn has_help() -> Result<(), ShellError> {
let ui = cli_app();

View File

@ -1,7 +1,7 @@
use super::Options;
use nu_command::commands::nu::{self, Nu};
use nu_command::commands::Autoview;
use nu_command::commands::{Autoview, Pivot, Table, Version as NuVersion};
use nu_engine::{whole_stream_command, EvaluationContext};
use nu_errors::ShellError;
use nu_protocol::hir::{ClassifiedCommand, InternalCommand, NamedValue};
@ -22,7 +22,10 @@ impl NuParser {
let context = EvaluationContext::basic();
context.add_commands(vec![
whole_stream_command(Nu {}),
whole_stream_command(NuVersion {}),
whole_stream_command(Autoview {}),
whole_stream_command(Pivot {}),
whole_stream_command(Table {}),
]);
Self { context }

View File

@ -1,3 +1,5 @@
use super::Nu;
use crate::line_editor::configure_ctrl_c;
use nu_ansi_term::Color;
use nu_engine::{maybe_print_errors, run_block, script::run_script_standalone, EvaluationContext};
@ -148,7 +150,7 @@ pub fn cli(
if !skip_welcome_message {
println!(
"Welcome to Nushell {} (type 'help' for more info)",
clap::crate_version!()
Nu::version()
);
}

View File

@ -26,7 +26,10 @@ pub use crate::cli::cli;
pub use crate::app::App;
pub use crate::cli::{parse_and_eval, register_plugins, run_script_file};
pub use nu_command::commands::default_context::create_default_context;
pub use nu_command::{
commands::default_context::create_default_context, commands::nu as Nu,
commands::Version as NuVersion,
};
pub use nu_data::config;
pub use nu_data::dict::TaggedListBuilder;
pub use nu_data::primitive;