From 1572808adb29aa853a130783322d1a98ce9f1340 Mon Sep 17 00:00:00 2001 From: Kyle Anderson Date: Sat, 15 Oct 2022 09:00:38 -0700 Subject: [PATCH] Filter out empty glob patterns to "glob" command (#6707) * Filter out empty glob patterns An empty argument to the "glob" command will now produce an empty result. Working towards nushell/nushell#6653. * Run `cargo fmt --all` Just autoformatted the repo so that CI passes and we have a consistent code format across modules. * Treat empty glob argument as error The glob command will now report an empty string argument as an error instead of silently ignoring it. See https://github.com/nushell/nushell/pull/6707#discussion_r993345013. * Add tests for glob command Two small tests for the glob command, one to check that the empty string errors it, and another to sanity check the '*' glob, have been added. * Rename glob sanity check star test Co-authored-by: Kyle Anderson --- crates/nu-command/src/filesystem/glob.rs | 10 ++++++ crates/nu-command/tests/commands/glob.rs | 39 ++++++++++++++++++++++++ crates/nu-command/tests/commands/mod.rs | 1 + 3 files changed, 50 insertions(+) create mode 100644 crates/nu-command/tests/commands/glob.rs diff --git a/crates/nu-command/src/filesystem/glob.rs b/crates/nu-command/src/filesystem/glob.rs index 885f4a4e64..7df54469d4 100644 --- a/crates/nu-command/src/filesystem/glob.rs +++ b/crates/nu-command/src/filesystem/glob.rs @@ -99,6 +99,16 @@ impl Command for Glob { let glob_pattern: Spanned = call.req(engine_state, stack, 0)?; let depth = call.get_flag(engine_state, stack, "depth")?; + if glob_pattern.item.is_empty() { + return Err(ShellError::GenericError( + "glob pattern must not be empty".to_string(), + "".to_string(), + Some(glob_pattern.span), + Some("add characters to the glob pattern".to_string()), + Vec::new(), + )); + } + let folder_depth = if let Some(depth) = depth { depth } else { diff --git a/crates/nu-command/tests/commands/glob.rs b/crates/nu-command/tests/commands/glob.rs new file mode 100644 index 0000000000..7a5e628e9f --- /dev/null +++ b/crates/nu-command/tests/commands/glob.rs @@ -0,0 +1,39 @@ +use nu_test_support::fs::Stub::EmptyFile; +use nu_test_support::playground::Playground; +use nu_test_support::{nu, pipeline}; + +#[test] +fn empty_glob_pattern_triggers_error() { + Playground::setup("glob_test_1", |dirs, sandbox| { + sandbox.with_files(vec![ + EmptyFile("yehuda.txt"), + EmptyFile("jonathan.txt"), + EmptyFile("andres.txt"), + ]); + + let actual = nu!( + cwd: dirs.test(), + "glob ''", + ); + + assert!(actual.err.contains("must not be empty")); + }) +} + +#[test] +fn nonempty_glob_lists_matching_paths() { + Playground::setup("glob_sanity_star", |dirs, sandbox| { + sandbox.with_files(vec![ + EmptyFile("yehuda.txt"), + EmptyFile("jonathan.txt"), + EmptyFile("andres.txt"), + ]); + + let actual = nu!( + cwd: dirs.test(), + pipeline("glob '*' | length"), + ); + + assert_eq!(actual.out, "3"); + }) +} diff --git a/crates/nu-command/tests/commands/mod.rs b/crates/nu-command/tests/commands/mod.rs index 1be98ba91d..dc06030b78 100644 --- a/crates/nu-command/tests/commands/mod.rs +++ b/crates/nu-command/tests/commands/mod.rs @@ -24,6 +24,7 @@ mod flatten; mod format; mod g; mod get; +mod glob; mod group_by; mod hash_; mod headers;