From c4ffbd6a74336e81bb24a45b09199bcf4b884cea Mon Sep 17 00:00:00 2001 From: Sai Asish Y Date: Mon, 20 Jul 2026 00:12:48 -0700 Subject: [PATCH] Fix Glob#to_regexp crash on brace patterns Signed-off-by: Sai Asish Y --- test/test_glob.rb | 27 +++++++++++++++++++++++++++ utils/glob.rb | 9 +++++---- 2 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 test/test_glob.rb diff --git a/test/test_glob.rb b/test/test_glob.rb new file mode 100644 index 0000000..afb6b7f --- /dev/null +++ b/test/test_glob.rb @@ -0,0 +1,27 @@ +# SPDX-FileCopyrightText: Copyright (c) 2014-2026 Yegor Bugayenko +# SPDX-License-Identifier: MIT + +require_relative '../utils/glob' +require_relative 'test__helper' + +# PDD::Glob test. +# Author:: Yegor Bugayenko (yegor256@gmail.com) +# Copyright:: Copyright (c) 2014-2026 Yegor Bugayenko +# License:: MIT +class TestGlob < Minitest::Test + def test_converts_plain_pattern + assert_equal('foo/.*\\.rb', PDD::Glob.new('foo/*.rb').to_regexp) + end + + def test_expands_braces + assert_equal('.*\\.(rb|js)', PDD::Glob.new('**/*.{rb,js}').to_regexp) + end + + def test_keeps_unmatched_closing_brace + assert_equal('a}b', PDD::Glob.new('a}b').to_regexp) + end + + def test_keeps_escaped_char_literal + assert_equal('a\\*b', PDD::Glob.new('a\\*b').to_regexp) + end +end diff --git a/utils/glob.rb b/utils/glob.rb index ed0376a..5d506a7 100644 --- a/utils/glob.rb +++ b/utils/glob.rb @@ -13,11 +13,12 @@ def initialize(string) # rubocop:disable Metrics/CyclomaticComplexity def to_regexp chars = @string.gsub(%r{(\*\*/\*)|(\*\*)}, '*').chars - curlies = 0, escaping = false + curlies = 0 + escaping = false chars.map do |char| if escaping escaping = false - return char + next char end case char when '*' @@ -32,9 +33,9 @@ def to_regexp when '}' if curlies.positive? curlies -= 1 - return ')' + next ')' end - return char + next char when ',' curlies.positive? ? '|' : char when '\\'