diff --git a/globset/src/glob.rs b/globset/src/glob.rs index 42d651f..fbfc7d9 100644 --- a/globset/src/glob.rs +++ b/globset/src/glob.rs @@ -659,9 +659,18 @@ impl Tokens { for pat in patterns { let mut altre = String::new(); self.tokens_to_regex(options, &pat, &mut altre); - parts.push(altre); + if !altre.is_empty() { + parts.push(altre); + } + } + + // It is possible to have an empty set in which case the + // resulting alternation '()' would be an error. + if !parts.is_empty() { + re.push('('); + re.push_str(&parts.join("|")); + re.push(')'); } - re.push_str(&parts.join("|")); } } } diff --git a/tests/tests.rs b/tests/tests.rs index 858fc62..aeacca5 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -1326,6 +1326,27 @@ fn regression_270() { assert_eq!(lines, path("foo:-test\n")); } +// See: https://github.com/BurntSushi/ripgrep/issues/391 +#[test] +fn regression_391() { + let wd = WorkDir::new("regression_391"); + wd.create_dir(".git"); + wd.create("lock", ""); + wd.create("bar.py", ""); + wd.create(".git/packed-refs", ""); + wd.create(".git/description", ""); + + let mut cmd = wd.command(); + cmd.arg("--no-ignore").arg("--hidden").arg("--follow").arg("--files") + .arg("--glob") + .arg("!{.git,node_modules,plugged}/**") + .arg("--glob") + .arg("*.{js,json,php,md,styl,scss,sass,pug,html,config,py,cpp,c,go,hs}"); + + let lines: String = wd.stdout(&mut cmd); + assert_eq!(lines, "bar.py\n"); +} + #[test] fn type_list() { let wd = WorkDir::new("type_list");