From 49531f69ed251f0caf030e19afbf6a0fd1868aa6 Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Sat, 1 Dec 2018 19:35:43 +0300 Subject: Change path_search() to only match directory absent components in 'match absent' mode --- libbutl/filesystem.cxx | 29 ++++------------------------- libbutl/filesystem.mxx | 8 ++++++-- 2 files changed, 10 insertions(+), 27 deletions(-) (limited to 'libbutl') diff --git a/libbutl/filesystem.cxx b/libbutl/filesystem.cxx index 736426b..2fae1f9 100644 --- a/libbutl/filesystem.cxx +++ b/libbutl/filesystem.cxx @@ -1737,32 +1737,11 @@ namespace butl // component omitted, unless this is the only pattern component. // if ((fl & path_match_flags::match_absent) != path_match_flags::none && + pc.to_directory () && + (!pattern_dir.empty () || !simple) && pc.string ().find_first_not_of ('*') == string::npos && - (!pattern_dir.empty () || !simple)) - { - // Stripping the (leading) absent-matching pattern component and calling - // search() with the resulting pattern and the same pattern dir works in - // most cases, except for a simple pattern. In the latter case, the - // pattern becomes empty and its type information gets lost. In other - // words, the patterns a/b/*/ and a/b/* become indistinguishable. Thus, - // for such a corner case we will strip the leaf from the pattern dir - // and use it as a pattern, stripping the trailing separator, if - // required. So for the above examples the search() calls will be as - // follows: - // - // search(b/, a/) - // search(b, a/) - // - const dir_path& d (!simple ? pattern_dir : pattern_dir.directory ()); - - const path& p ( - !simple ? pattern.leaf (pc) : - pattern.to_directory () ? pattern_dir.leaf () : - path (pattern_dir.leaf ().string ())); // Strip the trailing separator. - - if (!search (p, d, fl, func, filesystem)) - return false; - } + !search (pattern.leaf (pc), pattern_dir, fl, func, filesystem)) + return false; return true; } diff --git a/libbutl/filesystem.mxx b/libbutl/filesystem.mxx index f05e569..cf041c2 100644 --- a/libbutl/filesystem.mxx +++ b/libbutl/filesystem.mxx @@ -714,8 +714,12 @@ LIBBUTL_MODEXPORT namespace butl // set, the `a/*/b` pattern matches not only `a/x/b` path, but also `a/b`. // // Note that this does not apply to single-component patterns and the - // pattern type is always preserved. In particular, the `a/b/*` pattern - // matches `a/b` but not `a/b/`. + // pattern type is always preserved. In particular, the `a/*/` pattern + // matches `a/` but not `a`. + // + // Finally, keep in mind that only absent directory components can be + // matched this way. In particular, pattern `a*/*` does not match `ab` + // (but `a*/*/` matches `ab/`). // match_absent = 0x2, -- cgit v1.1