diff --git a/ee/app/workers/import_software_licenses_worker.rb b/ee/app/workers/import_software_licenses_worker.rb index 6138d53bed0ea05b8b93fe3506d361f94e74d504..7680431e8598cc6ceda38b8134f5c5f7439f6bdd 100644 --- a/ee/app/workers/import_software_licenses_worker.rb +++ b/ee/app/workers/import_software_licenses_worker.rb @@ -8,6 +8,8 @@ class ImportSoftwareLicensesWorker def perform catalogue.each do |spdx_license| + next if spdx_license.deprecated + if licenses[spdx_license.name] licenses_with(spdx_license.name) .update_all(spdx_identifier: spdx_license.id) diff --git a/ee/lib/gitlab/spdx/catalogue.rb b/ee/lib/gitlab/spdx/catalogue.rb index 2a34b638cf422344e1c54fbca8d2406591eb8039..d866c753503f15fd160f570f34682c557b2e155a 100644 --- a/ee/lib/gitlab/spdx/catalogue.rb +++ b/ee/lib/gitlab/spdx/catalogue.rb @@ -32,7 +32,11 @@ module Gitlab end def map_from(license_hash) - ::Gitlab::SPDX::License.new(id: license_hash[:licenseId], name: license_hash[:name]) + ::Gitlab::SPDX::License.new( + id: license_hash[:licenseId], + name: license_hash[:name], + deprecated: license_hash[:isDeprecatedLicenseId] + ) end end end diff --git a/ee/lib/gitlab/spdx/license.rb b/ee/lib/gitlab/spdx/license.rb index a969b6e856931adfc87722759e51f78c17d4ce27..2f669627b8eb6ffbcdd20b4ae330af75e7fb0932 100644 --- a/ee/lib/gitlab/spdx/license.rb +++ b/ee/lib/gitlab/spdx/license.rb @@ -2,6 +2,6 @@ module Gitlab module SPDX - License = Struct.new(:id, :name, keyword_init: true) + License = Struct.new(:id, :name, :deprecated, keyword_init: true) end end diff --git a/ee/spec/factories/spdx_license.rb b/ee/spec/factories/spdx_license.rb index 14b62d35758786aed7e52e896b1a1d6d93f91bd7..f507eb116e72308cd5085a71a27de97a1ada0c4e 100644 --- a/ee/spec/factories/spdx_license.rb +++ b/ee/spec/factories/spdx_license.rb @@ -4,6 +4,7 @@ FactoryBot.define do factory :spdx_license, class: '::Gitlab::SPDX::License' do id { |n| "License-#{n}" } name { |n| "License #{n}" } + deprecated { false } trait :apache_1 do id { 'Apache-1.0' } @@ -19,5 +20,16 @@ FactoryBot.define do id { 'MIT' } name { 'MIT License' } end + + trait :deprecated_gpl_v1 do + id { 'GPL-1.0' } + name { 'GNU General Public License v1.0 only' } + deprecated { true } + end + + trait :gpl_v1 do + id { 'GPL-1.0-only' } + name { 'GNU General Public License v1.0 only' } + end end end diff --git a/ee/spec/lib/gitlab/spdx/catalogue_spec.rb b/ee/spec/lib/gitlab/spdx/catalogue_spec.rb index 3fa31eb6a2a2d68ca930fb47e68e8449ce7585ba..b7942bdb66c0c6b9d3298cdd53ba114ad4d06668 100644 --- a/ee/spec/lib/gitlab/spdx/catalogue_spec.rb +++ b/ee/spec/lib/gitlab/spdx/catalogue_spec.rb @@ -19,6 +19,16 @@ RSpec.describe Gitlab::SPDX::Catalogue do it { expect(subject.map(&:id)).to match_array(catalogue_hash[:licenses].map { |x| x[:licenseId] }) } it { expect(subject.map(&:name)).to match_array(catalogue_hash[:licenses].map { |x| x[:name] }) } + specify do + deprecrated_gpl = subject.find { |license| license.id == 'GPL-1.0' } + expect(deprecrated_gpl.deprecated).to be_truthy + end + + specify do + gpl = subject.find { |license| license.id == 'GPL-1.0-only' } + expect(gpl.deprecated).to be_falsey + end + context "when some of the licenses are missing an identifier" do let(:catalogue_hash) do { diff --git a/ee/spec/workers/import_software_licenses_worker_spec.rb b/ee/spec/workers/import_software_licenses_worker_spec.rb index 8797831911f9419636eb8803f9a7fc1180382717..46e50ed6635b8a167873002200cbc251061f0b10 100644 --- a/ee/spec/workers/import_software_licenses_worker_spec.rb +++ b/ee/spec/workers/import_software_licenses_worker_spec.rb @@ -8,15 +8,15 @@ describe ImportSoftwareLicensesWorker do let(:spdx_bsd_license) { build(:spdx_license, :bsd) } let(:spdx_mit_license) { build(:spdx_license, :mit) } - before do - allow(Gitlab::SPDX::Catalogue).to receive(:latest).and_return(catalogue) - allow(catalogue).to receive(:each) - .and_yield(spdx_apache_license) - .and_yield(spdx_bsd_license) - .and_yield(spdx_mit_license) - end - describe '#perform' do + before do + allow(Gitlab::SPDX::Catalogue).to receive(:latest).and_return(catalogue) + allow(catalogue).to receive(:each) + .and_yield(spdx_apache_license) + .and_yield(spdx_bsd_license) + .and_yield(spdx_mit_license) + end + let!(:apache) { create(:software_license, name: spdx_apache_license.name, spdx_identifier: nil) } let!(:mit) { create(:software_license, name: spdx_mit_license.name, spdx_identifier: spdx_mit_license.id) } @@ -49,5 +49,21 @@ describe ImportSoftwareLicensesWorker do it { expect(apache.reload.spdx_identifier).to eql(spdx_apache_license.id) } it { expect(SoftwareLicense.pluck(:spdx_identifier)).to contain_exactly(spdx_apache_license.id, spdx_mit_license.id, spdx_bsd_license.id) } end + + context 'when a license is deprecated' do + let!(:gpl) { create(:software_license, name: 'GNU General Public License v1.0 only', spdx_identifier: 'GPL-1.0') } + let(:spdx_old_gpl_license) { build(:spdx_license, :deprecated_gpl_v1) } + let(:spdx_new_gpl_license) { build(:spdx_license, :gpl_v1) } + + before do + allow(catalogue).to receive(:each) + .and_yield(spdx_new_gpl_license) + .and_yield(spdx_old_gpl_license) + + subject.perform + end + + it { expect(gpl.reload.spdx_identifier).to eql('GPL-1.0-only') } + end end end