| 
									
										
										
										
											2020-03-30 21:07:56 +11:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-19 15:22:02 +10:00
										 |  |  | require "dev-cmd/pr-pull" | 
					
						
							| 
									
										
										
										
											2020-09-19 17:14:06 +10:00
										 |  |  | require "utils/git" | 
					
						
							|  |  |  | require "tap" | 
					
						
							| 
									
										
										
										
											2020-03-30 21:07:56 +11:00
										 |  |  | require "cmd/shared_examples/args_parse" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-21 21:31:25 -07:00
										 |  |  | RSpec.describe Homebrew::DevCmd::PrPull do | 
					
						
							| 
									
										
										
										
											2024-03-30 19:10:56 -07:00
										 |  |  |   include FileUtils | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-21 21:31:25 -07:00
										 |  |  |   let(:pr_pull) { described_class.new(["foo"]) } | 
					
						
							|  |  |  |   let(:formula_rebuild) do | 
					
						
							|  |  |  |     <<~EOS | 
					
						
							|  |  |  |       class Foo < Formula | 
					
						
							|  |  |  |         desc "Helpful description" | 
					
						
							|  |  |  |         url "https://brew.sh/foo-1.0.tgz" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     EOS | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  |   let(:formula_revision) do | 
					
						
							|  |  |  |     <<~EOS | 
					
						
							|  |  |  |       class Foo < Formula | 
					
						
							|  |  |  |         url "https://brew.sh/foo-1.0.tgz" | 
					
						
							|  |  |  |         revision 1
 | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     EOS | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  |   let(:formula_version) do | 
					
						
							|  |  |  |     <<~EOS | 
					
						
							|  |  |  |       class Foo < Formula | 
					
						
							|  |  |  |         url "https://brew.sh/foo-2.0.tgz" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     EOS | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  |   let(:formula) do | 
					
						
							|  |  |  |     <<~EOS | 
					
						
							|  |  |  |       class Foo < Formula | 
					
						
							|  |  |  |         url "https://brew.sh/foo-1.0.tgz" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     EOS | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  |   let(:cask_rebuild) do | 
					
						
							|  |  |  |     <<~EOS | 
					
						
							|  |  |  |       cask "food" do | 
					
						
							|  |  |  |         desc "Helpful description" | 
					
						
							|  |  |  |         version "1.0" | 
					
						
							|  |  |  |         sha256 "a" | 
					
						
							|  |  |  |         url "https://brew.sh/food-\#{version}.tgz" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     EOS | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  |   let(:cask_checksum) do | 
					
						
							|  |  |  |     <<~EOS | 
					
						
							|  |  |  |       cask "food" do | 
					
						
							|  |  |  |         desc "Helpful description" | 
					
						
							|  |  |  |         version "1.0" | 
					
						
							|  |  |  |         sha256 "b" | 
					
						
							|  |  |  |         url "https://brew.sh/food-\#{version}.tgz" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     EOS | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  |   let(:cask_version) do | 
					
						
							|  |  |  |     <<~EOS | 
					
						
							|  |  |  |       cask "food" do | 
					
						
							|  |  |  |         version "2.0" | 
					
						
							|  |  |  |         sha256 "a" | 
					
						
							|  |  |  |         url "https://brew.sh/food-\#{version}.tgz" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     EOS | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  |   let(:cask) do | 
					
						
							|  |  |  |     <<~EOS | 
					
						
							|  |  |  |       cask "food" do | 
					
						
							|  |  |  |         version "1.0" | 
					
						
							|  |  |  |         sha256 "a" | 
					
						
							|  |  |  |         url "https://brew.sh/food-\#{version}.tgz" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     EOS | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  |   let(:tap) { Tap.fetch("Homebrew", "foo") } | 
					
						
							|  |  |  |   let(:formula_file) { tap.path/"Formula/foo.rb" } | 
					
						
							|  |  |  |   let(:cask_file) { tap.cask_dir/"food.rb" } | 
					
						
							| 
									
										
										
										
											2024-08-10 13:35:20 -07:00
										 |  |  |   let(:path) { Pathname(HOMEBREW_TAP_DIRECTORY/"homebrew/homebrew-foo") } | 
					
						
							| 
									
										
										
										
											2024-03-21 21:31:25 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-01 16:14:25 -05:00
										 |  |  |   it_behaves_like "parseable arguments" | 
					
						
							| 
									
										
										
										
											2020-09-19 17:14:06 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-21 21:31:25 -07:00
										 |  |  |   describe "#autosquash!" do | 
					
						
							|  |  |  |     it "squashes a formula or cask correctly" do | 
					
						
							|  |  |  |       secondary_author = "Someone Else <me@example.com>" | 
					
						
							|  |  |  |       (tap.path/"Formula").mkpath | 
					
						
							|  |  |  |       formula_file.write(formula) | 
					
						
							|  |  |  |       cd tap.path do | 
					
						
							|  |  |  |         safe_system Utils::Git.git, "init" | 
					
						
							|  |  |  |         safe_system Utils::Git.git, "add", formula_file | 
					
						
							|  |  |  |         safe_system Utils::Git.git, "commit", "-m", "foo 1.0 (new formula)" | 
					
						
							|  |  |  |         original_hash = `git rev-parse HEAD`.chomp | 
					
						
							|  |  |  |         File.write(formula_file, formula_revision) | 
					
						
							|  |  |  |         safe_system Utils::Git.git, "commit", formula_file, "-m", "revision" | 
					
						
							|  |  |  |         File.write(formula_file, formula_version) | 
					
						
							|  |  |  |         safe_system Utils::Git.git, "commit", formula_file, "-m", "version", "--author=#{secondary_author}" | 
					
						
							|  |  |  |         pr_pull.autosquash!(original_hash, tap:) | 
					
						
							| 
									
										
										
										
											2024-06-10 09:31:53 +01:00
										 |  |  |         expect(tap.git_repository.commit_message).to include("foo 2.0") | 
					
						
							|  |  |  |         expect(tap.git_repository.commit_message).to include("Co-authored-by: #{secondary_author}") | 
					
						
							| 
									
										
										
										
											2020-09-19 18:49:33 +10:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-21 21:31:25 -07:00
										 |  |  |       (path/"Casks").mkpath | 
					
						
							|  |  |  |       cask_file.write(cask) | 
					
						
							|  |  |  |       cd path do | 
					
						
							|  |  |  |         safe_system Utils::Git.git, "add", cask_file | 
					
						
							|  |  |  |         safe_system Utils::Git.git, "commit", "-m", "food 1.0 (new cask)" | 
					
						
							|  |  |  |         original_hash = `git rev-parse HEAD`.chomp | 
					
						
							|  |  |  |         File.write(cask_file, cask_rebuild) | 
					
						
							|  |  |  |         safe_system Utils::Git.git, "commit", cask_file, "-m", "rebuild" | 
					
						
							|  |  |  |         File.write(cask_file, cask_version) | 
					
						
							|  |  |  |         safe_system Utils::Git.git, "commit", cask_file, "-m", "version", "--author=#{secondary_author}" | 
					
						
							|  |  |  |         pr_pull.autosquash!(original_hash, tap:) | 
					
						
							|  |  |  |         git_repo = GitRepository.new(path) | 
					
						
							|  |  |  |         expect(git_repo.commit_message).to include("food 2.0") | 
					
						
							|  |  |  |         expect(git_repo.commit_message).to include("Co-authored-by: #{secondary_author}") | 
					
						
							| 
									
										
										
										
											2022-01-10 18:57:56 +02:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2024-03-21 21:31:25 -07:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2022-01-10 18:57:56 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-21 21:31:25 -07:00
										 |  |  |   describe "#signoff!" do | 
					
						
							|  |  |  |     it "signs off a formula or cask" do | 
					
						
							|  |  |  |       (tap.path/"Formula").mkpath | 
					
						
							|  |  |  |       formula_file.write(formula) | 
					
						
							|  |  |  |       cd tap.path do | 
					
						
							|  |  |  |         safe_system Utils::Git.git, "init" | 
					
						
							|  |  |  |         safe_system Utils::Git.git, "add", formula_file | 
					
						
							|  |  |  |         safe_system Utils::Git.git, "commit", "-m", "foo 1.0 (new formula)" | 
					
						
							| 
									
										
										
										
											2022-01-10 18:57:56 +02:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2024-06-10 09:31:53 +01:00
										 |  |  |       pr_pull.signoff!(tap.git_repository) | 
					
						
							|  |  |  |       expect(tap.git_repository.commit_message).to include("Signed-off-by:") | 
					
						
							| 
									
										
										
										
											2024-03-21 21:31:25 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |       (path/"Casks").mkpath | 
					
						
							|  |  |  |       cask_file.write(cask) | 
					
						
							|  |  |  |       cd path do | 
					
						
							|  |  |  |         safe_system Utils::Git.git, "add", cask_file | 
					
						
							|  |  |  |         safe_system Utils::Git.git, "commit", "-m", "food 1.0 (new cask)" | 
					
						
							| 
									
										
										
										
											2022-01-10 18:57:56 +02:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2024-06-10 09:31:53 +01:00
										 |  |  |       pr_pull.signoff!(tap.git_repository) | 
					
						
							|  |  |  |       expect(tap.git_repository.commit_message).to include("Signed-off-by:") | 
					
						
							| 
									
										
										
										
											2024-03-21 21:31:25 -07:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2022-01-10 18:57:56 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-21 21:31:25 -07:00
										 |  |  |   describe "#get_package" do | 
					
						
							|  |  |  |     it "returns a formula" do | 
					
						
							|  |  |  |       expect(pr_pull.get_package(tap, "foo", formula_file, formula)).to be_a(Formula) | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2022-01-10 18:57:56 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-21 21:31:25 -07:00
										 |  |  |     it "returns nil for an unknown formula" do | 
					
						
							|  |  |  |       expect(pr_pull.get_package(tap, "foo", formula_file, "")).to be_nil | 
					
						
							| 
									
										
										
										
											2020-09-19 15:22:02 +10:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-21 21:31:25 -07:00
										 |  |  |     it "returns a cask" do | 
					
						
							|  |  |  |       expect(pr_pull.get_package(tap, "foo", cask_file, cask)).to be_a(Cask::Cask) | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2020-09-19 15:22:02 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-21 21:31:25 -07:00
										 |  |  |     it "returns nil for an unknown cask" do | 
					
						
							|  |  |  |       expect(pr_pull.get_package(tap, "foo", cask_file, "")).to be_nil | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2022-01-10 18:57:56 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-21 21:31:25 -07:00
										 |  |  |   describe "#determine_bump_subject" do | 
					
						
							|  |  |  |     it "correctly bumps a new formula" do | 
					
						
							|  |  |  |       expect(pr_pull.determine_bump_subject("", formula, formula_file)).to eq("foo 1.0 (new formula)") | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2020-09-19 15:22:02 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-21 21:31:25 -07:00
										 |  |  |     it "correctly bumps a new cask" do | 
					
						
							|  |  |  |       expect(pr_pull.determine_bump_subject("", cask, cask_file)).to eq("food 1.0 (new cask)") | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2022-01-10 18:57:56 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-21 21:31:25 -07:00
										 |  |  |     it "correctly bumps a formula version" do | 
					
						
							|  |  |  |       expect(pr_pull.determine_bump_subject(formula, formula_version, formula_file)).to eq("foo 2.0") | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2022-04-26 08:57:29 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-21 21:31:25 -07:00
										 |  |  |     it "correctly bumps a cask version" do | 
					
						
							|  |  |  |       expect(pr_pull.determine_bump_subject(cask, cask_version, cask_file)).to eq("food 2.0") | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2020-09-19 15:22:02 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-21 21:31:25 -07:00
										 |  |  |     it "correctly bumps a cask checksum" do | 
					
						
							|  |  |  |       expect(pr_pull.determine_bump_subject(cask, cask_checksum, cask_file)).to eq("food: checksum update") | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2020-09-19 15:22:02 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-21 21:31:25 -07:00
										 |  |  |     it "correctly bumps a formula revision with reason" do | 
					
						
							|  |  |  |       expect(pr_pull.determine_bump_subject( | 
					
						
							|  |  |  |                formula, formula_revision, formula_file, reason: "for fun" | 
					
						
							|  |  |  |              )).to eq("foo: revision for fun") | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2022-01-10 18:57:56 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-21 21:31:25 -07:00
										 |  |  |     it "correctly bumps a formula rebuild" do | 
					
						
							|  |  |  |       expect(pr_pull.determine_bump_subject(formula, formula_rebuild, formula_file)).to eq("foo: rebuild") | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "correctly bumps a formula deletion" do | 
					
						
							|  |  |  |       expect(pr_pull.determine_bump_subject(formula, "", formula_file)).to eq("foo: delete") | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "correctly bumps a cask deletion" do | 
					
						
							|  |  |  |       expect(pr_pull.determine_bump_subject(cask, "", cask_file)).to eq("food: delete") | 
					
						
							| 
									
										
										
										
											2020-09-19 15:22:02 +10:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2020-03-30 21:07:56 +11:00
										 |  |  | end |