mirror of
https://github.com/fish-shell/fish-shell
synced 2024-12-27 05:13:10 +00:00
Fix for recursive wildcard expansion ignoring directories
When ascending out of a directory, we need to clear the directory from the visited set. Fixes #2414.
This commit is contained in:
parent
dd245f62f0
commit
11376ae25b
2 changed files with 13 additions and 1 deletions
|
@ -1474,6 +1474,9 @@ static void test_expand()
|
|||
yyy
|
||||
bax
|
||||
xxx
|
||||
lol
|
||||
nub
|
||||
q
|
||||
.foo
|
||||
*/
|
||||
|
||||
|
@ -1481,12 +1484,14 @@ static void test_expand()
|
|||
if (system("mkdir -p /tmp/fish_expand_test/b/")) err(L"mkdir failed");
|
||||
if (system("mkdir -p /tmp/fish_expand_test/baz/")) err(L"mkdir failed");
|
||||
if (system("mkdir -p /tmp/fish_expand_test/bax/")) err(L"mkdir failed");
|
||||
if (system("mkdir -p /tmp/fish_expand_test/lol/nub/")) err(L"mkdir failed");
|
||||
if (system("touch /tmp/fish_expand_test/.foo")) err(L"touch failed");
|
||||
if (system("touch /tmp/fish_expand_test/b/x")) err(L"touch failed");
|
||||
if (system("touch /tmp/fish_expand_test/bar")) err(L"touch failed");
|
||||
if (system("touch /tmp/fish_expand_test/bax/xxx")) err(L"touch failed");
|
||||
if (system("touch /tmp/fish_expand_test/baz/xxx")) err(L"touch failed");
|
||||
if (system("touch /tmp/fish_expand_test/baz/yyy")) err(L"touch failed");
|
||||
if (system("touch /tmp/fish_expand_test/lol/nub/q")) err(L"touch failed");
|
||||
|
||||
// This is checking that .* does NOT match . and .. (https://github.com/fish-shell/fish-shell/issues/270). But it does have to match literal components (e.g. "./*" has to match the same as "*"
|
||||
const wchar_t * const wnull = NULL;
|
||||
|
@ -1523,6 +1528,10 @@ static void test_expand()
|
|||
L"/tmp/fish_expand_test/b/", L"/tmp/fish_expand_test/baz/", L"/tmp/fish_expand_test/bax/", wnull,
|
||||
L"Glob did the wrong thing 6");
|
||||
|
||||
expand_test(L"/tmp/fish_expand_test/**/q", 0,
|
||||
L"/tmp/fish_expand_test/lol/nub/q", wnull,
|
||||
L"Glob did the wrong thing 7");
|
||||
|
||||
expand_test(L"/tmp/fish_expand_test/BA", EXPAND_FOR_COMPLETIONS,
|
||||
L"/tmp/fish_expand_test/bar", L"/tmp/fish_expand_test/bax/", L"/tmp/fish_expand_test/baz/", wnull,
|
||||
L"Case insensitive test did the wrong thing");
|
||||
|
|
|
@ -841,6 +841,9 @@ void wildcard_expander_t::expand_intermediate_segment(const wcstring &base_dir,
|
|||
/* We made it through. Perform normal wildcard expansion on this new directory, starting at our tail_wc, which includes the ANY_STRING_RECURSIVE guy. */
|
||||
full_path.push_back(L'/');
|
||||
this->expand(full_path, wc_remainder);
|
||||
|
||||
/* Now remove the visited file. This is for #2414: only directories "beneath" us should be considered visited. */
|
||||
this->visited_files.erase(file_id);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1024,7 +1027,7 @@ void wildcard_expander_t::expand(const wcstring &base_dir, const wchar_t *wc)
|
|||
}
|
||||
else
|
||||
{
|
||||
/* Not the last segment, nonempty wildcard */
|
||||
/* Not the last segment, nonempty wldcard */
|
||||
assert(next_slash != NULL);
|
||||
const wchar_t *wc_remainder = next_slash;
|
||||
while (*wc_remainder == L'/')
|
||||
|
|
Loading…
Reference in a new issue