From 96a2d08c8827008ce49c23d04b7f682d9334ed38 Mon Sep 17 00:00:00 2001 From: Andrii Furmanets Date: Tue, 20 Oct 2026 10:48:11 +0300 Subject: [PATCH] Allow negative %d counts in pathmap pattern replacements --- lib/rake/ext/string.rb | 2 +- test/test_rake_path_map.rb | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/rake/ext/string.rb b/lib/rake/ext/string.rb index c82f53245..b94eaa280 100644 --- a/lib/rake/ext/string.rb +++ b/lib/rake/ext/string.rb @@ -160,7 +160,7 @@ def pathmap(spec=nil, &block) result << "%" when /%(-?\d+)d/ result << pathmap_partial($1.to_i) - when /^%\{([^}]*)\}(\d*[dpfnxX])/ + when /^%\{([^}]*)\}(-?\d+d|[dpfnxX])/ patterns, operator = $1, $2 result << pathmap("%" + operator).pathmap_replace(patterns, &block) when /^%/ diff --git a/test/test_rake_path_map.rb b/test/test_rake_path_map.rb index 1551247ec..48c495733 100644 --- a/test/test_rake_path_map.rb +++ b/test/test_rake_path_map.rb @@ -124,6 +124,15 @@ def test_multiple_patterns def test_partial_directory_selection_works_with_patterns assert_equal "this/is/a/long", "this/is/a/really/long/path/ok.rb".pathmap("%{/really/,/}5d") + assert_equal "long/dir", + "this/is/a/really/long/path/ok.rb".pathmap("%{path,dir}-2d") + end + + def test_pattern_with_count_on_non_directory_operator + ex = assert_raises(ArgumentError) do + "dir/abc.rb".pathmap("%{a,x}-2f") + end + assert_match(/unknown.*pathmap.*spec.*-2f/i, ex.message) end def test_pattern_with_invalid_operator