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
|
2022-03-01 00:01:13 +00:00
|
|
|
expect(ft.line_number(/desc/)).to be_nil
|
2018-04-22 17:27:44 +02:00
|
|
|
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-10-21 19:08:13 -04:00
|
|
|
formula = Formulary.factory(path)
|
|
|
|
|
|
|
|
if options.key? :tap_audit_exceptions
|
|
|
|
tap = Tap.fetch("test/tap")
|
|
|
|
allow(tap).to receive(:audit_exceptions).and_return(options[:tap_audit_exceptions])
|
|
|
|
allow(formula).to receive(:tap).and_return(tap)
|
|
|
|
options.delete :tap_audit_exceptions
|
|
|
|
end
|
|
|
|
|
|
|
|
described_class.new(formula, 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
|
|
|
|
|
2022-06-28 10:09:59 +01: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
|
|
|
|
|
2022-06-28 10:09:59 +01:00
|
|
|
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
|
|
|
|
2022-06-28 10:09:59 +01: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
|
|
|
|
|
2022-06-28 10:09:59 +01: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
|
|
|
|
2022-06-28 10:09:59 +01: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
|
|
|
|
|
2022-06-28 10:09:59 +01: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
|
2022-06-28 10:09:59 +01: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
|
|
|
|
|
2022-06-28 10:09:59 +01:00
|
|
|
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
|
2022-02-11 10:45:51 -05:00
|
|
|
subject {
|
|
|
|
fa = described_class.new(Formulary.factory(formula_path), git: true)
|
|
|
|
fa.audit_revision_and_version_scheme
|
|
|
|
fa.problems.first&.fetch(:message)
|
|
|
|
}
|
|
|
|
|
2022-02-09 04:24:58 -05:00
|
|
|
let(:origin_tap_path) { Tap::TAP_DIRECTORY/"homebrew/homebrew-foo" }
|
2022-02-11 10:45:51 -05:00
|
|
|
let(:foo_version) { Count.increment }
|
|
|
|
let(:formula_subpath) { "Formula/foo#{foo_version}.rb" }
|
|
|
|
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
|
|
|
|
|
2022-02-09 04:24:58 -05:00
|
|
|
describe "new formulae should not have a revision" do
|
|
|
|
it "doesn't allow new formulae to have a revision" do
|
|
|
|
fa = formula_auditor "foo", <<~RUBY, new_formula: true
|
|
|
|
class Foo < Formula
|
|
|
|
url "https://brew.sh/foo-1.0.tgz"
|
|
|
|
revision 1
|
|
|
|
end
|
|
|
|
RUBY
|
|
|
|
|
|
|
|
fa.audit_revision_and_version_scheme
|
|
|
|
|
|
|
|
expect(fa.new_formula_problems).to include(
|
|
|
|
a_hash_including(message: a_string_matching(/should not define a revision/)),
|
|
|
|
)
|
|
|
|
end
|
|
|
|
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
|