Mercurial > octave
changeset 28683:549c10384cc2
dir.m: Return directory, not contents, when wildcard specified (bug #58976)
* dir.m: Add logic to detect wildcard (Matlab only recognizes '*') and disable
special case logic to return directory contents when only one argument to dir
is present. Add BIST test for bug #58976 (this was harder than the fix).
author | Rik <rik@octave.org> |
---|---|
date | Thu, 03 Sep 2020 17:15:01 -0700 |
parents | b245bcfa1736 |
children | cf9fe018c9d1 |
files | scripts/miscellaneous/dir.m |
diffstat | 1 files changed, 37 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/scripts/miscellaneous/dir.m Thu Sep 03 15:11:49 2020 -0700 +++ b/scripts/miscellaneous/dir.m Thu Sep 03 17:15:01 2020 -0700 @@ -97,9 +97,11 @@ if (strcmp (directory, ".")) flst = {"."}; nf = 1; + dir_has_wildcard = false; else flst = __wglob__ (directory); nf = numel (flst); + dir_has_wildcard = any (directory == '*'); # See Bug #58976. endif ## Determine the file list for the case where a single directory is specified. @@ -109,7 +111,7 @@ if (err < 0) warning ("dir: 'stat (%s)' failed: %s", fn, msg); nf = 0; - elseif (S_ISDIR (st.mode)) + elseif (S_ISDIR (st.mode) && ! dir_has_wildcard) flst = readdir (flst{1}); nf = numel (flst); flst = strcat ([fn filesep], flst); @@ -228,6 +230,40 @@ %! endif %! end_unwind_protect +%!test <*58976> +%! orig_dir = pwd (); +%! tmp_dir = tempname (); +%! unwind_protect +%! assert (mkdir (tmp_dir)); +%! assert (mkdir (fullfile (tmp_dir, "dir1"))); +%! assert (mkdir (fullfile (tmp_dir, "dir2"))); +%! chdir (fullfile (tmp_dir, "dir1")); +%! fclose (fopen ("f1", "w")); +%! chdir (tmp_dir); +%! +%! ## Wildcard with multiple matches lists directories +%! list = dir (fullfile (tmp_dir, "dir*")); +%! keyboard; +%! assert (numel (list) == 2); +%! assert ({list.name}, {"dir1", "dir2"}); +%! +%! ## Wildcard with single match lists directories +%! assert (rmdir (fullfile (tmp_dir, "dir2"))); +%! list = dir (fullfile (tmp_dir, "dir*")); +%! assert (numel (list) == 1); +%! assert ({list.name}, {"dir1"}); +%! +%! ## No wildcard returns listing of directory contents +%! list = dir (fullfile (tmp_dir, "dir1")); +%! assert (any (strcmp ({list.name}, "f1"))); +%! unwind_protect_cleanup +%! chdir (orig_dir); +%! confirm_recursive_rmdir (false, "local"); +%! if (exist (tmp_dir)) +%! sts = rmdir (tmp_dir, "s"); +%! endif +%! end_unwind_protect + %!testif ; isunix () <*57666> %! orig_dir = pwd (); %! tmp_dir = tempname ();