diff --git a/lib/rubygems/specification_policy.rb b/lib/rubygems/specification_policy.rb index ca5fa5fb720ced..66558252873239 100644 --- a/lib/rubygems/specification_policy.rb +++ b/lib/rubygems/specification_policy.rb @@ -12,13 +12,14 @@ class Gem::SpecificationPolicy VALID_URI_PATTERN = %r{\Ahttps?:\/\/([^\s:@]+:[^\s:@]*@)?[A-Za-z\d\-]+(\.[A-Za-z\d\-]+)+\.?(:\d{1,5})?([\/?]\S*)?\z} # :nodoc: METADATA_LINK_KEYS = %w[ - bug_tracker_uri - changelog_uri - documentation_uri homepage_uri - mailing_list_uri + changelog_uri source_code_uri + documentation_uri wiki_uri + mailing_list_uri + bug_tracker_uri + download_uri funding_uri ].freeze # :nodoc: @@ -106,6 +107,8 @@ def validate_optional(strict) validate_removed_attributes + validate_unique_links + if @warnings > 0 if strict error "specification has warnings" @@ -501,6 +504,22 @@ def validate_rake_extensions(builder) # :nodoc: WARNING end + def validate_unique_links + links = @specification.metadata.slice(*METADATA_LINK_KEYS) + grouped = links.group_by {|_key, uri| uri } + grouped.each do |uri, copies| + next unless copies.length > 1 + keys = copies.map(&:first).join("\n ") + warning <<~WARNING + You have specified the uri: + #{uri} + for all of the following keys: + #{keys} + Only the first one will be shown on rubygems.org + WARNING + end + end + def warning(statement) # :nodoc: @warnings += 1 diff --git a/test/rubygems/test_gem_specification.rb b/test/rubygems/test_gem_specification.rb index f586da94a64770..5601f286a95b40 100644 --- a/test/rubygems/test_gem_specification.rb +++ b/test/rubygems/test_gem_specification.rb @@ -3644,6 +3644,38 @@ def test_metadata_link_validation_fails end end + def test_metadata_link_validation_warns_for_duplicates + util_setup_validate + + Dir.chdir @tempdir do + @m2 = quick_gem "m", "2" do |s| + s.files = %w[lib/code.rb] + s.licenses = "BSD-2-Clause" + s.metadata = { + "source_code_uri" => "http://example.com", + "homepage_uri" => "http://example.com", + "changelog_uri" => "http://example.com/changelog", + } + end + + use_ui @ui do + @m2.validate + end + + expected = <<~EXPECTED + #{w}: You have specified the uri: + http://example.com + for all of the following keys: + homepage_uri + source_code_uri + Only the first one will be shown on rubygems.org + #{w}: See https://guides.rubygems.org/specification-reference/ for help + EXPECTED + + assert_equal expected, @ui.error, "warning" + end + end + def test_metadata_specs @m1 = quick_gem "m", "1" do |s| s.files = %w[lib/code.rb]