| 
									
										
										
										
											2020-10-10 14:16:11 +02:00
										 |  |  | # typed: false | 
					
						
							| 
									
										
										
										
											2019-04-19 15:38:03 +09:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-27 23:47:00 +01:00
										 |  |  | require "dev-cmd/audit" | 
					
						
							|  |  |  | require "formulary" | 
					
						
							| 
									
										
										
										
											2019-03-27 11:49:56 +00:00
										 |  |  | require "cmd/shared_examples/args_parse" | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  | require "utils/spdx" | 
					
						
							| 
									
										
										
										
											2019-03-27 11:49:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-01 16:14:25 -05:00
										 |  |  | describe "brew audit" do | 
					
						
							| 
									
										
										
										
											2019-03-27 11:49:56 +00:00
										 |  |  |   it_behaves_like "parseable arguments" | 
					
						
							|  |  |  | end | 
					
						
							| 
									
										
										
										
											2017-02-27 23:47:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-23 18:56:22 +01:00
										 |  |  | module Count | 
					
						
							|  |  |  |   def self.increment | 
					
						
							|  |  |  |     @count ||= 0
 | 
					
						
							| 
									
										
										
										
											2018-06-02 03:39:23 +02:00
										 |  |  |     @count += 1
 | 
					
						
							| 
									
										
										
										
											2017-04-23 18:56:22 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  | module Homebrew | 
					
						
							| 
									
										
										
										
											2020-11-18 10:25:12 +01:00
										 |  |  |   describe FormulaTextAuditor do | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |     alias_matcher :have_data, :be_data | 
					
						
							|  |  |  |     alias_matcher :have_end, :be_end | 
					
						
							|  |  |  |     alias_matcher :have_trailing_newline, :be_trailing_newline | 
					
						
							| 
									
										
										
										
											2017-05-09 23:00:51 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |     let(:dir) { mktmpdir } | 
					
						
							| 
									
										
										
										
											2017-02-27 23:47:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |     def formula_text(name, body = nil, options = {}) | 
					
						
							|  |  |  |       path = dir/"#{name}.rb" | 
					
						
							| 
									
										
										
										
											2017-02-27 23:47:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-11 15:17:40 +02:00
										 |  |  |       path.write <<~RUBY | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |         class #{Formulary.class_s(name)} < Formula | 
					
						
							|  |  |  |           #{body} | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |         #{options[:patch]} | 
					
						
							| 
									
										
										
										
											2018-07-11 15:17:40 +02:00
										 |  |  |       RUBY | 
					
						
							| 
									
										
										
										
											2017-02-27 23:47:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |       described_class.new(path) | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2017-02-27 23:47:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |     specify "simple valid Formula" do | 
					
						
							| 
									
										
										
										
											2018-07-11 15:17:40 +02:00
										 |  |  |       ft = formula_text "valid", <<~RUBY | 
					
						
							| 
									
										
										
										
											2018-11-28 20:51:55 +01:00
										 |  |  |         url "https://www.brew.sh/valid-1.0.tar.gz" | 
					
						
							| 
									
										
										
										
											2018-07-11 15:17:40 +02:00
										 |  |  |       RUBY | 
					
						
							| 
									
										
										
										
											2017-02-27 23:47:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |       expect(ft).to have_trailing_newline | 
					
						
							| 
									
										
										
										
											2017-02-27 23:47:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |       expect(ft =~ /\burl\b/).to be_truthy | 
					
						
							|  |  |  |       expect(ft.line_number(/desc/)).to be nil | 
					
						
							|  |  |  |       expect(ft.line_number(/\burl\b/)).to eq(2) | 
					
						
							|  |  |  |       expect(ft).to include("Valid") | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2017-02-27 23:47:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |     specify "#trailing_newline?" do | 
					
						
							|  |  |  |       ft = formula_text "newline" | 
					
						
							|  |  |  |       expect(ft).to have_trailing_newline | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2017-02-27 23:47:00 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |   describe FormulaAuditor do | 
					
						
							| 
									
										
										
										
											2021-06-18 17:26:57 +01:00
										 |  |  |     def formula_auditor(name, text, options = {}) | 
					
						
							|  |  |  |       path = Pathname.new "#{dir}/#{name}.rb" | 
					
						
							|  |  |  |       path.open("w") do |f| | 
					
						
							|  |  |  |         f.write text | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2017-02-28 13:42:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-18 17:26:57 +01:00
										 |  |  |       described_class.new(Formulary.factory(path), options) | 
					
						
							| 
									
										
										
										
											2017-02-28 13:42:52 +01:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |     let(:dir) { mktmpdir } | 
					
						
							| 
									
										
										
										
											2017-02-28 13:42:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |     describe "#problems" do | 
					
						
							|  |  |  |       it "is empty by default" do | 
					
						
							| 
									
										
										
										
											2018-07-11 15:17:40 +02:00
										 |  |  |         fa = formula_auditor "foo", <<~RUBY | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           class Foo < Formula | 
					
						
							| 
									
										
										
										
											2018-11-28 20:51:55 +01:00
										 |  |  |             url "https://brew.sh/foo-1.0.tgz" | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           end | 
					
						
							| 
									
										
										
										
											2018-07-11 15:17:40 +02:00
										 |  |  |         RUBY | 
					
						
							| 
									
										
										
										
											2017-02-28 13:42:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |         expect(fa.problems).to be_empty | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2017-02-28 13:42:52 +01:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-17 03:39:00 +08:00
										 |  |  |     describe "#audit_license" do | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |       let(:spdx_license_data) { SPDX.license_data } | 
					
						
							|  |  |  |       let(:spdx_exception_data) { SPDX.exception_data } | 
					
						
							| 
									
										
										
										
											2020-06-30 23:25:51 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-07 13:39:27 -04:00
										 |  |  |       let(:deprecated_spdx_id) { "GPL-1.0" } | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |       let(:license_all_custom_id) { 'all_of: ["MIT", "zzz"]' } | 
					
						
							|  |  |  |       let(:deprecated_spdx_exception) { "Nokia-Qt-exception-1.1" } | 
					
						
							|  |  |  |       let(:license_any) { 'any_of: ["0BSD", "GPL-3.0-only"]' } | 
					
						
							|  |  |  |       let(:license_any_with_plus) { 'any_of: ["0BSD+", "GPL-3.0-only"]' } | 
					
						
							|  |  |  |       let(:license_nested_conditions) { 'any_of: ["0BSD", { all_of: ["GPL-3.0-only", "MIT"] }]' } | 
					
						
							|  |  |  |       let(:license_any_mismatch) { 'any_of: ["0BSD", "MIT"]' } | 
					
						
							|  |  |  |       let(:license_any_nonstandard) { 'any_of: ["0BSD", "zzz", "MIT"]' } | 
					
						
							|  |  |  |       let(:license_any_deprecated) { 'any_of: ["0BSD", "GPL-1.0", "MIT"]' } | 
					
						
							| 
									
										
										
										
											2020-06-17 03:39:00 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-18 00:45:13 +08:00
										 |  |  |       it "does not check if the formula is not a new formula" do | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |         fa = formula_auditor "foo", <<~RUBY, new_formula: false | 
					
						
							| 
									
										
										
										
											2020-06-18 00:45:13 +08:00
										 |  |  |           class Foo < Formula | 
					
						
							|  |  |  |             url "https://brew.sh/foo-1.0.tgz" | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_license | 
					
						
							|  |  |  |         expect(fa.problems).to be_empty | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-02 09:04:58 +01:00
										 |  |  |       it "detects no license info" do | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |         fa = formula_auditor "foo", <<~RUBY, spdx_license_data: spdx_license_data, new_formula: true, core_tap: true | 
					
						
							| 
									
										
										
										
											2020-07-02 09:04:58 +01:00
										 |  |  |           class Foo < Formula | 
					
						
							|  |  |  |             url "https://brew.sh/foo-1.0.tgz" | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_license | 
					
						
							| 
									
										
										
										
											2020-09-10 22:00:18 +02:00
										 |  |  |         expect(fa.problems.first[:message]).to match "Formulae in homebrew/core must specify a license." | 
					
						
							| 
									
										
										
										
											2020-07-02 09:04:58 +01:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-17 03:39:00 +08:00
										 |  |  |       it "detects if license is not a standard spdx-id" do | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |         fa = formula_auditor "foo", <<~RUBY, spdx_license_data: spdx_license_data, new_formula: true | 
					
						
							| 
									
										
										
										
											2020-06-17 03:39:00 +08:00
										 |  |  |           class Foo < Formula | 
					
						
							|  |  |  |             url "https://brew.sh/foo-1.0.tgz" | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |             license "zzz" | 
					
						
							| 
									
										
										
										
											2020-06-17 03:39:00 +08:00
										 |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_license | 
					
						
							| 
									
										
										
										
											2020-09-10 22:00:18 +02:00
										 |  |  |         expect(fa.problems.first[:message]).to match <<~EOS | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |           Formula foo contains non-standard SPDX licenses: ["zzz"]. | 
					
						
							|  |  |  |           For a list of valid licenses check: https://spdx.org/licenses/ | 
					
						
							|  |  |  |         EOS | 
					
						
							| 
									
										
										
										
											2020-06-17 03:39:00 +08:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-07 13:39:27 -04:00
										 |  |  |       it "detects if license is a deprecated spdx-id" do | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |         fa = formula_auditor "foo", <<~RUBY, spdx_license_data: spdx_license_data, new_formula: true, strict: true | 
					
						
							| 
									
										
										
										
											2020-08-07 13:39:27 -04:00
										 |  |  |           class Foo < Formula | 
					
						
							|  |  |  |             url "https://brew.sh/foo-1.0.tgz" | 
					
						
							|  |  |  |             license "#{deprecated_spdx_id}" | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_license | 
					
						
							| 
									
										
										
										
											2020-09-10 22:00:18 +02:00
										 |  |  |         expect(fa.problems.first[:message]).to match <<~EOS | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |           Formula foo contains deprecated SPDX licenses: ["GPL-1.0"]. | 
					
						
							|  |  |  |           You may need to add `-only` or `-or-later` for GNU licenses (e.g. `GPL`, `LGPL`, `AGPL`, `GFDL`). | 
					
						
							|  |  |  |           For a list of valid licenses check: https://spdx.org/licenses/ | 
					
						
							|  |  |  |         EOS | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "detects if license with AND contains a non-standard spdx-id" do | 
					
						
							|  |  |  |         fa = formula_auditor "foo", <<~RUBY, spdx_license_data: spdx_license_data, new_formula: true | 
					
						
							|  |  |  |           class Foo < Formula | 
					
						
							|  |  |  |             url "https://brew.sh/foo-1.0.tgz" | 
					
						
							|  |  |  |             license #{license_all_custom_id} | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_license | 
					
						
							| 
									
										
										
										
											2020-09-10 22:00:18 +02:00
										 |  |  |         expect(fa.problems.first[:message]).to match <<~EOS | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |           Formula foo contains non-standard SPDX licenses: ["zzz"]. | 
					
						
							|  |  |  |           For a list of valid licenses check: https://spdx.org/licenses/ | 
					
						
							|  |  |  |         EOS | 
					
						
							| 
									
										
										
										
											2020-08-07 13:39:27 -04:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-24 00:10:47 +08:00
										 |  |  |       it "detects if license array contains a non-standard spdx-id" do | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |         fa = formula_auditor "foo", <<~RUBY, spdx_license_data: spdx_license_data, new_formula: true | 
					
						
							| 
									
										
										
										
											2020-07-24 00:10:47 +08:00
										 |  |  |           class Foo < Formula | 
					
						
							|  |  |  |             url "https://brew.sh/foo-1.0.tgz" | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |             license #{license_any_nonstandard} | 
					
						
							| 
									
										
										
										
											2020-07-24 00:10:47 +08:00
										 |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_license | 
					
						
							| 
									
										
										
										
											2020-09-10 22:00:18 +02:00
										 |  |  |         expect(fa.problems.first[:message]).to match <<~EOS | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |           Formula foo contains non-standard SPDX licenses: ["zzz"]. | 
					
						
							|  |  |  |           For a list of valid licenses check: https://spdx.org/licenses/ | 
					
						
							|  |  |  |         EOS | 
					
						
							| 
									
										
										
										
											2020-07-24 00:10:47 +08:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-07 13:39:27 -04:00
										 |  |  |       it "detects if license array contains a deprecated spdx-id" do | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |         fa = formula_auditor "foo", <<~RUBY, spdx_license_data: spdx_license_data, new_formula: true, strict: true | 
					
						
							| 
									
										
										
										
											2020-08-07 13:39:27 -04:00
										 |  |  |           class Foo < Formula | 
					
						
							|  |  |  |             url "https://brew.sh/foo-1.0.tgz" | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |             license #{license_any_deprecated} | 
					
						
							| 
									
										
										
										
											2020-08-07 13:39:27 -04:00
										 |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_license | 
					
						
							| 
									
										
										
										
											2020-09-10 22:00:18 +02:00
										 |  |  |         expect(fa.problems.first[:message]).to match <<~EOS | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |           Formula foo contains deprecated SPDX licenses: ["GPL-1.0"]. | 
					
						
							|  |  |  |           You may need to add `-only` or `-or-later` for GNU licenses (e.g. `GPL`, `LGPL`, `AGPL`, `GFDL`). | 
					
						
							|  |  |  |           For a list of valid licenses check: https://spdx.org/licenses/ | 
					
						
							|  |  |  |         EOS | 
					
						
							| 
									
										
										
										
											2020-08-07 13:39:27 -04:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-17 04:16:01 +08:00
										 |  |  |       it "verifies that a license info is a standard spdx id" do | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |         fa = formula_auditor "foo", <<~RUBY, spdx_license_data: spdx_license_data, new_formula: true | 
					
						
							| 
									
										
										
										
											2020-06-17 03:39:00 +08:00
										 |  |  |           class Foo < Formula | 
					
						
							|  |  |  |             url "https://brew.sh/foo-1.0.tgz" | 
					
						
							|  |  |  |             license "0BSD" | 
					
						
							|  |  |  |           end | 
					
						
							| 
									
										
										
										
											2020-06-17 04:16:01 +08:00
										 |  |  |         RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_license | 
					
						
							|  |  |  |         expect(fa.problems).to be_empty | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |       it "verifies that a license info with plus is a standard spdx id" do | 
					
						
							|  |  |  |         fa = formula_auditor "foo", <<~RUBY, spdx_license_data: spdx_license_data, new_formula: true | 
					
						
							|  |  |  |           class Foo < Formula | 
					
						
							|  |  |  |             url "https://brew.sh/foo-1.0.tgz" | 
					
						
							|  |  |  |             license "0BSD+" | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_license | 
					
						
							|  |  |  |         expect(fa.problems).to be_empty | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "allows :public_domain license" do | 
					
						
							|  |  |  |         fa = formula_auditor "foo", <<~RUBY, spdx_license_data: spdx_license_data, new_formula: true | 
					
						
							|  |  |  |           class Foo < Formula | 
					
						
							|  |  |  |             url "https://brew.sh/foo-1.0.tgz" | 
					
						
							|  |  |  |             license :public_domain | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_license | 
					
						
							|  |  |  |         expect(fa.problems).to be_empty | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "verifies that a license info with multiple licenses are standard spdx ids" do | 
					
						
							|  |  |  |         fa = formula_auditor "foo", <<~RUBY, spdx_license_data: spdx_license_data, new_formula: true | 
					
						
							|  |  |  |           class Foo < Formula | 
					
						
							|  |  |  |             url "https://brew.sh/foo-1.0.tgz" | 
					
						
							|  |  |  |             license any_of: ["0BSD", "MIT"] | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_license | 
					
						
							|  |  |  |         expect(fa.problems).to be_empty | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "verifies that a license info with exceptions are standard spdx ids" do | 
					
						
							|  |  |  |         formula_text = <<~RUBY | 
					
						
							|  |  |  |           class Foo < Formula | 
					
						
							|  |  |  |             url "https://brew.sh/foo-1.0.tgz" | 
					
						
							|  |  |  |             license "Apache-2.0" => { with: "LLVM-exception" } | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  |         fa = formula_auditor "foo", formula_text, new_formula: true, | 
					
						
							|  |  |  |                              spdx_license_data: spdx_license_data, spdx_exception_data: spdx_exception_data | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_license | 
					
						
							|  |  |  |         expect(fa.problems).to be_empty | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-24 00:10:47 +08:00
										 |  |  |       it "verifies that a license array contains only standard spdx id" do | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |         fa = formula_auditor "foo", <<~RUBY, spdx_license_data: spdx_license_data, new_formula: true | 
					
						
							| 
									
										
										
										
											2020-07-24 00:10:47 +08:00
										 |  |  |           class Foo < Formula | 
					
						
							|  |  |  |             url "https://brew.sh/foo-1.0.tgz" | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |             license #{license_any} | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_license | 
					
						
							|  |  |  |         expect(fa.problems).to be_empty | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "verifies that a license array contains only standard spdx id with plus" do | 
					
						
							|  |  |  |         fa = formula_auditor "foo", <<~RUBY, spdx_license_data: spdx_license_data, new_formula: true | 
					
						
							|  |  |  |           class Foo < Formula | 
					
						
							|  |  |  |             url "https://brew.sh/foo-1.0.tgz" | 
					
						
							|  |  |  |             license #{license_any_with_plus} | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_license | 
					
						
							|  |  |  |         expect(fa.problems).to be_empty | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "verifies that a license array with AND contains only standard spdx ids" do | 
					
						
							|  |  |  |         fa = formula_auditor "foo", <<~RUBY, spdx_license_data: spdx_license_data, new_formula: true | 
					
						
							|  |  |  |           class Foo < Formula | 
					
						
							|  |  |  |             url "https://brew.sh/foo-1.0.tgz" | 
					
						
							|  |  |  |             license #{license_nested_conditions} | 
					
						
							| 
									
										
										
										
											2020-07-24 00:10:47 +08:00
										 |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_license | 
					
						
							|  |  |  |         expect(fa.problems).to be_empty | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-17 05:19:38 +08:00
										 |  |  |       it "checks online and verifies that a standard license id is the same "\ | 
					
						
							| 
									
										
										
										
											2021-07-06 23:44:09 +05:30
										 |  |  |          "as what is indicated on its Github repo", :needs_network do | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |         formula_text = <<~RUBY | 
					
						
							| 
									
										
										
										
											2020-06-17 04:16:01 +08:00
										 |  |  |           class Cask < Formula | 
					
						
							| 
									
										
										
										
											2020-06-17 22:13:04 +08:00
										 |  |  |             url "https://github.com/cask/cask/archive/v0.8.4.tar.gz" | 
					
						
							|  |  |  |             head "https://github.com/cask/cask.git" | 
					
						
							|  |  |  |             license "GPL-3.0" | 
					
						
							| 
									
										
										
										
											2020-06-17 04:16:01 +08:00
										 |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |         fa = formula_auditor "cask", formula_text, spdx_license_data: spdx_license_data, | 
					
						
							|  |  |  |                              online: true, core_tap: true, new_formula: true | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_license | 
					
						
							|  |  |  |         expect(fa.problems).to be_empty | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "checks online and verifies that a standard license id with AND is the same "\ | 
					
						
							| 
									
										
										
										
											2021-07-06 23:44:09 +05:30
										 |  |  |          "as what is indicated on its Github repo", :needs_network do | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |         formula_text = <<~RUBY | 
					
						
							|  |  |  |           class Cask < Formula | 
					
						
							|  |  |  |             url "https://github.com/cask/cask/archive/v0.8.4.tar.gz" | 
					
						
							|  |  |  |             head "https://github.com/cask/cask.git" | 
					
						
							|  |  |  |             license all_of: ["GPL-3.0-or-later", "MIT"] | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  |         fa = formula_auditor "cask", formula_text, spdx_license_data: spdx_license_data, | 
					
						
							|  |  |  |                              online: true, core_tap: true, new_formula: true | 
					
						
							| 
									
										
										
										
											2020-06-17 04:16:01 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_license | 
					
						
							| 
									
										
										
										
											2020-06-25 05:46:18 +08:00
										 |  |  |         expect(fa.problems).to be_empty | 
					
						
							| 
									
										
										
										
											2020-06-17 04:16:01 +08:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2020-06-17 03:39:00 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |       it "checks online and verifies that a standard license id with WITH is the same "\ | 
					
						
							| 
									
										
										
										
											2021-07-06 23:44:09 +05:30
										 |  |  |          "as what is indicated on its Github repo", :needs_network do | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |         formula_text = <<~RUBY | 
					
						
							|  |  |  |           class Cask < Formula | 
					
						
							|  |  |  |             url "https://github.com/cask/cask/archive/v0.8.4.tar.gz" | 
					
						
							|  |  |  |             head "https://github.com/cask/cask.git" | 
					
						
							|  |  |  |             license "GPL-3.0-or-later" => { with: "LLVM-exception" } | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  |         fa = formula_auditor "cask", formula_text, online: true, core_tap: true, new_formula: true, | 
					
						
							|  |  |  |                              spdx_license_data: spdx_license_data, spdx_exception_data: spdx_exception_data | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_license | 
					
						
							|  |  |  |         expect(fa.problems).to be_empty | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-02 10:22:28 +01:00
										 |  |  |       it "verifies that a license exception has standard spdx ids", :needs_network do | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |         formula_text = <<~RUBY | 
					
						
							|  |  |  |           class Cask < Formula | 
					
						
							|  |  |  |             url "https://github.com/cask/cask/archive/v0.8.4.tar.gz" | 
					
						
							|  |  |  |             head "https://github.com/cask/cask.git" | 
					
						
							|  |  |  |             license "GPL-3.0-or-later" => { with: "zzz" } | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  |         fa = formula_auditor "cask", formula_text, core_tap: true, new_formula: true, | 
					
						
							|  |  |  |                              spdx_license_data: spdx_license_data, spdx_exception_data: spdx_exception_data | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_license | 
					
						
							| 
									
										
										
										
											2020-09-10 22:00:18 +02:00
										 |  |  |         expect(fa.problems.first[:message]).to match <<~EOS | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |           Formula cask contains invalid or deprecated SPDX license exceptions: ["zzz"]. | 
					
						
							|  |  |  |           For a list of valid license exceptions check: | 
					
						
							| 
									
										
										
										
											2020-09-05 10:37:14 -04:00
										 |  |  |             https://spdx.org/licenses/exceptions-index.html | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |         EOS | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-02 10:22:28 +01:00
										 |  |  |       it "verifies that a license exception has non-deprecated spdx ids", :needs_network do | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |         formula_text = <<~RUBY | 
					
						
							|  |  |  |           class Cask < Formula | 
					
						
							|  |  |  |             url "https://github.com/cask/cask/archive/v0.8.4.tar.gz" | 
					
						
							|  |  |  |             head "https://github.com/cask/cask.git" | 
					
						
							|  |  |  |             license "GPL-3.0-or-later" => { with: "#{deprecated_spdx_exception}" } | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  |         fa = formula_auditor "cask", formula_text, core_tap: true, new_formula: true, | 
					
						
							|  |  |  |                              spdx_license_data: spdx_license_data, spdx_exception_data: spdx_exception_data | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_license | 
					
						
							| 
									
										
										
										
											2020-09-10 22:00:18 +02:00
										 |  |  |         expect(fa.problems.first[:message]).to match <<~EOS | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |           Formula cask contains invalid or deprecated SPDX license exceptions: ["#{deprecated_spdx_exception}"]. | 
					
						
							|  |  |  |           For a list of valid license exceptions check: | 
					
						
							| 
									
										
										
										
											2020-09-05 10:37:14 -04:00
										 |  |  |             https://spdx.org/licenses/exceptions-index.html | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |         EOS | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-05 20:26:13 +10:00
										 |  |  |       it "checks online and verifies that a standard license id is in the same exempted license group" \ | 
					
						
							| 
									
										
										
										
											2020-12-02 10:22:28 +01:00
										 |  |  |          "as what is indicated on its GitHub repo", :needs_network do | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |         fa = formula_auditor "cask", <<~RUBY, spdx_license_data: spdx_license_data, online: true, new_formula: true | 
					
						
							| 
									
										
										
										
											2020-08-04 20:42:54 +10:00
										 |  |  |           class Cask < Formula | 
					
						
							|  |  |  |             url "https://github.com/cask/cask/archive/v0.8.4.tar.gz" | 
					
						
							|  |  |  |             head "https://github.com/cask/cask.git" | 
					
						
							|  |  |  |             license "GPL-3.0-or-later" | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_license | 
					
						
							|  |  |  |         expect(fa.problems).to be_empty | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-05 20:26:13 +10:00
										 |  |  |       it "checks online and verifies that a standard license array is in the same exempted license group" \ | 
					
						
							| 
									
										
										
										
											2020-12-02 10:22:28 +01:00
										 |  |  |          "as what is indicated on its GitHub repo", :needs_network do | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |         fa = formula_auditor "cask", <<~RUBY, spdx_license_data: spdx_license_data, online: true, new_formula: true | 
					
						
							| 
									
										
										
										
											2020-08-04 20:42:54 +10:00
										 |  |  |           class Cask < Formula | 
					
						
							|  |  |  |             url "https://github.com/cask/cask/archive/v0.8.4.tar.gz" | 
					
						
							|  |  |  |             head "https://github.com/cask/cask.git" | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |             license any_of: ["GPL-3.0-or-later", "MIT"] | 
					
						
							| 
									
										
										
										
											2020-08-04 20:42:54 +10:00
										 |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_license | 
					
						
							|  |  |  |         expect(fa.problems).to be_empty | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-17 05:19:38 +08:00
										 |  |  |       it "checks online and detects that a formula-specified license is not "\ | 
					
						
							| 
									
										
										
										
											2021-07-06 23:44:09 +05:30
										 |  |  |          "the same as what is indicated on its Github repository", :needs_network do | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |         formula_text = <<~RUBY | 
					
						
							| 
									
										
										
										
											2020-06-17 04:16:01 +08:00
										 |  |  |           class Cask < Formula | 
					
						
							| 
									
										
										
										
											2020-06-17 22:13:04 +08:00
										 |  |  |             url "https://github.com/cask/cask/archive/v0.8.4.tar.gz" | 
					
						
							|  |  |  |             head "https://github.com/cask/cask.git" | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |             license "0BSD" | 
					
						
							| 
									
										
										
										
											2020-06-17 04:16:01 +08:00
										 |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |         fa = formula_auditor "cask", formula_text, spdx_license_data: spdx_license_data, | 
					
						
							|  |  |  |                              online: true, core_tap: true, new_formula: true | 
					
						
							| 
									
										
										
										
											2020-06-17 04:16:01 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_license | 
					
						
							| 
									
										
										
										
											2020-09-10 22:00:18 +02:00
										 |  |  |         expect(fa.problems.first[:message]) | 
					
						
							|  |  |  |           .to eq 'Formula license ["0BSD"] does not match GitHub license ["GPL-3.0"].' | 
					
						
							| 
									
										
										
										
											2020-06-17 04:16:01 +08:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2020-07-24 00:10:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-18 11:54:38 -05:00
										 |  |  |       it "allows a formula-specified license that differs from its GitHub "\ | 
					
						
							| 
									
										
										
										
											2020-12-02 10:22:28 +01:00
										 |  |  |          "repository for formulae on the mismatched license allowlist", :needs_network do | 
					
						
							| 
									
										
										
										
											2020-11-17 17:57:48 -05:00
										 |  |  |         formula_text = <<~RUBY | 
					
						
							|  |  |  |           class Cask < Formula | 
					
						
							|  |  |  |             url "https://github.com/cask/cask/archive/v0.8.4.tar.gz" | 
					
						
							|  |  |  |             head "https://github.com/cask/cask.git" | 
					
						
							|  |  |  |             license "0BSD" | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  |         fa = formula_auditor "cask", formula_text, spdx_license_data: spdx_license_data, | 
					
						
							|  |  |  |                              online: true, core_tap: true, new_formula: true, | 
					
						
							|  |  |  |                              tap_audit_exceptions: { permitted_formula_license_mismatches: ["cask"] } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_license | 
					
						
							|  |  |  |         expect(fa.problems).to be_empty | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-24 00:10:47 +08:00
										 |  |  |       it "checks online and detects that an array of license does not contain "\ | 
					
						
							| 
									
										
										
										
											2021-07-06 23:44:09 +05:30
										 |  |  |          "what is indicated on its Github repository", :needs_network do | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |         formula_text = <<~RUBY | 
					
						
							| 
									
										
										
										
											2020-07-24 00:10:47 +08:00
										 |  |  |           class Cask < Formula | 
					
						
							|  |  |  |             url "https://github.com/cask/cask/archive/v0.8.4.tar.gz" | 
					
						
							|  |  |  |             head "https://github.com/cask/cask.git" | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |             license #{license_any_mismatch} | 
					
						
							| 
									
										
										
										
											2020-07-24 00:10:47 +08:00
										 |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |         fa = formula_auditor "cask", formula_text, spdx_license_data: spdx_license_data, | 
					
						
							|  |  |  |                              online: true, core_tap: true, new_formula: true | 
					
						
							| 
									
										
										
										
											2020-07-24 00:10:47 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_license | 
					
						
							| 
									
										
										
										
											2020-09-10 22:00:18 +02:00
										 |  |  |         expect(fa.problems.first[:message]).to match "Formula license [\"0BSD\", \"MIT\"] "\ | 
					
						
							| 
									
										
										
										
											2021-07-06 23:44:09 +05:30
										 |  |  |                                                      "does not match GitHub license [\"GPL-3.0\"]." | 
					
						
							| 
									
										
										
										
											2020-07-24 00:10:47 +08:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "checks online and verifies that an array of license contains "\ | 
					
						
							| 
									
										
										
										
											2021-07-06 23:44:09 +05:30
										 |  |  |          "what is indicated on its Github repository", :needs_network do | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |         formula_text = <<~RUBY | 
					
						
							| 
									
										
										
										
											2020-07-24 00:10:47 +08:00
										 |  |  |           class Cask < Formula | 
					
						
							|  |  |  |             url "https://github.com/cask/cask/archive/v0.8.4.tar.gz" | 
					
						
							|  |  |  |             head "https://github.com/cask/cask.git" | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |             license #{license_any} | 
					
						
							| 
									
										
										
										
											2020-07-24 00:10:47 +08:00
										 |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							| 
									
										
										
										
											2020-08-18 11:00:17 -04:00
										 |  |  |         fa = formula_auditor "cask", formula_text, spdx_license_data: spdx_license_data, | 
					
						
							|  |  |  |                              online: true, core_tap: true, new_formula: true | 
					
						
							| 
									
										
										
										
											2020-07-24 00:10:47 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_license | 
					
						
							|  |  |  |         expect(fa.problems).to be_empty | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2020-06-17 03:39:00 +08:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |     describe "#audit_file" do | 
					
						
							|  |  |  |       specify "no issue" do | 
					
						
							| 
									
										
										
										
											2018-07-11 15:17:40 +02:00
										 |  |  |         fa = formula_auditor "foo", <<~RUBY | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           class Foo < Formula | 
					
						
							| 
									
										
										
										
											2018-11-28 20:51:55 +01:00
										 |  |  |             url "https://brew.sh/foo-1.0.tgz" | 
					
						
							|  |  |  |             homepage "https://brew.sh" | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           end | 
					
						
							| 
									
										
										
										
											2018-07-11 15:17:40 +02:00
										 |  |  |         RUBY | 
					
						
							| 
									
										
										
										
											2017-02-28 13:42:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |         fa.audit_file | 
					
						
							| 
									
										
										
										
											2020-09-10 22:00:18 +02:00
										 |  |  |         expect(fa.problems).to be_empty | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2017-02-28 13:42:52 +01:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-27 17:45:24 -07:00
										 |  |  |     describe "#audit_formula_name" do | 
					
						
							|  |  |  |       specify "no issue" do | 
					
						
							|  |  |  |         fa = formula_auditor "foo", <<~RUBY, core_tap: true, strict: true | 
					
						
							|  |  |  |           class Foo < Formula | 
					
						
							|  |  |  |             url "https://brew.sh/foo-1.0.tgz" | 
					
						
							|  |  |  |             homepage "https://brew.sh" | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_formula_name | 
					
						
							|  |  |  |         expect(fa.problems).to be_empty | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       specify "uppercase formula name" do | 
					
						
							|  |  |  |         fa = formula_auditor "Foo", <<~RUBY | 
					
						
							|  |  |  |           class Foo < Formula | 
					
						
							|  |  |  |             url "https://brew.sh/Foo-1.0.tgz" | 
					
						
							|  |  |  |             homepage "https://brew.sh" | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_formula_name | 
					
						
							|  |  |  |         expect(fa.problems.first[:message]).to match "must not contain uppercase letters" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-13 11:25:56 +02:00
										 |  |  |     describe "#check_service_command" do | 
					
						
							|  |  |  |       specify "Not installed" do | 
					
						
							|  |  |  |         fa = formula_auditor "foo", <<~RUBY | 
					
						
							|  |  |  |           class Foo < Formula | 
					
						
							|  |  |  |             url "https://brew.sh/foo-1.0.tgz" | 
					
						
							|  |  |  |             homepage "https://brew.sh" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             service do | 
					
						
							|  |  |  |               run [] | 
					
						
							|  |  |  |             end | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expect(fa.check_service_command(fa.formula)).to match nil | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       specify "No service" do | 
					
						
							|  |  |  |         fa = formula_auditor "foo", <<~RUBY | 
					
						
							|  |  |  |           class Foo < Formula | 
					
						
							|  |  |  |             url "https://brew.sh/foo-1.0.tgz" | 
					
						
							|  |  |  |             homepage "https://brew.sh" | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         mkdir_p fa.formula.prefix | 
					
						
							|  |  |  |         expect(fa.check_service_command(fa.formula)).to match nil | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       specify "No command" do | 
					
						
							|  |  |  |         fa = formula_auditor "foo", <<~RUBY | 
					
						
							|  |  |  |           class Foo < Formula | 
					
						
							|  |  |  |             url "https://brew.sh/foo-1.0.tgz" | 
					
						
							|  |  |  |             homepage "https://brew.sh" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             service do | 
					
						
							|  |  |  |               run [] | 
					
						
							|  |  |  |             end | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         mkdir_p fa.formula.prefix | 
					
						
							|  |  |  |         expect(fa.check_service_command(fa.formula)).to match "Service command blank" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       specify "Invalid command" do | 
					
						
							|  |  |  |         fa = formula_auditor "foo", <<~RUBY | 
					
						
							|  |  |  |           class Foo < Formula | 
					
						
							|  |  |  |             url "https://brew.sh/foo-1.0.tgz" | 
					
						
							|  |  |  |             homepage "https://brew.sh" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             service do | 
					
						
							|  |  |  |               run [HOMEBREW_PREFIX/"bin/something"] | 
					
						
							|  |  |  |             end | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         mkdir_p fa.formula.prefix | 
					
						
							|  |  |  |         expect(fa.check_service_command(fa.formula)).to match "Service command does not exist" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |     describe "#audit_github_repository" do | 
					
						
							|  |  |  |       specify "#audit_github_repository when HOMEBREW_NO_GITHUB_API is set" do | 
					
						
							|  |  |  |         ENV["HOMEBREW_NO_GITHUB_API"] = "1" | 
					
						
							| 
									
										
										
										
											2017-02-28 13:42:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-11 15:17:40 +02:00
										 |  |  |         fa = formula_auditor "foo", <<~RUBY, strict: true, online: true | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           class Foo < Formula | 
					
						
							|  |  |  |             homepage "https://github.com/example/example" | 
					
						
							| 
									
										
										
										
											2018-11-28 20:51:55 +01:00
										 |  |  |             url "https://brew.sh/foo-1.0.tgz" | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           end | 
					
						
							| 
									
										
										
										
											2018-07-11 15:17:40 +02:00
										 |  |  |         RUBY | 
					
						
							| 
									
										
										
										
											2017-02-28 13:42:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |         fa.audit_github_repository | 
					
						
							| 
									
										
										
										
											2020-09-10 22:00:18 +02:00
										 |  |  |         expect(fa.problems).to be_empty | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2017-02-28 13:42:52 +01:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-20 21:52:35 +02:00
										 |  |  |     describe "#audit_github_repository_archived" do | 
					
						
							|  |  |  |       specify "#audit_github_repository_archived when HOMEBREW_NO_GITHUB_API is set" do | 
					
						
							|  |  |  |         fa = formula_auditor "foo", <<~RUBY, strict: true, online: true | 
					
						
							|  |  |  |           class Foo < Formula | 
					
						
							|  |  |  |             homepage "https://github.com/example/example" | 
					
						
							|  |  |  |             url "https://brew.sh/foo-1.0.tgz" | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_github_repository_archived | 
					
						
							| 
									
										
										
										
											2020-09-10 22:00:18 +02:00
										 |  |  |         expect(fa.problems).to be_empty | 
					
						
							| 
									
										
										
										
											2020-07-20 21:52:35 +02:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-02 14:50:02 +02:00
										 |  |  |     describe "#audit_gitlab_repository" do | 
					
						
							|  |  |  |       specify "#audit_gitlab_repository for stars, forks and creation date" do | 
					
						
							|  |  |  |         fa = formula_auditor "foo", <<~RUBY, strict: true, online: true | 
					
						
							|  |  |  |           class Foo < Formula | 
					
						
							|  |  |  |             homepage "https://gitlab.com/libtiff/libtiff" | 
					
						
							|  |  |  |             url "https://brew.sh/foo-1.0.tgz" | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_gitlab_repository | 
					
						
							| 
									
										
										
										
											2020-09-10 22:00:18 +02:00
										 |  |  |         expect(fa.problems).to be_empty | 
					
						
							| 
									
										
										
										
											2019-07-02 14:50:02 +02:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-20 21:52:35 +02:00
										 |  |  |     describe "#audit_gitlab_repository_archived" do | 
					
						
							|  |  |  |       specify "#audit gitlab repository for archived status" do | 
					
						
							|  |  |  |         fa = formula_auditor "foo", <<~RUBY, strict: true, online: true | 
					
						
							|  |  |  |           class Foo < Formula | 
					
						
							|  |  |  |             homepage "https://gitlab.com/libtiff/libtiff" | 
					
						
							|  |  |  |             url "https://brew.sh/foo-1.0.tgz" | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_gitlab_repository_archived | 
					
						
							| 
									
										
										
										
											2020-09-10 22:00:18 +02:00
										 |  |  |         expect(fa.problems).to be_empty | 
					
						
							| 
									
										
										
										
											2020-07-20 21:52:35 +02:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-05 20:27:00 +02:00
										 |  |  |     describe "#audit_bitbucket_repository" do | 
					
						
							|  |  |  |       specify "#audit_bitbucket_repository for stars, forks and creation date" do | 
					
						
							|  |  |  |         fa = formula_auditor "foo", <<~RUBY, strict: true, online: true | 
					
						
							|  |  |  |           class Foo < Formula | 
					
						
							|  |  |  |             homepage "https://bitbucket.com/libtiff/libtiff" | 
					
						
							|  |  |  |             url "https://brew.sh/foo-1.0.tgz" | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_bitbucket_repository | 
					
						
							| 
									
										
										
										
											2020-09-10 22:00:18 +02:00
										 |  |  |         expect(fa.problems).to be_empty | 
					
						
							| 
									
										
										
										
											2019-09-05 20:27:00 +02:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-17 19:16:36 -05:00
										 |  |  |     describe "#audit_specs" do | 
					
						
							|  |  |  |       let(:throttle_list) { { throttled_formulae: { "foo" => 10 } } } | 
					
						
							|  |  |  |       let(:versioned_head_spec_list) { { versioned_head_spec_allowlist: ["foo"] } } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-08 23:26:52 +00:00
										 |  |  |       it "doesn't allow to miss a checksum" do | 
					
						
							|  |  |  |         fa = formula_auditor "foo", <<~RUBY | 
					
						
							|  |  |  |           class Foo < Formula | 
					
						
							|  |  |  |             url "https://brew.sh/foo-1.0.tgz" | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_specs | 
					
						
							|  |  |  |         expect(fa.problems.first[:message]).to match "Checksum is missing" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "allows to miss a checksum for git strategy" do | 
					
						
							|  |  |  |         fa = formula_auditor "foo", <<~RUBY | 
					
						
							|  |  |  |           class Foo < Formula | 
					
						
							|  |  |  |             url "https://brew.sh/foo.git", tag: "1.0", revision: "f5e00e485e7aa4c5baa20355b27e3b84a6912790" | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_specs | 
					
						
							|  |  |  |         expect(fa.problems).to be_empty | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "allows to miss a checksum for HEAD" do | 
					
						
							|  |  |  |         fa = formula_auditor "foo", <<~RUBY | 
					
						
							|  |  |  |           class Foo < Formula | 
					
						
							|  |  |  |             url "https://brew.sh/foo-1.0.tgz" | 
					
						
							|  |  |  |             sha256 "31cccfc6630528db1c8e3a06f6decf2a370060b982841cfab2b8677400a5092e" | 
					
						
							|  |  |  |             head "https://brew.sh/foo.tgz" | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_specs | 
					
						
							|  |  |  |         expect(fa.problems).to be_empty | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-17 19:16:36 -05:00
										 |  |  |       it "allows versions with no throttle rate" do | 
					
						
							|  |  |  |         fa = formula_auditor "bar", <<~RUBY, core_tap: true, tap_audit_exceptions: throttle_list | 
					
						
							|  |  |  |           class Bar < Formula | 
					
						
							|  |  |  |             url "https://brew.sh/foo-1.0.1.tgz" | 
					
						
							| 
									
										
										
										
											2020-12-08 23:26:52 +00:00
										 |  |  |             sha256 "31cccfc6630528db1c8e3a06f6decf2a370060b982841cfab2b8677400a5092e" | 
					
						
							| 
									
										
										
										
											2020-11-17 19:16:36 -05:00
										 |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_specs | 
					
						
							|  |  |  |         expect(fa.problems).to be_empty | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "allows major/minor versions with throttle rate" do | 
					
						
							|  |  |  |         fa = formula_auditor "foo", <<~RUBY, core_tap: true, tap_audit_exceptions: throttle_list | 
					
						
							|  |  |  |           class Foo < Formula | 
					
						
							|  |  |  |             url "https://brew.sh/foo-1.0.0.tgz" | 
					
						
							| 
									
										
										
										
											2020-12-08 23:26:52 +00:00
										 |  |  |             sha256 "31cccfc6630528db1c8e3a06f6decf2a370060b982841cfab2b8677400a5092e" | 
					
						
							| 
									
										
										
										
											2020-11-17 19:16:36 -05:00
										 |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_specs | 
					
						
							|  |  |  |         expect(fa.problems).to be_empty | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "allows patch versions to be multiples of the throttle rate" do | 
					
						
							|  |  |  |         fa = formula_auditor "foo", <<~RUBY, core_tap: true, tap_audit_exceptions: throttle_list | 
					
						
							|  |  |  |           class Foo < Formula | 
					
						
							|  |  |  |             url "https://brew.sh/foo-1.0.10.tgz" | 
					
						
							| 
									
										
										
										
											2020-12-08 23:26:52 +00:00
										 |  |  |             sha256 "31cccfc6630528db1c8e3a06f6decf2a370060b982841cfab2b8677400a5092e" | 
					
						
							| 
									
										
										
										
											2020-11-17 19:16:36 -05:00
										 |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_specs | 
					
						
							|  |  |  |         expect(fa.problems).to be_empty | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "doesn't allow patch versions that aren't multiples of the throttle rate" do | 
					
						
							|  |  |  |         fa = formula_auditor "foo", <<~RUBY, core_tap: true, tap_audit_exceptions: throttle_list | 
					
						
							|  |  |  |           class Foo < Formula | 
					
						
							|  |  |  |             url "https://brew.sh/foo-1.0.1.tgz" | 
					
						
							| 
									
										
										
										
											2020-12-08 23:26:52 +00:00
										 |  |  |             sha256 "31cccfc6630528db1c8e3a06f6decf2a370060b982841cfab2b8677400a5092e" | 
					
						
							| 
									
										
										
										
											2020-11-17 19:16:36 -05:00
										 |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_specs | 
					
						
							|  |  |  |         expect(fa.problems.first[:message]).to match "should only be updated every 10 releases on multiples of 10" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "allows non-versioned formulae to have a `HEAD` spec" do | 
					
						
							|  |  |  |         fa = formula_auditor "bar", <<~RUBY, core_tap: true, tap_audit_exceptions: versioned_head_spec_list | 
					
						
							|  |  |  |           class Bar < Formula | 
					
						
							|  |  |  |             url "https://brew.sh/foo-1.0.tgz" | 
					
						
							| 
									
										
										
										
											2020-12-08 23:26:52 +00:00
										 |  |  |             sha256 "31cccfc6630528db1c8e3a06f6decf2a370060b982841cfab2b8677400a5092e" | 
					
						
							|  |  |  |             head "https://brew.sh/foo.git" | 
					
						
							| 
									
										
										
										
											2020-11-17 19:16:36 -05:00
										 |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_specs | 
					
						
							|  |  |  |         expect(fa.problems).to be_empty | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "doesn't allow versioned formulae to have a `HEAD` spec" do | 
					
						
							|  |  |  |         fa = formula_auditor "bar@1", <<~RUBY, core_tap: true, tap_audit_exceptions: versioned_head_spec_list | 
					
						
							|  |  |  |           class BarAT1 < Formula | 
					
						
							|  |  |  |             url "https://brew.sh/foo-1.0.tgz" | 
					
						
							| 
									
										
										
										
											2020-12-08 23:26:52 +00:00
										 |  |  |             sha256 "31cccfc6630528db1c8e3a06f6decf2a370060b982841cfab2b8677400a5092e" | 
					
						
							|  |  |  |             head "https://brew.sh/foo.git" | 
					
						
							| 
									
										
										
										
											2020-11-17 19:16:36 -05:00
										 |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_specs | 
					
						
							|  |  |  |         expect(fa.problems.first[:message]).to match "Versioned formulae should not have a `HEAD` spec" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-08 23:26:52 +00:00
										 |  |  |       it "allows versioned formulae on the allowlist to have a `HEAD` spec" do | 
					
						
							| 
									
										
										
										
											2020-11-17 19:16:36 -05:00
										 |  |  |         fa = formula_auditor "foo", <<~RUBY, core_tap: true, tap_audit_exceptions: versioned_head_spec_list | 
					
						
							|  |  |  |           class Foo < Formula | 
					
						
							|  |  |  |             url "https://brew.sh/foo-1.0.tgz" | 
					
						
							| 
									
										
										
										
											2020-12-08 23:26:52 +00:00
										 |  |  |             sha256 "31cccfc6630528db1c8e3a06f6decf2a370060b982841cfab2b8677400a5092e" | 
					
						
							|  |  |  |             head "https://brew.sh/foo.git" | 
					
						
							| 
									
										
										
										
											2020-11-17 19:16:36 -05:00
										 |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_specs | 
					
						
							|  |  |  |         expect(fa.problems).to be_empty | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |     describe "#audit_deps" do | 
					
						
							|  |  |  |       describe "a dependency on a macOS-provided keg-only formula" do | 
					
						
							| 
									
										
										
										
											2020-06-06 19:12:12 +01:00
										 |  |  |         describe "which is allowlisted" do | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           subject { fa } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           let(:fa) do | 
					
						
							| 
									
										
										
										
											2018-07-11 15:17:40 +02:00
										 |  |  |             formula_auditor "foo", <<~RUBY, new_formula: true | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |               class Foo < Formula | 
					
						
							| 
									
										
										
										
											2018-11-28 20:51:55 +01:00
										 |  |  |                 url "https://brew.sh/foo-1.0.tgz" | 
					
						
							|  |  |  |                 homepage "https://brew.sh" | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |                 depends_on "openssl" | 
					
						
							|  |  |  |               end | 
					
						
							| 
									
										
										
										
											2018-07-11 15:17:40 +02:00
										 |  |  |             RUBY | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           let(:f_openssl) do | 
					
						
							|  |  |  |             formula do | 
					
						
							| 
									
										
										
										
											2018-11-28 20:51:55 +01:00
										 |  |  |               url "https://brew.sh/openssl-1.0.tgz" | 
					
						
							|  |  |  |               homepage "https://brew.sh" | 
					
						
							| 
									
										
										
										
											2017-10-09 02:32:44 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |               keg_only :provided_by_macos | 
					
						
							| 
									
										
										
										
											2017-10-09 02:32:44 +02:00
										 |  |  |             end | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           end | 
					
						
							| 
									
										
										
										
											2017-10-09 02:32:44 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           before do | 
					
						
							|  |  |  |             allow(fa.formula.deps.first) | 
					
						
							|  |  |  |               .to receive(:to_formula).and_return(f_openssl) | 
					
						
							|  |  |  |             fa.audit_deps | 
					
						
							| 
									
										
										
										
											2017-10-09 02:32:44 +02:00
										 |  |  |           end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           its(:problems) { are_expected.to be_empty } | 
					
						
							| 
									
										
										
										
											2017-10-09 02:32:44 +02:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-06 19:12:12 +01:00
										 |  |  |         describe "which is not allowlisted", :needs_macos do | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           subject { fa } | 
					
						
							| 
									
										
										
										
											2017-10-09 02:32:44 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           let(:fa) do | 
					
						
							| 
									
										
										
										
											2020-07-27 19:25:26 -07:00
										 |  |  |             formula_auditor "foo", <<~RUBY, new_formula: true, core_tap: true | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |               class Foo < Formula | 
					
						
							| 
									
										
										
										
											2018-11-28 20:51:55 +01:00
										 |  |  |                 url "https://brew.sh/foo-1.0.tgz" | 
					
						
							|  |  |  |                 homepage "https://brew.sh" | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |                 depends_on "bc" | 
					
						
							|  |  |  |               end | 
					
						
							| 
									
										
										
										
											2018-07-11 15:17:40 +02:00
										 |  |  |             RUBY | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           let(:f_bc) do | 
					
						
							|  |  |  |             formula do | 
					
						
							| 
									
										
										
										
											2018-11-28 20:51:55 +01:00
										 |  |  |               url "https://brew.sh/bc-1.0.tgz" | 
					
						
							|  |  |  |               homepage "https://brew.sh" | 
					
						
							| 
									
										
										
										
											2017-10-09 02:32:44 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |               keg_only :provided_by_macos | 
					
						
							| 
									
										
										
										
											2017-10-09 02:32:44 +02:00
										 |  |  |             end | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           end | 
					
						
							| 
									
										
										
										
											2017-10-09 02:32:44 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           before do | 
					
						
							|  |  |  |             allow(fa.formula.deps.first) | 
					
						
							|  |  |  |               .to receive(:to_formula).and_return(f_bc) | 
					
						
							|  |  |  |             fa.audit_deps | 
					
						
							| 
									
										
										
										
											2017-10-09 02:32:44 +02:00
										 |  |  |           end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-10 22:00:18 +02:00
										 |  |  |           its(:new_formula_problems) { | 
					
						
							|  |  |  |             are_expected.to include(a_hash_including(message: a_string_matching(/is provided by macOS/))) | 
					
						
							|  |  |  |           } | 
					
						
							| 
									
										
										
										
											2017-10-09 02:32:44 +02:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |     describe "#audit_revision_and_version_scheme" do | 
					
						
							| 
									
										
										
										
											2018-06-02 03:39:23 +02:00
										 |  |  |       subject { | 
					
						
							| 
									
										
										
										
											2020-06-08 15:00:09 +01:00
										 |  |  |         fa = described_class.new(Formulary.factory(formula_path), git: true) | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |         fa.audit_revision_and_version_scheme | 
					
						
							| 
									
										
										
										
											2020-09-10 22:00:18 +02:00
										 |  |  |         fa.problems.first&.fetch(:message) | 
					
						
							| 
									
										
										
										
											2018-06-02 03:39:23 +02:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |       let(:origin_tap_path) { Tap::TAP_DIRECTORY/"homebrew/homebrew-foo" } | 
					
						
							| 
									
										
										
										
											2018-06-02 03:39:23 +02:00
										 |  |  |       let(:foo_version) { Count.increment } | 
					
						
							|  |  |  |       let(:formula_subpath) { "Formula/foo#{foo_version}.rb" } | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |       let(:origin_formula_path) { origin_tap_path/formula_subpath } | 
					
						
							|  |  |  |       let(:tap_path) { Tap::TAP_DIRECTORY/"homebrew/homebrew-bar" } | 
					
						
							|  |  |  |       let(:formula_path) { tap_path/formula_subpath } | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |       before do | 
					
						
							| 
									
										
										
										
											2021-05-03 13:24:32 +01:00
										 |  |  |         origin_formula_path.dirname.mkpath | 
					
						
							| 
									
										
										
										
											2018-07-11 15:17:40 +02:00
										 |  |  |         origin_formula_path.write <<~RUBY | 
					
						
							| 
									
										
										
										
											2018-06-02 03:39:23 +02:00
										 |  |  |           class Foo#{foo_version} < Formula | 
					
						
							| 
									
										
										
										
											2018-11-28 20:51:55 +01:00
										 |  |  |             url "https://brew.sh/foo-1.0.tar.gz" | 
					
						
							| 
									
										
										
										
											2020-07-03 09:21:49 +01:00
										 |  |  |             sha256 "31cccfc6630528db1c8e3a06f6decf2a370060b982841cfab2b8677400a5092e" | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |             revision 2
 | 
					
						
							|  |  |  |             version_scheme 1
 | 
					
						
							|  |  |  |           end | 
					
						
							| 
									
										
										
										
											2018-07-11 15:17:40 +02:00
										 |  |  |         RUBY | 
					
						
							| 
									
										
										
										
											2017-04-23 18:56:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |         origin_tap_path.mkpath | 
					
						
							|  |  |  |         origin_tap_path.cd do | 
					
						
							|  |  |  |           system "git", "init" | 
					
						
							|  |  |  |           system "git", "add", "--all" | 
					
						
							|  |  |  |           system "git", "commit", "-m", "init" | 
					
						
							| 
									
										
										
										
											2017-04-23 18:56:22 +01:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |         tap_path.mkpath | 
					
						
							|  |  |  |         tap_path.cd do | 
					
						
							|  |  |  |           system "git", "clone", origin_tap_path, "." | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2017-04-23 18:56:22 +01:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |       def formula_gsub(before, after = "") | 
					
						
							|  |  |  |         text = formula_path.read | 
					
						
							|  |  |  |         text.gsub! before, after | 
					
						
							|  |  |  |         formula_path.unlink | 
					
						
							|  |  |  |         formula_path.write text | 
					
						
							| 
									
										
										
										
											2017-04-23 18:56:22 +01:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-03 09:21:49 +01:00
										 |  |  |       def formula_gsub_origin_commit(before, after = "") | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |         text = origin_formula_path.read | 
					
						
							|  |  |  |         text.gsub!(before, after) | 
					
						
							|  |  |  |         origin_formula_path.unlink | 
					
						
							|  |  |  |         origin_formula_path.write text | 
					
						
							| 
									
										
										
										
											2017-04-23 18:56:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |         origin_tap_path.cd do | 
					
						
							|  |  |  |           system "git", "commit", "-am", "commit" | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2017-04-23 18:56:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |         tap_path.cd do | 
					
						
							|  |  |  |           system "git", "fetch" | 
					
						
							|  |  |  |           system "git", "reset", "--hard", "origin/master" | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2017-04-23 18:56:22 +01:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-19 23:15:33 +00:00
										 |  |  |       describe "checksums" do | 
					
						
							|  |  |  |         describe "should not change with the same version" do | 
					
						
							| 
									
										
										
										
											2020-07-03 09:21:49 +01:00
										 |  |  |           before do | 
					
						
							|  |  |  |             formula_gsub( | 
					
						
							|  |  |  |               'sha256 "31cccfc6630528db1c8e3a06f6decf2a370060b982841cfab2b8677400a5092e"', | 
					
						
							|  |  |  |               'sha256 "3622d2a53236ed9ca62de0616a7e80fd477a9a3f862ba09d503da188f53ca523"', | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-11 10:38:14 -05:00
										 |  |  |           it { is_expected.to match("stable sha256 changed without the url/version also changing") } | 
					
						
							| 
									
										
										
										
											2020-07-03 09:21:49 +01:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-19 23:15:33 +00:00
										 |  |  |         describe "should not change with the same version when not the first commit" do | 
					
						
							| 
									
										
										
										
											2020-11-09 10:49:31 -05:00
										 |  |  |           before do | 
					
						
							|  |  |  |             formula_gsub_origin_commit( | 
					
						
							|  |  |  |               'sha256 "31cccfc6630528db1c8e3a06f6decf2a370060b982841cfab2b8677400a5092e"', | 
					
						
							|  |  |  |               'sha256 "3622d2a53236ed9ca62de0616a7e80fd477a9a3f862ba09d503da188f53ca523"', | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |             formula_gsub_origin_commit "revision 2" | 
					
						
							|  |  |  |             formula_gsub_origin_commit "foo-1.0.tar.gz", "foo-1.1.tar.gz" | 
					
						
							|  |  |  |             formula_gsub( | 
					
						
							|  |  |  |               'sha256 "3622d2a53236ed9ca62de0616a7e80fd477a9a3f862ba09d503da188f53ca523"', | 
					
						
							|  |  |  |               'sha256 "e048c5e6144f5932d8672c2fade81d9073d5b3ca1517b84df006de3d25414fc1"', | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-11 10:38:14 -05:00
										 |  |  |           it { is_expected.to match("stable sha256 changed without the url/version also changing") } | 
					
						
							| 
									
										
										
										
											2020-07-03 09:21:49 +01:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-19 23:15:33 +00:00
										 |  |  |         describe "can change with the different version" do | 
					
						
							| 
									
										
										
										
											2020-07-03 09:21:49 +01:00
										 |  |  |           before do | 
					
						
							|  |  |  |             formula_gsub_origin_commit( | 
					
						
							|  |  |  |               'sha256 "31cccfc6630528db1c8e3a06f6decf2a370060b982841cfab2b8677400a5092e"', | 
					
						
							|  |  |  |               'sha256 "3622d2a53236ed9ca62de0616a7e80fd477a9a3f862ba09d503da188f53ca523"', | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |             formula_gsub "foo-1.0.tar.gz", "foo-1.1.tar.gz" | 
					
						
							|  |  |  |             formula_gsub_origin_commit( | 
					
						
							|  |  |  |               'sha256 "3622d2a53236ed9ca62de0616a7e80fd477a9a3f862ba09d503da188f53ca523"', | 
					
						
							|  |  |  |               'sha256 "e048c5e6144f5932d8672c2fade81d9073d5b3ca1517b84df006de3d25414fc1"', | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           it { is_expected.to be_nil } | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2020-11-16 19:37:57 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-19 23:15:33 +00:00
										 |  |  |         describe "can be removed when switching schemes" do | 
					
						
							| 
									
										
										
										
											2020-11-16 19:37:57 -05:00
										 |  |  |           before do | 
					
						
							|  |  |  |             formula_gsub_origin_commit( | 
					
						
							|  |  |  |               'url "https://brew.sh/foo-1.0.tar.gz"', | 
					
						
							|  |  |  |               'url "https://foo.com/brew/bar.git", tag: "1.0", revision: "f5e00e485e7aa4c5baa20355b27e3b84a6912790"', | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |             formula_gsub_origin_commit('sha256 "31cccfc6630528db1c8e3a06f6decf2a370060b982841cfab2b8677400a5092e"', | 
					
						
							|  |  |  |                                        "") | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           it { is_expected.to be_nil } | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2020-07-03 09:21:49 +01:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-19 23:15:33 +00:00
										 |  |  |       describe "revisions" do | 
					
						
							|  |  |  |         describe "should not be removed when first committed above 0" do | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           it { is_expected.to be_nil } | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2017-04-23 18:56:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-19 23:15:33 +00:00
										 |  |  |         describe "with the same version, should not decrease" do | 
					
						
							| 
									
										
										
										
											2020-07-03 09:21:49 +01:00
										 |  |  |           before { formula_gsub_origin_commit "revision 2", "revision 1" } | 
					
						
							| 
									
										
										
										
											2017-04-23 18:56:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           it { is_expected.to match("revision should not decrease (from 2 to 1)") } | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2017-04-23 18:56:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-19 23:15:33 +00:00
										 |  |  |         describe "should not be removed with the same version" do | 
					
						
							| 
									
										
										
										
											2020-07-03 09:21:49 +01:00
										 |  |  |           before { formula_gsub_origin_commit "revision 2" } | 
					
						
							| 
									
										
										
										
											2017-04-23 18:56:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           it { is_expected.to match("revision should not decrease (from 2 to 0)") } | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2017-04-23 18:56:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-19 23:15:33 +00:00
										 |  |  |         describe "should not decrease with the same, uncommitted version" do | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           before { formula_gsub "revision 2", "revision 1" } | 
					
						
							| 
									
										
										
										
											2017-04-23 18:56:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           it { is_expected.to match("revision should not decrease (from 2 to 1)") } | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2017-04-23 18:56:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-19 23:15:33 +00:00
										 |  |  |         describe "should be removed with a newer version" do | 
					
						
							| 
									
										
										
										
											2020-07-03 09:21:49 +01:00
										 |  |  |           before { formula_gsub_origin_commit "foo-1.0.tar.gz", "foo-1.1.tar.gz" } | 
					
						
							| 
									
										
										
										
											2017-04-23 18:56:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           it { is_expected.to match("'revision 2' should be removed") } | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2017-04-23 18:56:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-19 23:15:33 +00:00
										 |  |  |         describe "should be removed with a newer local version" do | 
					
						
							| 
									
										
										
										
											2020-09-02 14:52:25 -04:00
										 |  |  |           before { formula_gsub "foo-1.0.tar.gz", "foo-1.1.tar.gz" } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           it { is_expected.to match("'revision 2' should be removed") } | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-19 23:15:33 +00:00
										 |  |  |         describe "should not warn on an newer version revision removal" do | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           before do | 
					
						
							| 
									
										
										
										
											2020-07-03 09:21:49 +01:00
										 |  |  |             formula_gsub_origin_commit "revision 2", "" | 
					
						
							|  |  |  |             formula_gsub_origin_commit "foo-1.0.tar.gz", "foo-1.1.tar.gz" | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           end | 
					
						
							| 
									
										
										
										
											2017-04-23 18:56:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           it { is_expected.to be_nil } | 
					
						
							| 
									
										
										
										
											2017-04-23 18:56:22 +01:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-19 23:15:33 +00:00
										 |  |  |         describe "should not warn when revision from previous version matches current revision" do | 
					
						
							| 
									
										
										
										
											2020-11-09 21:53:00 -05:00
										 |  |  |           before do | 
					
						
							|  |  |  |             formula_gsub_origin_commit "foo-1.0.tar.gz", "foo-1.1.tar.gz" | 
					
						
							|  |  |  |             formula_gsub_origin_commit "revision 2", "# no revision" | 
					
						
							|  |  |  |             formula_gsub_origin_commit "# no revision", "revision 1" | 
					
						
							|  |  |  |             formula_gsub_origin_commit "revision 1", "revision 2" | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           it { is_expected.to be_nil } | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-19 23:15:33 +00:00
										 |  |  |         describe "should only increment by 1 with an uncommitted version" do | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           before do | 
					
						
							|  |  |  |             formula_gsub "foo-1.0.tar.gz", "foo-1.1.tar.gz" | 
					
						
							|  |  |  |             formula_gsub "revision 2", "revision 4" | 
					
						
							|  |  |  |           end | 
					
						
							| 
									
										
										
										
											2017-04-23 18:56:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           it { is_expected.to match("revisions should only increment by 1") } | 
					
						
							| 
									
										
										
										
											2017-04-23 18:56:22 +01:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-19 23:15:33 +00:00
										 |  |  |         describe "should not warn on past increment by more than 1" do | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           before do | 
					
						
							| 
									
										
										
										
											2020-07-03 09:21:49 +01:00
										 |  |  |             formula_gsub_origin_commit "revision 2", "# no revision" | 
					
						
							|  |  |  |             formula_gsub_origin_commit "foo-1.0.tar.gz", "foo-1.1.tar.gz" | 
					
						
							|  |  |  |             formula_gsub_origin_commit "# no revision", "revision 3" | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           end | 
					
						
							| 
									
										
										
										
											2017-04-23 18:56:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           it { is_expected.to be_nil } | 
					
						
							| 
									
										
										
										
											2017-04-23 18:56:22 +01:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-19 23:15:33 +00:00
										 |  |  |       describe "version_schemes" do | 
					
						
							|  |  |  |         describe "should not decrease with the same version" do | 
					
						
							| 
									
										
										
										
											2020-07-03 09:21:49 +01:00
										 |  |  |           before { formula_gsub_origin_commit "version_scheme 1" } | 
					
						
							| 
									
										
										
										
											2017-04-23 18:56:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           it { is_expected.to match("version_scheme should not decrease (from 1 to 0)") } | 
					
						
							| 
									
										
										
										
											2017-04-23 18:56:22 +01:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-19 23:15:33 +00:00
										 |  |  |         describe "should not decrease with a new version" do | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           before do | 
					
						
							| 
									
										
										
										
											2020-07-03 09:21:49 +01:00
										 |  |  |             formula_gsub_origin_commit "foo-1.0.tar.gz", "foo-1.1.tar.gz" | 
					
						
							|  |  |  |             formula_gsub_origin_commit "revision 2", "" | 
					
						
							| 
									
										
										
										
											2020-11-09 21:53:00 -05:00
										 |  |  |             formula_gsub_origin_commit "version_scheme 1", "" | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           end | 
					
						
							| 
									
										
										
										
											2017-04-23 18:56:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           it { is_expected.to match("version_scheme should not decrease (from 1 to 0)") } | 
					
						
							| 
									
										
										
										
											2017-04-23 18:56:22 +01:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-19 23:15:33 +00:00
										 |  |  |         describe "should only increment by 1" do | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           before do | 
					
						
							| 
									
										
										
										
											2020-07-03 09:21:49 +01:00
										 |  |  |             formula_gsub_origin_commit "version_scheme 1", "# no version_scheme" | 
					
						
							|  |  |  |             formula_gsub_origin_commit "foo-1.0.tar.gz", "foo-1.1.tar.gz" | 
					
						
							|  |  |  |             formula_gsub_origin_commit "revision 2", "" | 
					
						
							|  |  |  |             formula_gsub_origin_commit "# no version_scheme", "version_scheme 3" | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           end | 
					
						
							| 
									
										
										
										
											2017-04-23 18:56:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           it { is_expected.to match("version_schemes should only increment by 1") } | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2017-04-23 18:56:22 +01:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-19 23:15:33 +00:00
										 |  |  |       describe "versions" do | 
					
						
							|  |  |  |         context "when uncommitted should not decrease" do | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           before { formula_gsub "foo-1.0.tar.gz", "foo-0.9.tar.gz" } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           it { is_expected.to match("stable version should not decrease (from 1.0 to 0.9)") } | 
					
						
							| 
									
										
										
										
											2017-04-23 18:56:22 +01:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-19 23:15:33 +00:00
										 |  |  |         context "when committed can decrease" do | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           before do | 
					
						
							| 
									
										
										
										
											2020-07-03 09:21:49 +01:00
										 |  |  |             formula_gsub_origin_commit "revision 2" | 
					
						
							|  |  |  |             formula_gsub_origin_commit "foo-1.0.tar.gz", "foo-0.9.tar.gz" | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           end | 
					
						
							| 
									
										
										
										
											2017-04-23 18:56:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           it { is_expected.to be_nil } | 
					
						
							| 
									
										
										
										
											2017-04-23 18:56:22 +01:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-19 23:15:33 +00:00
										 |  |  |         describe "can decrease with version_scheme increased" do | 
					
						
							| 
									
										
										
										
											2018-04-22 17:27:44 +02:00
										 |  |  |           before do | 
					
						
							|  |  |  |             formula_gsub "revision 2" | 
					
						
							|  |  |  |             formula_gsub "foo-1.0.tar.gz", "foo-0.9.tar.gz" | 
					
						
							|  |  |  |             formula_gsub "version_scheme 1", "version_scheme 2" | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           it { is_expected.to be_nil } | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2017-04-23 18:56:22 +01:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2018-02-04 21:54:49 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-26 13:57:21 +10:00
										 |  |  |     describe "#audit_versioned_keg_only" do | 
					
						
							|  |  |  |       specify "it warns when a versioned formula is not `keg_only`" do | 
					
						
							|  |  |  |         fa = formula_auditor "foo@1.1", <<~RUBY, core_tap: true | 
					
						
							|  |  |  |           class FooAT11 < Formula | 
					
						
							| 
									
										
										
										
											2018-11-28 20:51:55 +01:00
										 |  |  |             url "https://brew.sh/foo-1.1.tgz" | 
					
						
							| 
									
										
										
										
											2018-08-26 13:57:21 +10:00
										 |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_versioned_keg_only | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-10 22:00:18 +02:00
										 |  |  |         expect(fa.problems.first[:message]) | 
					
						
							| 
									
										
										
										
											2020-01-08 15:38:48 -05:00
										 |  |  |           .to match("Versioned formulae in homebrew/core should use `keg_only :versioned_formula`") | 
					
						
							| 
									
										
										
										
											2018-08-26 13:57:21 +10:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       specify "it warns when a versioned formula has an incorrect `keg_only` reason" do | 
					
						
							|  |  |  |         fa = formula_auditor "foo@1.1", <<~RUBY, core_tap: true | 
					
						
							|  |  |  |           class FooAT11 < Formula | 
					
						
							| 
									
										
										
										
											2018-11-28 20:51:55 +01:00
										 |  |  |             url "https://brew.sh/foo-1.1.tgz" | 
					
						
							| 
									
										
										
										
											2018-08-26 13:57:21 +10:00
										 |  |  | 
 | 
					
						
							|  |  |  |             keg_only :provided_by_macos | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_versioned_keg_only | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-10 22:00:18 +02:00
										 |  |  |         expect(fa.problems.first[:message]) | 
					
						
							| 
									
										
										
										
											2020-01-08 15:38:48 -05:00
										 |  |  |           .to match("Versioned formulae in homebrew/core should use `keg_only :versioned_formula`") | 
					
						
							| 
									
										
										
										
											2018-08-26 13:57:21 +10:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       specify "it does not warn when a versioned formula has `keg_only :versioned_formula`" do | 
					
						
							|  |  |  |         fa = formula_auditor "foo@1.1", <<~RUBY, core_tap: true | 
					
						
							|  |  |  |           class FooAT11 < Formula | 
					
						
							| 
									
										
										
										
											2018-11-28 20:51:55 +01:00
										 |  |  |             url "https://brew.sh/foo-1.1.tgz" | 
					
						
							| 
									
										
										
										
											2018-08-26 13:57:21 +10:00
										 |  |  | 
 | 
					
						
							|  |  |  |             keg_only :versioned_formula | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fa.audit_versioned_keg_only | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-10 22:00:18 +02:00
										 |  |  |         expect(fa.problems).to be_empty | 
					
						
							| 
									
										
										
										
											2018-08-26 13:57:21 +10:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2021-06-15 13:25:26 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     describe "#audit_conflicts" do | 
					
						
							| 
									
										
										
										
											2021-06-18 16:40:12 +01:00
										 |  |  |       before do | 
					
						
							| 
									
										
										
										
											2021-06-18 17:26:57 +01:00
										 |  |  |         # We don't really test FormulaTextAuditor here | 
					
						
							| 
									
										
										
										
											2021-06-18 16:40:12 +01:00
										 |  |  |         allow(File).to receive(:open).and_return("") | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-15 13:25:26 +01:00
										 |  |  |       specify "it warns when conflicting with non-existing formula" do | 
					
						
							| 
									
										
										
										
											2021-06-18 16:40:12 +01:00
										 |  |  |         foo = formula("foo") do | 
					
						
							|  |  |  |           url "https://brew.sh/bar-1.0.tgz" | 
					
						
							| 
									
										
										
										
											2021-06-15 13:25:26 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-18 16:40:12 +01:00
										 |  |  |           conflicts_with "bar" | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2021-06-15 13:25:26 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-18 17:26:57 +01:00
										 |  |  |         fa = described_class.new foo | 
					
						
							| 
									
										
										
										
											2021-06-15 13:25:26 +01:00
										 |  |  |         fa.audit_conflicts | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expect(fa.problems.first[:message]) | 
					
						
							|  |  |  |           .to match("Can't find conflicting formula \"bar\"") | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       specify "it warns when conflicting with itself" do | 
					
						
							| 
									
										
										
										
											2021-06-18 16:40:12 +01:00
										 |  |  |         foo = formula("foo") do | 
					
						
							|  |  |  |           url "https://brew.sh/bar-1.0.tgz" | 
					
						
							| 
									
										
										
										
											2021-06-15 13:25:26 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-18 16:40:12 +01:00
										 |  |  |           conflicts_with "foo" | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |         stub_formula_loader foo | 
					
						
							| 
									
										
										
										
											2021-06-15 13:25:26 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-18 17:26:57 +01:00
										 |  |  |         fa = described_class.new foo | 
					
						
							| 
									
										
										
										
											2021-06-15 13:25:26 +01:00
										 |  |  |         fa.audit_conflicts | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expect(fa.problems.first[:message]) | 
					
						
							|  |  |  |           .to match("Formula should not conflict with itself") | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       specify "it warns when another formula does not have a symmetric conflict" do | 
					
						
							| 
									
										
										
										
											2021-06-18 16:40:12 +01:00
										 |  |  |         foo = formula("foo") do | 
					
						
							|  |  |  |           url "https://brew.sh/foo-1.0.tgz" | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |         stub_formula_loader foo | 
					
						
							| 
									
										
										
										
											2021-06-15 13:25:26 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-18 16:40:12 +01:00
										 |  |  |         bar = formula("bar") do | 
					
						
							|  |  |  |           url "https://brew.sh/bar-1.0.tgz" | 
					
						
							| 
									
										
										
										
											2021-06-15 13:25:26 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-18 16:40:12 +01:00
										 |  |  |           conflicts_with "foo" | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2021-06-15 13:25:26 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-18 17:26:57 +01:00
										 |  |  |         fa = described_class.new bar | 
					
						
							| 
									
										
										
										
											2021-06-15 13:25:26 +01:00
										 |  |  |         fa.audit_conflicts | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expect(fa.problems.first[:message]) | 
					
						
							| 
									
										
										
										
											2021-06-18 16:40:12 +01:00
										 |  |  |           .to match("Formula foo should also have a conflict declared with bar") | 
					
						
							| 
									
										
										
										
											2021-06-15 13:25:26 +01:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2018-02-04 21:54:49 -05:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2017-02-28 13:42:52 +01:00
										 |  |  | end |