From bb55abc7c42b1b42d3c536caccef256090bbea43 Mon Sep 17 00:00:00 2001 From: devil Date: Mon, 13 Jul 2026 18:19:36 +0000 Subject: [PATCH] #616: deduplicate repos matched by overlapping masks in unmask_repos --- lib/fbe/unmask_repos.rb | 1 + test/fbe/test_unmask_repos.rb | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/lib/fbe/unmask_repos.rb b/lib/fbe/unmask_repos.rb index 3c518b06..7d616a93 100644 --- a/lib/fbe/unmask_repos.rb +++ b/lib/fbe/unmask_repos.rb @@ -92,6 +92,7 @@ def Fbe.unmask_repos( # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticCompl re = Fbe.mask_to_regex(mask[1..]) repos.reject! { |r| re.match?(r) } end + repos.uniq! repos.reject! { |repo| octo.repository(repo)[:archived] } raise(Fbe::Error, "No repos found matching: #{options.repositories.inspect}") if repos.empty? repos.shuffle! diff --git a/test/fbe/test_unmask_repos.rb b/test/fbe/test_unmask_repos.rb index cb1831e0..0a46a3b5 100644 --- a/test/fbe/test_unmask_repos.rb +++ b/test/fbe/test_unmask_repos.rb @@ -50,6 +50,13 @@ def test_finds_case_insensitive assert_equal(2, list.size) end + def test_deduplicates_repos_matched_by_overlapping_masks + opts = Judges::Options.new({ 'testing' => true, 'repositories' => 'yegor256/factbase,Yegor256/*' }) + list = Fbe.unmask_repos(options: opts, global: {}, loog: Loog::NULL) + assert_equal(list.uniq.size, list.size, "duplicates found in #{list.inspect}") + assert_includes(list, 'yegor256/factbase') + end + def test_mask_to_regex_treats_dot_as_literal re = Fbe.mask_to_regex('zold-io/blog.zold.io') assert_match(re, 'zold-io/blog.zold.io')