diff options
author | Karen Arutyunov <karen@codesynthesis.com> | 2025-01-03 12:01:53 +0200 |
---|---|---|
committer | Karen Arutyunov <karen@codesynthesis.com> | 2025-01-03 15:06:30 +0200 |
commit | 8723e8bb02d3d14a4ecb0349c17af37e936c0528 (patch) | |
tree | ff2ee2132303d1678227d3db3cd85458403bad11 | |
parent | 8d5e1676c2362d8f03c6c39bf814518428d1c081 (diff) |
Fix name pattern expansion for absolute path patterns (GH issue #453)
-rw-r--r-- | libbuild2/parser.cxx | 11 | ||||
-rw-r--r-- | tests/name/pattern.testscript | 44 |
2 files changed, 34 insertions, 21 deletions
diff --git a/libbuild2/parser.cxx b/libbuild2/parser.cxx index 1e2f209..578d3dd 100644 --- a/libbuild2/parser.cxx +++ b/libbuild2/parser.cxx @@ -7258,7 +7258,9 @@ namespace build2 (root_ != nullptr && root_->root_extra != nullptr && m.to_directory () && - exists (d.sp / m / root_->root_extra->buildignore_file))) + exists (m.relative () + ? d.sp / m / root_->root_extra->buildignore_file + : m / root_->root_extra->buildignore_file))) return !interm; // Note that we have to make copies of the extension since there will @@ -7314,9 +7316,11 @@ namespace build2 return true; }); + path pat (move (p)); + try { - path_search (path (move (p)), + path_search (pat, process, *sp, path_match_flags::follow_symlinks, @@ -7324,7 +7328,8 @@ namespace build2 } catch (const system_error& e) { - fail (l) << "unable to scan " << *sp << ": " << e; + fail (l) << "unable to scan for '" + << (pat.relative () ? *sp / pat : pat) << "': " << e; } }; diff --git a/tests/name/pattern.testscript b/tests/name/pattern.testscript index efd15b2..acad250 100644 --- a/tests/name/pattern.testscript +++ b/tests/name/pattern.testscript @@ -105,62 +105,70 @@ EOI : { touch foo.txt; - $* <'print *.txt' >'foo.txt' : simple-file + $* <'print *.txt' >'foo.txt' : simple-file mkdir foo; - $* <'print */' >/'foo/' : simple-dir + $* <'print */' >/'foo/' : simple-dir touch foo.txt; - $* <'print {*.txt}' >'foo.txt' : group + $* <'print {*.txt}' >'foo.txt' : group touch foo.txt; - $* <'print {+*.txt}' >'foo.txt' : plus-prefixed + $* <'print {+*.txt}' >'foo.txt' : plus-prefixed mkdir dir && touch dir/foo.txt; - $* <'print dir/{*.txt}' >'dir/foo.txt' : dir + $* <'print dir/{*.txt}' >'dir/foo.txt' : dir touch foo.txt; - $* <'print file{*.txt}' >'file{foo.txt}' : type + $* <'print file{*.txt}' >'file{foo.txt}' : type touch foo.txt; - $* <'print x@{*.txt}' >'x@foo.txt' : pair + $* <'print x@{*.txt}' >'x@foo.txt' : pair touch bar.txt; - $* <'print x@dir/file{f*.txt}' >'' : empty + $* <'print x@dir/file{f*.txt}' >'' : empty mkdir dir && touch dir/foo.txt; - $* <'print **.txt' >/'dir/foo.txt' : recursive + $* <'print **.txt' >/'dir/foo.txt' : recursive mkdir dir && touch dir/foo.txt; - $* <'print d*/*.txt' >/'dir/foo.txt' : multi-pattern + $* <'print d*/*.txt' >/'dir/foo.txt' : multi-pattern touch foo.txt bar.txt; - $* <'print {*.txt -bar.txt}' >'foo.txt' : exclude-non-pattern + $* <'print {*.txt -bar.txt}' >'foo.txt' : exclude-non-pattern mkdir baz; touch foo.txt bar.txt baz/fox.txt baz/box.txt; - $* <'print {**.txt -b*.txt -b*/*}' >'foo.txt' : exclude-pattern + $* <'print {**.txt -b*.txt -b*/*}' >'foo.txt' : exclude-pattern touch foo.txt bar.txt baz.txt; - $* <'print {*.txt -{*z.txt bar.txt}}' >'foo.txt' : exclude-group + $* <'print {*.txt -{*z.txt bar.txt}}' >'foo.txt' : exclude-group touch bar.txt; - $* <'print {f*.txt +bar.txt}' >'bar.txt' : include-non-wildcard + $* <'print {f*.txt +bar.txt}' >'bar.txt' : include-non-wildcard touch bar.txt; - $* <'print {f*.txt +b*.txt}' >'bar.txt' : include-pattern + $* <'print {f*.txt +b*.txt}' >'bar.txt' : include-pattern mkdir bar; - $* <'print {f*/ +{b*/}}' >/'bar/' : include-group + $* <'print {f*/ +{b*/}}' >/'bar/' : include-group mkdir -p foo/bar; $* <'print $path.canonicalize(foo/{+{b*/}})' >/'foo/bar/' : include-group-first touch foo.txt fox.txt; - $* <'print {*.txt -f*.txt +*x.txt}' >'fox.txt' : include-exclude-order + $* <'print {*.txt -f*.txt +*x.txt}' >'fox.txt' : include-exclude-order touch foo.txt; - $* <'print {+foo.txt} {+bar.txt}' >'foo.txt' : non-wildcard + $* <'print {+foo.txt} {+bar.txt}' >'foo.txt' : non-wildcard + + mkdir -p foo/bar; + touch foo/bar/baz.txt; + $* <'print {$src_base/foo/**}' >/"$~/foo/bar/baz.txt" : abs-path-pattern + + mkdir -p foo/bar; + touch foo/bar/baz.txt; + $* <'print $src_base/foo/{**}' >/"$~/foo/bar/baz.txt" : abs-start-dir } : escaping |