From 3963af774ad344510aae661db5ec400d2aa9ceb1 Mon Sep 17 00:00:00 2001 From: thibhero Date: Sat, 31 May 2025 12:52:34 -0400 Subject: [PATCH 01/37] adding tarball for the different tests in upgrade_spec.rb and install_spec.rb --- .../tarballs/testball-0.1.all.bottle.tar.gz | Bin 0 -> 676 bytes .../tarballs/testball-build-0.1-linux.tbz | Bin 0 -> 433 bytes .../fixtures/tarballs/testball-build-0.1.tbz | Bin 0 -> 433 bytes .../testball-parent-0.1.all.bottle.tar.gz | Bin 0 -> 683 bytes .../fixtures/tarballs/testball-parent-0.1.tbz | Bin 0 -> 433 bytes .../testball-parent-parent-0.1.all.bottle.tar.gz | Bin 0 -> 887 bytes .../tarballs/testball4-0.1.all.bottle.tar.gz | Bin 0 -> 675 bytes .../tarballs/testball5-0.1.all.bottle.tar.gz | Bin 0 -> 676 bytes 8 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Library/Homebrew/test/support/fixtures/tarballs/testball-0.1.all.bottle.tar.gz create mode 100644 Library/Homebrew/test/support/fixtures/tarballs/testball-build-0.1-linux.tbz create mode 100644 Library/Homebrew/test/support/fixtures/tarballs/testball-build-0.1.tbz create mode 100644 Library/Homebrew/test/support/fixtures/tarballs/testball-parent-0.1.all.bottle.tar.gz create mode 100644 Library/Homebrew/test/support/fixtures/tarballs/testball-parent-0.1.tbz create mode 100644 Library/Homebrew/test/support/fixtures/tarballs/testball-parent-parent-0.1.all.bottle.tar.gz create mode 100644 Library/Homebrew/test/support/fixtures/tarballs/testball4-0.1.all.bottle.tar.gz create mode 100644 Library/Homebrew/test/support/fixtures/tarballs/testball5-0.1.all.bottle.tar.gz diff --git a/Library/Homebrew/test/support/fixtures/tarballs/testball-0.1.all.bottle.tar.gz b/Library/Homebrew/test/support/fixtures/tarballs/testball-0.1.all.bottle.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..f1b58c7a50493219f3f804fbcf2e471001990d30 GIT binary patch literal 676 zcmV;V0$cqbiwFP`X*y^C1MQmKZrU&u#~n(wjNNcG?b1(>+WBzU1rkuGiqxr7siy9V z1rk1_Ku|~}E_u3Xudv71#jZDpoKRW{s1mR;&QCh}1GZ0`_~XRbkvEQ7j_;q5-N6{M zEsM@nB+7L*(-g`r#)T%wZEQ(Fm{mkLv$RTKH$iEGOjhySyPMsnLQDNErmxDwJ27 zcRzk!|NdTHOm)|!j(SU85d=XHWH%^@sPF!5H4p@Og~am%1ucP26ICER1DahZlLw`s zCD3W23gpXxWJNlSsnhXPkl7cUAdJroLBdeJQ-$kA|;NIs7Lwbko? z1VR2|lx($8t&sVGV2L=^Qfc4P0tBKtS$+w~B!3ouAP?yjv;;a$6kh}o1VQ%AeE*MW zd{<|{UVi?|E^OTYMGyqpC4T{v Kn)h}9E&u?U8q-15b0Lr8Xpe^ z#PWsv2?N`yT_U=)e3Tm5C@cZzc0gcHU{*uk3bU-TtU|`+~75u4`0c8dVi2)Ik zq%Z+J@u0;bN)#l8WD5!Crov$4l3)t~E~^c^t3mHiPYE`&? zuKnsv-_0FERV2m|;hE5v%a~vq<cfxB zSPKee5HhPuD~Ia0DRqRuV`x_h1wmjg;hB0urLkE_;V^cnsgkl!k8?OCN-A(=^a%$K bQ-jq(iZ;uILnTuR;r|zMML1B9@{$;4hZwZ9 literal 0 HcmV?d00001 diff --git a/Library/Homebrew/test/support/fixtures/tarballs/testball-build-0.1.tbz b/Library/Homebrew/test/support/fixtures/tarballs/testball-build-0.1.tbz new file mode 100644 index 0000000000000000000000000000000000000000..db8dd018f6328f216b699da9c812d7ef8042087e GIT binary patch literal 433 zcmV;i0Z#rxT4*^jL0KkKS@Mz?W&i;<|G576MUYqn|KdA$|6u=T-a`TaMnFIS00}Sw zcr~DEQ%_N#X{JC7jSVymfB+f;Ajy!#6IAkz8X5p-&;S4c00001B!ZbHr<$jlqr}Q& zeyO!R0EehHNHf%BG(1yjnxvhEOpvvlGlR{vt=t;1dkG`zO*Q8y|D!t_21wszj8k2B zR%DSoCol^8U}Og*w#V53(hf*m47z;)Gotft4m^mKnJO740RXTZ>8q-15b0Lr8Xpe^ z#PWsv2?N`yT_U=)e3Tm5C@cZzc0gcHU{*uk3bU-TtU|`+~75u4`0c8dVi2)Ik zq%Z+J@u0;bN)#l8WD5!Crov$4l3)t~E~^c^t3mHiPYE`&? zuKnsv-_0FERV2m|;hE5v%a~vq<cfxB zSPKee5HhPuD~Ia0DRqRuV`x_h1wmjg;hB0urLkE_;V^cnsgkl!k8?OCN-A(=^a%$K bQ-jq(iZ;uILnTuR;r|zMML1B9@{$;4hZwZ9 literal 0 HcmV?d00001 diff --git a/Library/Homebrew/test/support/fixtures/tarballs/testball-parent-0.1.all.bottle.tar.gz b/Library/Homebrew/test/support/fixtures/tarballs/testball-parent-0.1.all.bottle.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..87aa758a40c1d87837ed67c4e6a1de11032ad848 GIT binary patch literal 683 zcmV;c0#yAUiwFQ2X*y^C1MQmKZrU&u#~n(wjNNcG?b0u>)DHPz7f1<(sz{wWHPzHz zu|UFy6bK5b#3fHR?G^SIyV&*SkV8kIfHnnI#`#G{{}9_JP8|Eh*s(v3TW%1%9l4P| zjL*mpV2qi%PG@SQ%2hVgIh5;+8=9dp!=#MsT;+u7yQs`E_v6@&L{;Kmzt!`ja9uvv z8}x@8{J?!Y=z$O~wZGC-YEILM!^qF<8sd2vnzp|Exw+8(rbd$!Tql%eR)Y;3dHa*o z*DpwpkoRtzUOV)T0?9e@QkW|2LRj*9k`$Qdu!`$k+PAkia5$NlLY^nf{r`hIx%6Gn zkIu3i2e$S9lFA?Vf0gN)N$6f)oFni5B}NBvf8bZRsg(`AtdqCXTbP-EB$D~)rz zn_AVb+Z!o}C;%7R;BedMQ`qn0J9t*&f9BDDTmR=8W7<;uHw?xx{_hE?dhc;Uk`5)4 zR3-W8tTNaNIndLjaN;9uw}P+*?hb>b?k9v1h44o3sQ%xDML%cEazd`4%N;RDjTU@B z${?)OpuF6?`}*zr#}|7s)!UFd>aBQ15ClPx-5{kRzxub;KoH~^l8g@&)B>HRDnWV< zG`~=$2ueXM&}pg?VlACBfuFf-BD_FA_{WBnoQ%(Jdp$(QuMV zF^T{6_49uOLH=W;e9fs<$-{(Tg(TKeVV~y(2t;$T`Vo*z|15k%ey3AV3v`+)eh454 zg6x~+^*^TY%=du(#r`jio4EgLA3W9mkuPpG!v)}N`#)ywuNs=kN=&=}$@;IZ8@T?9 RAPBNcegPNIt_T1w004o@TlD|{ literal 0 HcmV?d00001 diff --git a/Library/Homebrew/test/support/fixtures/tarballs/testball-parent-0.1.tbz b/Library/Homebrew/test/support/fixtures/tarballs/testball-parent-0.1.tbz new file mode 100644 index 0000000000000000000000000000000000000000..db8dd018f6328f216b699da9c812d7ef8042087e GIT binary patch literal 433 zcmV;i0Z#rxT4*^jL0KkKS@Mz?W&i;<|G576MUYqn|KdA$|6u=T-a`TaMnFIS00}Sw zcr~DEQ%_N#X{JC7jSVymfB+f;Ajy!#6IAkz8X5p-&;S4c00001B!ZbHr<$jlqr}Q& zeyO!R0EehHNHf%BG(1yjnxvhEOpvvlGlR{vt=t;1dkG`zO*Q8y|D!t_21wszj8k2B zR%DSoCol^8U}Og*w#V53(hf*m47z;)Gotft4m^mKnJO740RXTZ>8q-15b0Lr8Xpe^ z#PWsv2?N`yT_U=)e3Tm5C@cZzc0gcHU{*uk3bU-TtU|`+~75u4`0c8dVi2)Ik zq%Z+J@u0;bN)#l8WD5!Crov$4l3)t~E~^c^t3mHiPYE`&? zuKnsv-_0FERV2m|;hE5v%a~vq<cfxB zSPKee5HhPuD~Ia0DRqRuV`x_h1wmjg;hB0urLkE_;V^cnsgkl!k8?OCN-A(=^a%$K bQ-jq(iZ;uILnTuR;r|zMML1B9@{$;4hZwZ9 literal 0 HcmV?d00001 diff --git a/Library/Homebrew/test/support/fixtures/tarballs/testball-parent-parent-0.1.all.bottle.tar.gz b/Library/Homebrew/test/support/fixtures/tarballs/testball-parent-parent-0.1.all.bottle.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..477ed327212cafed81a05b2c0d3e727abdfc6093 GIT binary patch literal 887 zcmV--1Bm<|iwFQAYdUBE1MQm6ZxTTi$7g995ieXc9_Mb{&MfvQ@U*U++UEUtoUiGQ4?j;Cc3m zSF>8Jr(MgnJ08d~i4(?{p=orWdZ1ik106!S#<;GEhiKqG<0_$AtXC1j>4|5#;!?ch zX6@K^ov?ORquuPx7zgg-Om7I@`RgxNw5^8iF2}GBMA?5%;S=^RHUOQ_M7}t8-2QWnw!LQCUgd_G*R{No(`A-d z3`6Jnm5id&%Gzdm>!o~n*s_jJR*##FhTX~JHM&(Un!BQIe_ifbp6AMSr!8CEZp)T8 znjP`YDR&N?)$*Eo6qKU5Zq6hlyZ}r#W5B50CzI^QcjF23|M7YMDEsFsW9p>;X9h$6 zpAb^0wJ#7xWWvj>zpnqMDDLk8 zgO<>$b;K)Tlj@F*0X1!>RD%BL>cQ9VJHNh|XQ4s_|5ae=@0!cr(+RH!? zS$(uC&!Fqy|SM^yfoqUI*@zYL~f{!cPoB>(3v2|W9!iw!xJ z|Ks=gAj;(Liqh!)hok@byRP%j?pU3=?Kk-N;sYZ&nNOf z6{a%<^M8_HGXF>CIayiZoT-|oWi(?}p3lf!SIy_9*?zLTyRSF558mW6>PlEH&se81 z8^^SrDzvNITC zmSNCD%~ZL@5}iW1!MG_*!Ay%Xu3OwB)Yx5><~)odCzMr*y1i!C3xiep9Jk*atnmZ) zG1CJfnzg^$P^)&sj)KtJ@-^i1Fojs%{@hwrH%zV(%C=mO7di6wC#N6ZkqjZ9 zoff^Z={*JF-^hDunzT!4@%M3DV49;;Smm;OcXtaP$J0{C+hjiezc}M7&vCu*Y}@m| zrtz<9{Mq=obRh`cOUF6#@vk%5k9vLYoLi!38bwVvRaVq2%jA}k*95gMuIks{)OOo< zI-~P$&vm^)zG%?vdZm0T)4tZ!u@gn1+6wxrGaUM!df6MuZd4z%gY)`DxszI@Tr007 zFQWilY>mTBvrm4%kMH1Fi2pl^{+q@>7mSJL@n5%0jQ@K=sXVxxka$4lNUBQi<*Yfd zB{HC=apBlU&}#ZY6WkpJaotY{BP!u_|4IFSNellZBsn3M-{H2Lq=pMVAf+Evt581I zxc~9<=J#WHG1Xm@I_xfaMGyo*klmo9lKb#)tAQZM8zi0|C};_ElBxpf8PM!PnF1&U zErCu_RUlsmGz*#oEr3$c66hpVn6wmFd?;|`>EcC!rH4X6ORu_R1UVW`QYpmozqWe) zk08i@jFPR|)e4y{2$qOrEtU3tT7W<_C(ADZne@-XPh_4>K}(>MRPjXsK@eo$%=iD8 z%6D`I?DglrgvJG)|Jnyn+duT=ZEk%7c+>fhr2REhSWIWK10?&uhK~Ec2!bHH@yCg=BX1bhUEjCP$j)Gl zNz0-WwG-tAo9GnEEyitO3ua5oxGA|L)Y@H@<~$4|H&j)LI^BB53xiep+-9%aU*iYv zW2Of}G;4pork9d>FwIfOt#VnsySs&tqiHGRbuu6SpWV@w=Qh3YY}@m| zrtxnY{K@#2rmzUzOUF6#@ozHPi@H7UoJ*0nt-N8{I?EeU+C2X;YY6IGTve~X>aCXV zwuk4PZnNq2vw4eNS4+iPmG-5gkK8B<^+wRs-NC^3^viBvb)#y(6`WTuitWTo#Y%B4 zSrrA~Vrv|3ntihSeS8PcLj2!R^xri8xnN8@jsK>U82|T#R(fc1LgE3HA&F|4=d)(O zmPmn~#)V@aL8I;mb#QkW#C1O*jOc_{{YUlxr7Zk2VUiPa`EBl~Noug*15$cHxeVnq zwfi4GZ+?F-E~Yluqz*buUJ(RA5M(!KiDcgW+iD;P@(PLP2MSsM9VeNdB&0lew_$E5uYTS#Uy)d42^zm~xLUj#vrUGf*K Kb@;>pE&u>Z15k

Date: Sat, 31 May 2025 12:53:38 -0400 Subject: [PATCH 02/37] modifying ask function as it didn't find the whole hierarchy for parents --- Library/Homebrew/install.rb | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/Library/Homebrew/install.rb b/Library/Homebrew/install.rb index 8fba7fabf7..eed1d65f18 100644 --- a/Library/Homebrew/install.rb +++ b/Library/Homebrew/install.rb @@ -428,7 +428,11 @@ module Homebrew dep.installed_kegs.empty? || (dep.bottled? && dep.outdated?) end deps.map(&:to_formula).each do |f| - outdated_dependents.concat(f.recursive_dependencies.map(&:to_formula).reject(&:pinned?).select do |dep| + prune_build = f.recursive_dependencies do |_, dep| + :prune if dep.build? + end + # select the outdated one or not installed + outdated_dependents.concat(prune_build.map(&:to_formula).reject(&:pinned?).select do |dep| dep.installed_kegs.empty? || (dep.bottled? && dep.outdated?) end) end @@ -436,13 +440,23 @@ module Homebrew formula_list end - # Add any installed formula that depends on one of the sized formulae and is outdated. unless Homebrew::EnvConfig.no_installed_dependents_check? - sized_formulae.concat(Formula.installed.select do |installed_formula| - installed_formula.bottled? && installed_formula.outdated? && - installed_formula.deps.required.map(&:to_formula).intersect?(sized_formulae) - end) + loop do + new_parents = Formula.installed.select do |installed_formula| + next unless installed_formula.bottled? + next unless installed_formula.outdated? + + required_deps = installed_formula.deps.required.map(&:to_formula) + required_deps.intersect?(sized_formulae) + end + + # Exclude anything already in sized_formulae + new_parents -= sized_formulae + break if new_parents.empty? + + sized_formulae.concat(new_parents) + end end sized_formulae.uniq(&:to_s).compact From 19134b300574a2e1553c8a655b76f22740dfc6c7 Mon Sep 17 00:00:00 2001 From: thibhero Date: Sat, 31 May 2025 12:54:53 -0400 Subject: [PATCH 03/37] making tests more robust with bottles to verify the whole hierarchy oh dependencies and dependants is upgraded as expected --- Library/Homebrew/test/cmd/install_spec.rb | 9 +- Library/Homebrew/test/cmd/upgrade_spec.rb | 84 ++++++++++++++++++- .../spec/shared_context/integration_test.rb | 43 +++++++--- 3 files changed, 117 insertions(+), 19 deletions(-) diff --git a/Library/Homebrew/test/cmd/install_spec.rb b/Library/Homebrew/test/cmd/install_spec.rb index ef74f06cc3..d9768624f1 100644 --- a/Library/Homebrew/test/cmd/install_spec.rb +++ b/Library/Homebrew/test/cmd/install_spec.rb @@ -97,10 +97,13 @@ RSpec.describe Homebrew::Cmd::InstallCmd do end it "installs with asking for user prompts with installed dependent checks", :integration_test do + setup_test_formula "testball-parent", <<~RUBY + depends_on "testball1" + RUBY + setup_test_formula "testball1", <<~RUBY depends_on "testball5" - # should work as its not building but test doesnt pass if dependant - # depends_on "build" => :build + depends_on "testball-build" => :build depends_on "installed" RUBY setup_test_formula "installed" @@ -109,7 +112,7 @@ RSpec.describe Homebrew::Cmd::InstallCmd do RUBY setup_test_formula "testball4", "" setup_test_formula "hiop" - setup_test_formula "build" + setup_test_formula "testball-build", "" # Mock `Formula#any_version_installed?` by creating the tab in a plausible keg directory keg_dir = HOMEBREW_CELLAR/"installed"/"1.0" diff --git a/Library/Homebrew/test/cmd/upgrade_spec.rb b/Library/Homebrew/test/cmd/upgrade_spec.rb index 59918aaf02..fa50430084 100644 --- a/Library/Homebrew/test/cmd/upgrade_spec.rb +++ b/Library/Homebrew/test/cmd/upgrade_spec.rb @@ -29,11 +29,11 @@ RSpec.describe Homebrew::Cmd::UpgradeCmd do expect(HOMEBREW_CELLAR/"testball/0.0.1").not_to exist end - it "upgrades with asking for user prompts with dependants checks", :integration_test do + it "upgrades dependencies with asking for user prompts", :integration_test do setup_test_formula "testball", <<~RUBY depends_on "testball5" # should work as its not building but test doesnt pass if dependant - # depends_on "build" => :build + depends_on "testball-build" => :build depends_on "installed" RUBY setup_test_formula "installed" @@ -42,7 +42,7 @@ RSpec.describe Homebrew::Cmd::UpgradeCmd do RUBY setup_test_formula "testball4" setup_test_formula "hiop" - setup_test_formula "build" + setup_test_formula "testball-build" (HOMEBREW_CELLAR/"testball/0.0.1/foo").mkpath (HOMEBREW_CELLAR/"testball5/0.0.1/foo").mkpath @@ -72,4 +72,82 @@ RSpec.describe Homebrew::Cmd::UpgradeCmd do expect(HOMEBREW_CELLAR/"testball4/0.1").to be_a_directory expect(HOMEBREW_CELLAR/"testball4/0.0.1").not_to exist end + + it "upgrades only the ‘testball’ formula, prompts for dependent checks, and verifies that other fields are updated", + :integration_test do + content = <<~RUBY + version "0.1" + depends_on "testball-parent" + RUBY + setup_test_formula "testball-parent-parent", content, testball_bottle: true + content = <<~RUBY + version "0.1" + depends_on "testball" + RUBY + setup_test_formula "testball-parent", content, testball_bottle: true + + content = <<~RUBY + depends_on "testball5" + # should work as its not building but test doesnt pass if dependant + # depends_on "build" => :build + depends_on "installed" + version "0.1" + RUBY + setup_test_formula "testball", content, testball_bottle: true + setup_test_formula "installed" + + content = <<~RUBY + version "0.1" + depends_on "testball4" + RUBY + setup_test_formula "testball5", content, testball_bottle: true + content = <<~RUBY + version "0.1" + RUBY + setup_test_formula "testball4", content, testball_bottle: true + setup_test_formula "hiop" + setup_test_formula "build" + + (HOMEBREW_CELLAR/"testball/0.0.1/foo").mkpath + (HOMEBREW_CELLAR/"testball5/0.0.1/foo").mkpath + (HOMEBREW_CELLAR/"testball4/0.0.1/foo").mkpath + (HOMEBREW_CELLAR/"testball-parent/0.0.1/foo").mkpath + (HOMEBREW_CELLAR/"testball-parent-parent/0.0.1/foo").mkpath + + keg_dir = HOMEBREW_CELLAR/"installed"/"1.0" + keg_dir.mkpath + touch keg_dir/AbstractTab::FILENAME + + regex = / + Formulae\s*\(5\):\s* + (testball|testball5|testball4|testball-parent|testball-parent-parent) + \s*,\s* + ((?!\1)testball|testball5|testball4|testball-parent|testball-parent-parent) + \s*,\s* + ((?!\1|\2)testball|testball5|testball4|testball-parent|testball-parent-parent) + \s*,\s* + ((?!\1|\2|\3)testball|testball5|testball4|testball-parent|testball-parent-parent) + \s*,\s* + ((?!\1|\2|\3|\4)testball|testball5|testball4|testball-parent|testball-parent-parent) + /x + expect do + brew "upgrade", "--ask", "testball" + end.to output(regex) + .to_stdout.and not_to_output.to_stderr + + expect(HOMEBREW_CELLAR/"testball/0.1").to be_a_directory + expect(HOMEBREW_CELLAR/"testball/0.0.1").not_to exist + expect(HOMEBREW_CELLAR/"testball5/0.1").to be_a_directory + expect(HOMEBREW_CELLAR/"testball4/0.1").to be_a_directory + expect(HOMEBREW_CELLAR/"testball-parent/0.1").to be_a_directory + expect(HOMEBREW_CELLAR/"testball-parent/0.0.1").not_to exist + expect(HOMEBREW_CELLAR/"testball-parent-parent/0.1").to be_a_directory + expect(HOMEBREW_CELLAR/"testball-parent-parent/0.0.1").not_to exist + + # Those directories shouldn't exist anymore + # brew upgrade testball remove testball directory but not the following one + # Cleanup isn't applied on the dependencies + # expect(HOMEBREW_CELLAR/"testball5/0.0.1").not_to exist + # expect(HOMEBREW_CELLAR/"testball4/0.0.1").not_to exist + end end diff --git a/Library/Homebrew/test/support/helper/spec/shared_context/integration_test.rb b/Library/Homebrew/test/support/helper/spec/shared_context/integration_test.rb index f8f3b0f60a..707831b799 100644 --- a/Library/Homebrew/test/support/helper/spec/shared_context/integration_test.rb +++ b/Library/Homebrew/test/support/helper/spec/shared_context/integration_test.rb @@ -130,33 +130,50 @@ RSpec.shared_context "integration test" do # rubocop:disable RSpec/ContextWordin end end - def setup_test_formula(name, content = nil, tap: CoreTap.instance, + def setup_test_formula(name, content = nil, testball_bottle: false, tap: CoreTap.instance, bottle_block: nil, tab_attributes: nil) case name when /^testball/ - case name - when "testball4", "testball5" - prefix = name - program_name = name - when "testball2" - prefix = name - program_name = "test" + name_to_prog = { + "testball4" => "testball4", + "testball5" => "testball5", + "testball-build" => "testball-build", + "testball-parent" => "testball-parent", + "testball-parent-parent" => "testball-parent-parent", + "testball2" => "test", + } + + if (prog = name_to_prog[name]) + prefix = name + program_name = prog else - prefix = "testball" + prefix = "testball" program_name = "test" end - tarball_name = "#{prefix}-0.1#{"-linux" if OS.linux?}.tbz" + tarball_name = "#{prefix}-0.1.tbz" tarball = TEST_FIXTURE_DIR / "tarballs/#{tarball_name}" content = <<~RUBY desc "Some test" homepage "https://brew.sh/#{name}" url "file://#{tarball}" - sha256 "#{tarball.sha256}" - + #{ unless testball_bottle + <<~SHA_BLOCK + sha256 "#{tarball.sha256}" + SHA_BLOCK + end } option "with-foo", "Build with foo" - #{bottle_block} + #{ if testball_bottle + tarball_bottle_name = "#{prefix}-0.1.all.bottle.tar.gz" + tarball_bottle = TEST_FIXTURE_DIR / "tarballs/#{tarball_bottle_name}" + <<~BOTTLE_BLOCK + bottle do + root_url "file://#{TEST_FIXTURE_DIR}/tarballs" + sha256 cellar: :any, all: "#{tarball_bottle.sha256}" + end + BOTTLE_BLOCK + end }#{bottle_block} def install (prefix/"foo"/"#{program_name}").write("#{program_name}") if build.with? "foo" prefix.install Dir["*"] From 960b4343cc735635f2c0d6c45a4f1c3b1dd66f9e Mon Sep 17 00:00:00 2001 From: thibhero Date: Sat, 31 May 2025 13:25:25 -0400 Subject: [PATCH 04/37] updating tarball to remove attributes from MacOS --- .../tarballs/testball-0.1.all.bottle.tar.gz | Bin 676 -> 464 bytes .../testball-parent-0.1.all.bottle.tar.gz | Bin 683 -> 468 bytes ...testball-parent-parent-0.1.all.bottle.tar.gz | Bin 887 -> 471 bytes .../tarballs/testball4-0.1.all.bottle.tar.gz | Bin 675 -> 462 bytes .../tarballs/testball5-0.1.all.bottle.tar.gz | Bin 676 -> 462 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Library/Homebrew/test/support/fixtures/tarballs/testball-0.1.all.bottle.tar.gz b/Library/Homebrew/test/support/fixtures/tarballs/testball-0.1.all.bottle.tar.gz index f1b58c7a50493219f3f804fbcf2e471001990d30..c9ea4c65b7a04b6288321250bae50e83fd56a68e 100644 GIT binary patch literal 464 zcmV;>0Wba^iwFSaIy-0p1MQgIPQox4hO3D&;;|n0++?)f+KmGarZIs8f&xK2krZgc zA_E-La1maBiHDweJ6?&mV8^fgW3pkCK1F>V0{oc$MUBAkk%{Yh-gpf%o?AL5i zV}kni2#6`djOmofh6w9S#{kj@*EHs_>vK;o#cw#(hVa_U+VQ&Uv{sBW+{d{7Blx5E zYZav7Xy#ZKe`4r^_#5(KLHrG3G5}FD%b8}!;|~r_55YbFSzd#=0xZKJ!8>py3z6kP zmf-nqvmxzbF+aQwdc4STJkw-v^8TdOb~WDVG=Vmid4Imkg|JD* zGRFG9;=PpMb>YQBKL^(8AEO!lGkGQe*b8?Vi`jAg>j=8OQF*|P{of@2W8F~xZyQX-U#oaB1-K&QIpp_XhVc{sN2!jK|Jw@6|LrtW`k#2f zP|tz2`k(WECZSCEziqJ0{{??zi1L5`o++WBzU1rkuGiqxr7siy9V z1rk1_Ku|~}E_u3Xudv71#jZDpoKRW{s1mR;&QCh}1GZ0`_~XRbkvEQ7j_;q5-N6{M zEsM@nB+7L*(-g`r#)T%wZEQ(Fm{mkLv$RTKH$iEGOjhySyPMsnLQDNErmxDwJ27 zcRzk!|NdTHOm)|!j(SU85d=XHWH%^@sPF!5H4p@Og~am%1ucP26ICER1DahZlLw`s zCD3W23gpXxWJNlSsnhXPkl7cUAdJroLBdeJQ-$kA|;NIs7Lwbko? z1VR2|lx($8t&sVGV2L=^Qfc4P0tBKtS$+w~B!3ouAP?yjv;;a$6kh}o1VQ%AeE*MW zd{<|{UVi?|E^OTYMGyqpC4T{v Kn)h}9E&u?UomG!F{8nd9Ka>CX z%>M{76o0FVEUbBqMe(tCr}y9Zp_|4q+-VmrqFt%IoeTh%}v0lv^RhFT9s$WQ#At8U}})`IbW8%>n{ zryfwxKCn>#VgF|%N~rOF>tKfeLrH2gYW&~7CrbZ%PyfaG|L*@7b+I}B4F-c@mAnJ? K>=>>98UO&k=HhJt literal 683 zcmV;c0#yAUiwFQ2X*y^C1MQmKZrU&u#~n(wjNNcG?b0u>)DHPz7f1<(sz{wWHPzHz zu|UFy6bK5b#3fHR?G^SIyV&*SkV8kIfHnnI#`#G{{}9_JP8|Eh*s(v3TW%1%9l4P| zjL*mpV2qi%PG@SQ%2hVgIh5;+8=9dp!=#MsT;+u7yQs`E_v6@&L{;Kmzt!`ja9uvv z8}x@8{J?!Y=z$O~wZGC-YEILM!^qF<8sd2vnzp|Exw+8(rbd$!Tql%eR)Y;3dHa*o z*DpwpkoRtzUOV)T0?9e@QkW|2LRj*9k`$Qdu!`$k+PAkia5$NlLY^nf{r`hIx%6Gn zkIu3i2e$S9lFA?Vf0gN)N$6f)oFni5B}NBvf8bZRsg(`AtdqCXTbP-EB$D~)rz zn_AVb+Z!o}C;%7R;BedMQ`qn0J9t*&f9BDDTmR=8W7<;uHw?xx{_hE?dhc;Uk`5)4 zR3-W8tTNaNIndLjaN;9uw}P+*?hb>b?k9v1h44o3sQ%xDML%cEazd`4%N;RDjTU@B z${?)OpuF6?`}*zr#}|7s)!UFd>aBQ15ClPx-5{kRzxub;KoH~^l8g@&)B>HRDnWV< zG`~=$2ueXM&}pg?VlACBfuFf-BD_FA_{WBnoQ%(Jdp$(QuMV zF^T{6_49uOLH=W;e9fs<$-{(Tg(TKeVV~y(2t;$T`Vo*z|15k%ey3AV3v`+)eh454 zg6x~+^*^TY%=du(#r`jio4EgLA3W9mkuPpG!v)}N`#)ywuNs=kN=&=}$@;IZ8@T?9 RAPBNcegPNIt_T1w004o@TlD|{ diff --git a/Library/Homebrew/test/support/fixtures/tarballs/testball-parent-parent-0.1.all.bottle.tar.gz b/Library/Homebrew/test/support/fixtures/tarballs/testball-parent-parent-0.1.all.bottle.tar.gz index 477ed327212cafed81a05b2c0d3e727abdfc6093..7675bd8c2fcbbf656edf24be147c0804a861b3f6 100644 GIT binary patch literal 471 zcmV;|0Vw_-iwFS9Iy-0p1MQaGO2aT1hNB?jJl5l!i`|zrNw)(Jst5{-Iz{J+BhG-s zb(=NHF2V~CJoLod@k+b}Q=R{|oh(jtc}n=wlHY#3$*a|wK9tSod`HHrrF)@>YytoQ z=lC&-r${I~#%D0$K!or)H4ROTL4Yu~x{4Ie&$NuqQuJ}-@L0v|w080+YP2%O>Fwhs z{t@)o`S)tz5nFTQ<)1SDDgVqoBFTRMoFNRh7Ldh==O0bXPNH#y)@2=UY~w2Kk$gi_ zrchH(O-bHw`WrIb*{SrZNslX2rav?pd;LCBZ%3Z&behWR#O({!lC8Q*8eHGs?cH7; zY*^T&BaIaOZ_4h9l1C~oS~v%C^-tiv{wWBc2zPC4Fpm+}zYjRljYut!fRzL<3F3RS zOb9T}d4UIbZFMoMEUm2WE_+?6b?kj5*M)E^45PVXWmh!Tt0$!bE8}g`X>C8N(;JN! ze)~U+Dk=Ims<-C>`}Th?_rC}Tb^dP{WaQtg#pVi#)WCC?{~;LrhX14BgK++DC^-K& z(q!oW)dLQA4&>_plm9aZ0CWCt7^L_=D09jK=l}ja8Tz+$`{(QblmDZp1GxL&;cz&9 Nk_X99P!0eZ002*2@Bsh- literal 887 zcmV--1Bm<|iwFQAYdUBE1MQm6ZxTTi$7g995ieXc9_Mb{&MfvQ@U*U++UEUtoUiGQ4?j;Cc3m zSF>8Jr(MgnJ08d~i4(?{p=orWdZ1ik106!S#<;GEhiKqG<0_$AtXC1j>4|5#;!?ch zX6@K^ov?ORquuPx7zgg-Om7I@`RgxNw5^8iF2}GBMA?5%;S=^RHUOQ_M7}t8-2QWnw!LQCUgd_G*R{No(`A-d z3`6Jnm5id&%Gzdm>!o~n*s_jJR*##FhTX~JHM&(Un!BQIe_ifbp6AMSr!8CEZp)T8 znjP`YDR&N?)$*Eo6qKU5Zq6hlyZ}r#W5B50CzI^QcjF23|M7YMDEsFsW9p>;X9h$6 zpAb^0wJ#7xWWvj>zpnqMDDLk8 zgO<>$b;K)Tlj@F*0X1!>RD%BL>cQ9VJHNh|XQ4s_|5ae=@0!cr(+RH!? zS$(uC&!Fqy|SM^yfoqUI*@zYL~f{!cPoB>(3v2|W9!iw!xJ z|Ks=gAj;(Liqh!)hok@byRP%j?pU3=?Kk-N;sYZ&nNOf z6{a%<^M8_HGXF>CIayiZoT-|oWi(?}p3lf!SIy_9*?zLTyRSF558mW6>PlEH&se81 z8^^SrD$xZ&K#J?ZQPhCYnG{Ac`Bw0FywZ zfVCP9;Q>rsy74-m#49)jv;rcUv>0WcX7aVo{C|08-cVhKHQ8>nEJzK6kj*(9L@|t* zph0{CVvev7loMSMVQOOzAWv^fF*nzt4D?jOW~tEj@m%k$aO-9;gRMH*%i z>;G8x50z}FAe;0#FjxN=P3T`>i~#H>I*S=Bx&A4Fe%SKWF1DE?xFayNh)V>*uH$65 z4Rc3(UUC2M==8wq%P4@@t41F*p84&4SXN^F zYt^UZ0l)44;`^TvWc=SE7|*{|4fGY@t7ON}`ym+niT~pQGvogjg7JS#&A9$!518aR zFjxOm{?De282`5jX81quQsQ#s|NcGW`cLEbpRfOE|Hr8i=KePr42Cp$1rwx)JpdX2 E02qer{r~^~ literal 675 zcmV;U0$lwciwFS6XgX*B1MQmKZrU&u#~n&F#%{QpcIhWb?ZipAsRR_NB6aH2R8x1w z0tp{dASk2~mpomySJ-3hV%M9K96nkKs1mR;&QCh}1GZ0`_~XRbkvEE(j_->zvNITC zmSNCD%~ZL@5}iW1!MG_*!Ay%Xu3OwB)Yx5><~)odCzMr*y1i!C3xiep9Jk*atnmZ) zG1CJfnzg^$P^)&sj)KtJ@-^i1Fojs%{@hwrH%zV(%C=mO7di6wC#N6ZkqjZ9 zoff^Z={*JF-^hDunzT!4@%M3DV49;;Smm;OcXtaP$J0{C+hjiezc}M7&vCu*Y}@m| zrtz<9{Mq=obRh`cOUF6#@vk%5k9vLYoLi!38bwVvRaVq2%jA}k*95gMuIks{)OOo< zI-~P$&vm^)zG%?vdZm0T)4tZ!u@gn1+6wxrGaUM!df6MuZd4z%gY)`DxszI@Tr007 zFQWilY>mTBvrm4%kMH1Fi2pl^{+q@>7mSJL@n5%0jQ@K=sXVxxka$4lNUBQi<*Yfd zB{HC=apBlU&}#ZY6WkpJaotY{BP!u_|4IFSNellZBsn3M-{H2Lq=pMVAf+Evt581I zxc~9<=J#WHG1Xm@I_xfaMGyo*klmo9lKb#)tAQZM8zi0|C};_ElBxpf8PM!PnF1&U zErCu_RUlsmGz*#oEr3$c66hpVn6wmFd?;|`>EcC!rH4X6ORu_R1UVW`QYpmozqWe) zk08i@jFPR|)e4y{2$qOrEtU3tT7W<_C(ADZne@-XPh_4>K}(>MRPjXsK@eo$%=iD8 z%6D`I?DglrgvJG)|Jnyn+duT=ZEk%7c+>fhr2REhSWIWK10?&uhK~Ec2!bHH$xZ&K!7Sg@$Z1QG~}MsXt9KS%n=rXa-u6DOl>Rx`{Zl2M-n3-yoe3H=LSOYNOZ&g@{wD+*|F;Up^KVr=eFeBG+A;Kg2*!Tm|G2>1_`j84{NGwLuK&;jMtKe_ z)IXj)|82^s@qep;qUrt*F+!O!fd8Ix{l{_pFV_Ee|HrAY&HZmM7z}ap4q%Lm^#B?G E0Gn3q3;+NC literal 676 zcmV;V0$cqbiwFP?X*y^C1MQmKZrU&u#~n&F#%{QpcIhWb?Zk=MMJ1q66{%CFrkc7d z79e~`fuN8|T=I0&USW^1i(PLHIefGfP$ghxoS$^`2W+1>@yCg=BX1bhUEjCP$j)Gl zNz0-WwG-tAo9GnEEyitO3ua5oxGA|L)Y@H@<~$4|H&j)LI^BB53xiep+-9%aU*iYv zW2Of}G;4pork9d>FwIfOt#VnsySs&tqiHGRbuu6SpWV@w=Qh3YY}@m| zrtxnY{K@#2rmzUzOUF6#@ozHPi@H7UoJ*0nt-N8{I?EeU+C2X;YY6IGTve~X>aCXV zwuk4PZnNq2vw4eNS4+iPmG-5gkK8B<^+wRs-NC^3^viBvb)#y(6`WTuitWTo#Y%B4 zSrrA~Vrv|3ntihSeS8PcLj2!R^xri8xnN8@jsK>U82|T#R(fc1LgE3HA&F|4=d)(O zmPmn~#)V@aL8I;mb#QkW#C1O*jOc_{{YUlxr7Zk2VUiPa`EBl~Noug*15$cHxeVnq zwfi4GZ+?F-E~Yluqz*buUJ(RA5M(!KiDcgW+iD;P@(PLP2MSsM9VeNdB&0lew_$E5uYTS#Uy)d42^zm~xLUj#vrUGf*K Kb@;>pE&u>Z15k

Date: Sat, 31 May 2025 14:03:08 -0400 Subject: [PATCH 05/37] updating name tarball for linux --- .../test/support/helper/spec/shared_context/integration_test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Library/Homebrew/test/support/helper/spec/shared_context/integration_test.rb b/Library/Homebrew/test/support/helper/spec/shared_context/integration_test.rb index 707831b799..113e6e82fa 100644 --- a/Library/Homebrew/test/support/helper/spec/shared_context/integration_test.rb +++ b/Library/Homebrew/test/support/helper/spec/shared_context/integration_test.rb @@ -151,7 +151,7 @@ RSpec.shared_context "integration test" do # rubocop:disable RSpec/ContextWordin program_name = "test" end - tarball_name = "#{prefix}-0.1.tbz" + tarball_name = "#{prefix}-0.1#{'-linux' if OS.linux?}.tbz" tarball = TEST_FIXTURE_DIR / "tarballs/#{tarball_name}" content = <<~RUBY From b1c8567977a42cd316d4a0f4b692fad2a81e843a Mon Sep 17 00:00:00 2001 From: thibhero Date: Sat, 31 May 2025 14:17:40 -0400 Subject: [PATCH 06/37] adding tarball parent for linux --- .../tarballs/testball-parent-0.1-linux.tbz | Bin 0 -> 433 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Library/Homebrew/test/support/fixtures/tarballs/testball-parent-0.1-linux.tbz diff --git a/Library/Homebrew/test/support/fixtures/tarballs/testball-parent-0.1-linux.tbz b/Library/Homebrew/test/support/fixtures/tarballs/testball-parent-0.1-linux.tbz new file mode 100644 index 0000000000000000000000000000000000000000..db8dd018f6328f216b699da9c812d7ef8042087e GIT binary patch literal 433 zcmV;i0Z#rxT4*^jL0KkKS@Mz?W&i;<|G576MUYqn|KdA$|6u=T-a`TaMnFIS00}Sw zcr~DEQ%_N#X{JC7jSVymfB+f;Ajy!#6IAkz8X5p-&;S4c00001B!ZbHr<$jlqr}Q& zeyO!R0EehHNHf%BG(1yjnxvhEOpvvlGlR{vt=t;1dkG`zO*Q8y|D!t_21wszj8k2B zR%DSoCol^8U}Og*w#V53(hf*m47z;)Gotft4m^mKnJO740RXTZ>8q-15b0Lr8Xpe^ z#PWsv2?N`yT_U=)e3Tm5C@cZzc0gcHU{*uk3bU-TtU|`+~75u4`0c8dVi2)Ik zq%Z+J@u0;bN)#l8WD5!Crov$4l3)t~E~^c^t3mHiPYE`&? zuKnsv-_0FERV2m|;hE5v%a~vq<cfxB zSPKee5HhPuD~Ia0DRqRuV`x_h1wmjg;hB0urLkE_;V^cnsgkl!k8?OCN-A(=^a%$K bQ-jq(iZ;uILnTuR;r|zMML1B9@{$;4hZwZ9 literal 0 HcmV?d00001 From 326376ef44fb95917cb64a29b646afe19c35545e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibaut=20H=C3=A9rault?= Date: Sun, 1 Jun 2025 03:25:16 +0200 Subject: [PATCH 07/37] Removing attributes from macOS --- .../tarballs/testball-0.1.all.bottle.tar.gz | Bin 464 -> 172 bytes .../tarballs/testball-build-0.1-linux.tbz | Bin 433 -> 182 bytes .../fixtures/tarballs/testball-build-0.1.tbz | Bin 433 -> 172 bytes .../tarballs/testball-parent-0.1-linux.tbz | Bin 433 -> 180 bytes .../testball-parent-0.1.all.bottle.tar.gz | Bin 468 -> 176 bytes .../fixtures/tarballs/testball-parent-0.1.tbz | Bin 433 -> 181 bytes ...testball-parent-parent-0.1.all.bottle.tar.gz | Bin 471 -> 176 bytes .../fixtures/tarballs/testball4-0.1-linux.tbz | Bin 190 -> 176 bytes .../tarballs/testball4-0.1.all.bottle.tar.gz | Bin 462 -> 173 bytes .../support/fixtures/tarballs/testball4-0.1.tbz | Bin 186 -> 172 bytes .../fixtures/tarballs/testball5-0.1-linux.tbz | Bin 188 -> 177 bytes .../tarballs/testball5-0.1.all.bottle.tar.gz | Bin 462 -> 171 bytes .../support/fixtures/tarballs/testball5-0.1.tbz | Bin 184 -> 169 bytes 13 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Library/Homebrew/test/support/fixtures/tarballs/testball-0.1.all.bottle.tar.gz b/Library/Homebrew/test/support/fixtures/tarballs/testball-0.1.all.bottle.tar.gz index c9ea4c65b7a04b6288321250bae50e83fd56a68e..91294f5506273e1a118e4e2b4e8d04387f6d48f1 100644 GIT binary patch literal 172 zcmb2|=3oE==C_v|xegf!I9!xbRlmS_Hs##qqy0Wba^iwFSaIy-0p1MQgIPQox4hO3D&;;|n0++?)f+KmGarZIs8f&xK2krZgc zA_E-La1maBiHDweJ6?&mV8^fgW3pkCK1F>V0{oc$MUBAkk%{Yh-gpf%o?AL5i zV}kni2#6`djOmofh6w9S#{kj@*EHs_>vK;o#cw#(hVa_U+VQ&Uv{sBW+{d{7Blx5E zYZav7Xy#ZKe`4r^_#5(KLHrG3G5}FD%b8}!;|~r_55YbFSzd#=0xZKJ!8>py3z6kP zmf-nqvmxzbF+aQwdc4STJkw-v^8TdOb~WDVG=Vmid4Imkg|JD* zGRFG9;=PpMb>YQBKL^(8AEO!lGkGQe*b8?Vi`jAg>j=8OQF*|P{of@2W8F~xZyQX-U#oaB1-K&QIpp_XhVc{sN2!jK|Jw@6|LrtW`k#2f zP|tz2`k(WECZSCEziqJ0{{??zi1L5`o+kHc4wYI00;m8fCw-ExC~^( z(+Q>~0%?H8OieJFVqhki0;q^+nuFBQMNQrj+!2`fo8`+l36I=lGW!Db|s kI9SP(C)HUMZ{%W^2R!KEqxs7v=!5)S$rRy2K!z@H99;NQ+yDRo literal 433 zcmV;i0Z#rxT4*^jL0KkKS@Mz?W&i;<|G576MUYqn|KdA$|6u=T-a`TaMnFIS00}Sw zcr~DEQ%_N#X{JC7jSVymfB+f;Ajy!#6IAkz8X5p-&;S4c00001B!ZbHr<$jlqr}Q& zeyO!R0EehHNHf%BG(1yjnxvhEOpvvlGlR{vt=t;1dkG`zO*Q8y|D!t_21wszj8k2B zR%DSoCol^8U}Og*w#V53(hf*m47z;)Gotft4m^mKnJO740RXTZ>8q-15b0Lr8Xpe^ z#PWsv2?N`yT_U=)e3Tm5C@cZzc0gcHU{*uk3bU-TtU|`+~75u4`0c8dVi2)Ik zq%Z+J@u0;bN)#l8WD5!Crov$4l3)t~E~^c^t3mHiPYE`&? zuKnsv-_0FERV2m|;hE5v%a~vq<cfxB zSPKee5HhPuD~Ia0DRqRuV`x_h1wmjg;hB0urLkE_;V^cnsgkl!k8?OCN-A(=^a%$K bQ-jq(iZ;uILnTuR;r|zMML1B9@{$;4hZwZ9 diff --git a/Library/Homebrew/test/support/fixtures/tarballs/testball-build-0.1.tbz b/Library/Homebrew/test/support/fixtures/tarballs/testball-build-0.1.tbz index db8dd018f6328f216b699da9c812d7ef8042087e..6235bb5fb135ad6c63cbd3b8b7ed71694db76e84 100644 GIT binary patch literal 172 zcmV;d08{@$T4*^jL0KkKS$a8kVgLZReTBe)1OPw-?|=Y;c4nRc00;m8fCw-ExC~)2 zGGHbE0~kz9ms~i%DD3u#1?((yv z8#fmJR#5wDrU{7WuLhW_TJf#ySu;%Wt0pB3A=kt7*wNAF*1n9Hl2G=^c5eBU aZN$khX8Y*=b8f02{}*yaI8cy!Id)=GW=u!` literal 433 zcmV;i0Z#rxT4*^jL0KkKS@Mz?W&i;<|G576MUYqn|KdA$|6u=T-a`TaMnFIS00}Sw zcr~DEQ%_N#X{JC7jSVymfB+f;Ajy!#6IAkz8X5p-&;S4c00001B!ZbHr<$jlqr}Q& zeyO!R0EehHNHf%BG(1yjnxvhEOpvvlGlR{vt=t;1dkG`zO*Q8y|D!t_21wszj8k2B zR%DSoCol^8U}Og*w#V53(hf*m47z;)Gotft4m^mKnJO740RXTZ>8q-15b0Lr8Xpe^ z#PWsv2?N`yT_U=)e3Tm5C@cZzc0gcHU{*uk3bU-TtU|`+~75u4`0c8dVi2)Ik zq%Z+J@u0;bN)#l8WD5!Crov$4l3)t~E~^c^t3mHiPYE`&? zuKnsv-_0FERV2m|;hE5v%a~vq<cfxB zSPKee5HhPuD~Ia0DRqRuV`x_h1wmjg;hB0urLkE_;V^cnsgkl!k8?OCN-A(=^a%$K bQ-jq(iZ;uILnTuR;r|zMML1B9@{$;4hZwZ9 diff --git a/Library/Homebrew/test/support/fixtures/tarballs/testball-parent-0.1-linux.tbz b/Library/Homebrew/test/support/fixtures/tarballs/testball-parent-0.1-linux.tbz index db8dd018f6328f216b699da9c812d7ef8042087e..c47d8469368ba0ade02ebfc54312c81d341a5c33 100644 GIT binary patch literal 180 zcmV;l089TuT4*^jL0KkKSq3fjsQ>`JeTBe)1OPw-=YT-~c4yu|00;m8fCw-ExINn3`cU#K2831yLgspQwz7lo--zeYMk$GyWi(ArR%~Qr?khQZ?HM+c;9mp@i(@=M`o$l~8q-15b0Lr8Xpe^ z#PWsv2?N`yT_U=)e3Tm5C@cZzc0gcHU{*uk3bU-TtU|`+~75u4`0c8dVi2)Ik zq%Z+J@u0;bN)#l8WD5!Crov$4l3)t~E~^c^t3mHiPYE`&? zuKnsv-_0FERV2m|;hE5v%a~vq<cfxB zSPKee5HhPuD~Ia0DRqRuV`x_h1wmjg;hB0urLkE_;V^cnsgkl!k8?OCN-A(=^a%$K bQ-jq(iZ;uILnTuR;r|zMML1B9@{$;4hZwZ9 diff --git a/Library/Homebrew/test/support/fixtures/tarballs/testball-parent-0.1.all.bottle.tar.gz b/Library/Homebrew/test/support/fixtures/tarballs/testball-parent-0.1.all.bottle.tar.gz index 3879abf4cbcdd61bba0af8d70e60ae5d63ebd900..6b5908c7219a51e5b8826a1f0afa8fea07537e72 100644 GIT binary patch literal 176 zcmb2|=3oE==C_ybb2S-=G<>u@6}RBl#az4dOBx&hCa(MLuir9Z2?y_z_vOWUW;Y&K zTbAwQ%iX=ZRYd>ig0O_Dsl|tjc7 literal 468 zcmV;_0W1C=iwFR*Iy-0p1MQa2PQox8$E%4k;#tqV8%Mjf9UM4JV*&{T1%h~y6lemG z0gh^T2p_=2qZePtC-D_5e-tyvACrPn`q`RpUH`4WeA}-SeOcq}_HmB~q9fyA1t5f6 zO5rGH;~d*)lz#v*MVK*%+NvVLRDB1Ku3|D_?)s7kYAUkXsx?K>omG!F{8nd9Ka>CX z%>M{76o0FVEUbBqMe(tCr}y9Zp_|4q+-VmrqFt%IoeTh%}v0lv^RhFT9s$WQ#At8U}})`IbW8%>n{ zryfwxKCn>#VgF|%N~rOF>tKfeLrH2gYW&~7CrbZ%PyfaG|L*@7b+I}B4F-c@mAnJ? K>=>>98UO&k=HhJt diff --git a/Library/Homebrew/test/support/fixtures/tarballs/testball-parent-0.1.tbz b/Library/Homebrew/test/support/fixtures/tarballs/testball-parent-0.1.tbz index db8dd018f6328f216b699da9c812d7ef8042087e..4bc8f25414cfad9d3764a08653305b3adda7c726 100644 GIT binary patch literal 181 zcmV;m080NtT4*^jL0KkKSrk)dkN^O>eTBe)1OPw-_kaNec4yuI00;m8fCw-ExC~^( z(+Q>~0%?H8OieJFVqhki0;rQs6!ko#O+2Pdo~BPzvut$Aybw*0h-vM4YJ0L(V>F@) zB}VEzJFjzFBIDsBUA+-;E7UX5t7UAMj#GuRV>#Cn8q-15b0Lr8Xpe^ z#PWsv2?N`yT_U=)e3Tm5C@cZzc0gcHU{*uk3bU-TtU|`+~75u4`0c8dVi2)Ik zq%Z+J@u0;bN)#l8WD5!Crov$4l3)t~E~^c^t3mHiPYE`&? zuKnsv-_0FERV2m|;hE5v%a~vq<cfxB zSPKee5HhPuD~Ia0DRqRuV`x_h1wmjg;hB0urLkE_;V^cnsgkl!k8?OCN-A(=^a%$K bQ-jq(iZ;uILnTuR;r|zMML1B9@{$;4hZwZ9 diff --git a/Library/Homebrew/test/support/fixtures/tarballs/testball-parent-parent-0.1.all.bottle.tar.gz b/Library/Homebrew/test/support/fixtures/tarballs/testball-parent-parent-0.1.all.bottle.tar.gz index 7675bd8c2fcbbf656edf24be147c0804a861b3f6..56106a9131dfb4cf116f3ff44f28aaac2ddebe64 100644 GIT binary patch literal 176 zcmb2|=3oE==C_w#a~)EUXh_sQD!t;*toGN2LSk!}&%N8v%k}GGR3ppc?>|2`a&fI! z{hBJiJFm3Ua_*_xoDknMfjQF4S<>e{Zx%{F!v3*W_S(_P+Zu0I?MpheRo^gstylGp zt(xR{WVMP$^Y25UtIgk|5o$A#a+LXR}~zWxDow3vi>IDU+3gKmzEv6 ZyZPT9dx)zbYytoQ z=lC&-r${I~#%D0$K!or)H4ROTL4Yu~x{4Ie&$NuqQuJ}-@L0v|w080+YP2%O>Fwhs z{t@)o`S)tz5nFTQ<)1SDDgVqoBFTRMoFNRh7Ldh==O0bXPNH#y)@2=UY~w2Kk$gi_ zrchH(O-bHw`WrIb*{SrZNslX2rav?pd;LCBZ%3Z&behWR#O({!lC8Q*8eHGs?cH7; zY*^T&BaIaOZ_4h9l1C~oS~v%C^-tiv{wWBc2zPC4Fpm+}zYjRljYut!fRzL<3F3RS zOb9T}d4UIbZFMoMEUm2WE_+?6b?kj5*M)E^45PVXWmh!Tt0$!bE8}g`X>C8N(;JN! ze)~U+Dk=Ims<-C>`}Th?_rC}Tb^dP{WaQtg#pVi#)WCC?{~;LrhX14BgK++DC^-K& z(q!oW)dLQA4&>_plm9aZ0CWCt7^L_=D09jK=l}ja8Tz+$`{(QblmDZp1GxL&;cz&9 Nk_X99P!0eZ002*2@Bsh- diff --git a/Library/Homebrew/test/support/fixtures/tarballs/testball4-0.1-linux.tbz b/Library/Homebrew/test/support/fixtures/tarballs/testball4-0.1-linux.tbz index 72957a4c136c5006830afd1f370975d4a9ea384c..1cf36d7478ec1cd515c4db99db075cb2c4a5dc64 100644 GIT binary patch literal 176 zcmV;h08jryT4*^jL0KkKSq*h>MgRb~eTBe)1OPw-?|=aWc4wYI00;m8fCw-ExC~^( z(+Q>~0%?H8OieJFVqhki0;q|U%3@?~5r(7G^*lP`$J-5vCg?;s+Qj?Ol2$jR5K$^U zD6^8ySH!ael1EJPMM+&k@0M!WF&I3k;I~?Eu2NMqyBaRCg<+rD^z?YsJqs>LLz$a% eOqi8<-fEVn+jDCEY{h~g{}*yaI8cxcb#F%4>`Qt8 literal 190 zcmV;v073skT4*^jL0KkKSrGmy%m4s~eUQ+A1b{#T|9}Amc4wYI1V8`?FaWu%HBA`} zGzKFe88c97pQ4XZpa1{>1ym-cnKaPTA)si}L(9vpms@AzH3I%L4@sb<2%AYNVHwJ; z$|zo?qhyfe!6F*iB6P+{t%)R6F_qe_Q1&2(22(hsvcieLE@06hgoTZPE7ZE%G5I2&|x45mIzE(8Yui-$rRy2KtuSaFb%IxE&u=k diff --git a/Library/Homebrew/test/support/fixtures/tarballs/testball4-0.1.all.bottle.tar.gz b/Library/Homebrew/test/support/fixtures/tarballs/testball4-0.1.all.bottle.tar.gz index 6b619cca1ebfdd786d31b951cd46bd64e7e28425..38dfb779246df71b53a2efb265fa4afb3e18a755 100644 GIT binary patch literal 173 zcmb2|=3oE==C_v|xegf!I9!xbRlneKR^@r7VZcJAEg%1F$xZ&K#J?ZQPhCYnG{Ac`Bw0FywZ zfVCP9;Q>rsy74-m#49)jv;rcUv>0WcX7aVo{C|08-cVhKHQ8>nEJzK6kj*(9L@|t* zph0{CVvev7loMSMVQOOzAWv^fF*nzt4D?jOW~tEj@m%k$aO-9;gRMH*%i z>;G8x50z}FAe;0#FjxN=P3T`>i~#H>I*S=Bx&A4Fe%SKWF1DE?xFayNh)V>*uH$65 z4Rc3(UUC2M==8wq%P4@@t41F*p84&4SXN^F zYt^UZ0l)44;`^TvWc=SE7|*{|4fGY@t7ON}`ym+niT~pQGvogjg7JS#&A9$!518aR zFjxOm{?De282`5jX81quQsQ#s|NcGW`cLEbpRfOE|Hr8i=KePr42Cp$1rwx)JpdX2 E02qer{r~^~ diff --git a/Library/Homebrew/test/support/fixtures/tarballs/testball4-0.1.tbz b/Library/Homebrew/test/support/fixtures/tarballs/testball4-0.1.tbz index c7c57aee5f2c729db393dba428cf85dd098feca9..09ef853cf1ead6e2f902a3097e7508b58ad26ee3 100644 GIT binary patch literal 172 zcmV;d08{@$T4*^jL0KkKSsUSZ4gdhOe}%w+1OPw-|9}7l5CC>&o&W#{004jpFaWql zG{j*VU;qHdn2aM#000G15vqQQZ8bF7fsIW)PS2b3&khJC$V576iEnLQtR9AmL=;Mo z3M|2PH!5n8*K4Aru~55d>aR4}DA_Jn?xL5*x@VD8+bXiUg<-eb^ze4yZOm3Aq0wgc aDDRo&FDD#o{&1oo*t?P`!i0d|3%GC*TS+4T literal 186 zcmV;r07d^oT4*^jL0KkKS^F(o&W?u00=MuyCH@~ z1k(a!F*IN$G=o!7pfo)}pa4}wnrZ4ZG}A!P^)hMdO*S^)!rBp#F27L8S_=?~ys0J; zu3auALZu5h+zf{XsgQ$}+{S}An*$5&#)Cq*h)G7GyB=gu!70#CcAi;hs6QtVL3`3mL*mH79FCS`?+~IidVr$rRy2L+rfls1&(OZ2$lO diff --git a/Library/Homebrew/test/support/fixtures/tarballs/testball5-0.1-linux.tbz b/Library/Homebrew/test/support/fixtures/tarballs/testball5-0.1-linux.tbz index 4d35e20d2b6e98b55beb4be565c208e48bda91aa..5fe9e86f878298002ebc01c64f958433e7d7d45b 100644 GIT binary patch literal 177 zcmV;i08alxT4*^jL0KkKSu$bvtN;MGeTBe)1OPw-?|=aWc4wYI00;m8fCw-ExC~^( z(+Q>~0%?H8OieJFVqhki0;*`4PgKni+foc_Jx^1+wfXVOazt4qq|cp8bcYodGeS}( zgx*tCbz3cwL)8OJT`CZ&W|^s@3fTg=xKTb=tHR|_ie77=wIs*W^zwJt8kJarXG0DR feHSS4$k`2z_x5c5Zo4F;e~Y;yoG3^cF#A>jrHV=E literal 188 zcmV;t07L&mT4*^jL0KkKS$VhjegFW6eUQ+A1b{#T|9}Amc4wYI1V8`?FaWu%HBA`} zGzKFe88c97pQO~$kN^Mx1ys^%WHb#JfDHq?yPdadxA7Ule)@-%5>}KNiL%ELbK=#t1m_nu$UdF1u|t#F&B_45o2ODA{rp3Nj z)!+98{hYNwr(~h*52gC}TPOds%YBv)+HAdK=l>Z@eD~_7)yIBwsl8D2-{`x-`9GEa UAP$0%5!;RR^Hi2GXfQAU06pJObN~PV literal 462 zcmV;<0Wtm`iwFSRIy-0p1MQZ}PQpMGhDQ@)#I>$xZ&K!7Sg@$Z1QG~}MsXt9KS%n=rXa-u6DOl>Rx`{Zl2M-n3-yoe3H=LSOYNOZ&g@{wD+*|F;Up^KVr=eFeBG+A;Kg2*!Tm|G2>1_`j84{NGwLuK&;jMtKe_ z)IXj)|82^s@qep;qUrt*F+!O!fd8Ix{l{_pFV_Ee|HrAY&HZmM7z}ap4q%Lm^#B?G E0Gn3q3;+NC diff --git a/Library/Homebrew/test/support/fixtures/tarballs/testball5-0.1.tbz b/Library/Homebrew/test/support/fixtures/tarballs/testball5-0.1.tbz index 06def51fbd0e79fd5e65bb76a885fdaf0adf1251..98c4fa6b74bde104aed5ea94f26729d9de6c862e 100644 GIT binary patch literal 169 zcmV;a09OA(T4*^jL0KkKS!D{r!~g)ae}%w+1OPw-?|=XV5CC>&o&W#{004jpFaWql zFqoMz6955>CMHY-zyK9QOp{Gbq-`L^iRsz*!1N{dqhcw(GHF$tY;MYm|55 XdP~v1{NL@=L>w1#ML1B9WeUN>Wu--T literal 184 zcmV;p07w5qT4*^jL0KkKS%nYLQ2+pge~{3C1b{#T|9}7l5CC>(o&W?u00=Muxv)xz zG|&J5Xwy$nYMv1qX`lc!01Bz3(gvCgho~9=$&;nq@4N9D0lM1 Date: Sat, 31 May 2025 21:35:35 -0400 Subject: [PATCH 08/37] double quotes for `brew style` --- .../test/support/helper/spec/shared_context/integration_test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Library/Homebrew/test/support/helper/spec/shared_context/integration_test.rb b/Library/Homebrew/test/support/helper/spec/shared_context/integration_test.rb index 113e6e82fa..40d193effb 100644 --- a/Library/Homebrew/test/support/helper/spec/shared_context/integration_test.rb +++ b/Library/Homebrew/test/support/helper/spec/shared_context/integration_test.rb @@ -151,7 +151,7 @@ RSpec.shared_context "integration test" do # rubocop:disable RSpec/ContextWordin program_name = "test" end - tarball_name = "#{prefix}-0.1#{'-linux' if OS.linux?}.tbz" + tarball_name = "#{prefix}-0.1#{"-linux" if OS.linux?}.tbz" tarball = TEST_FIXTURE_DIR / "tarballs/#{tarball_name}" content = <<~RUBY From 01ad6b53d3568e0ea72156a80271aba36fd03fd5 Mon Sep 17 00:00:00 2001 From: thibhero Date: Sat, 31 May 2025 23:02:01 -0400 Subject: [PATCH 09/37] double quotes for `brew style` --- Library/Homebrew/test/cmd/upgrade_spec.rb | 2 +- .../test/support/helper/spec/shared_context/integration_test.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Library/Homebrew/test/cmd/upgrade_spec.rb b/Library/Homebrew/test/cmd/upgrade_spec.rb index fa50430084..c304f061c8 100644 --- a/Library/Homebrew/test/cmd/upgrade_spec.rb +++ b/Library/Homebrew/test/cmd/upgrade_spec.rb @@ -88,7 +88,7 @@ RSpec.describe Homebrew::Cmd::UpgradeCmd do content = <<~RUBY depends_on "testball5" - # should work as its not building but test doesnt pass if dependant + # should work as it's not building but test doesn't pass if dependant # depends_on "build" => :build depends_on "installed" version "0.1" diff --git a/Library/Homebrew/test/support/helper/spec/shared_context/integration_test.rb b/Library/Homebrew/test/support/helper/spec/shared_context/integration_test.rb index 113e6e82fa..40d193effb 100644 --- a/Library/Homebrew/test/support/helper/spec/shared_context/integration_test.rb +++ b/Library/Homebrew/test/support/helper/spec/shared_context/integration_test.rb @@ -151,7 +151,7 @@ RSpec.shared_context "integration test" do # rubocop:disable RSpec/ContextWordin program_name = "test" end - tarball_name = "#{prefix}-0.1#{'-linux' if OS.linux?}.tbz" + tarball_name = "#{prefix}-0.1#{"-linux" if OS.linux?}.tbz" tarball = TEST_FIXTURE_DIR / "tarballs/#{tarball_name}" content = <<~RUBY From 27f7f282be2b8ee99cd276fd54fb7da70839dace Mon Sep 17 00:00:00 2001 From: thibhero Date: Sun, 8 Jun 2025 11:31:40 -0400 Subject: [PATCH 10/37] refactoring homebrew upgrade for ask option --- Library/Homebrew/cmd/upgrade.rb | 38 ++++++++++++-- Library/Homebrew/upgrade.rb | 92 ++++++++++++++++++++++----------- 2 files changed, 94 insertions(+), 36 deletions(-) diff --git a/Library/Homebrew/cmd/upgrade.rb b/Library/Homebrew/cmd/upgrade.rb index 9895706138..e7f56cb919 100644 --- a/Library/Homebrew/cmd/upgrade.rb +++ b/Library/Homebrew/cmd/upgrade.rb @@ -220,10 +220,7 @@ module Homebrew Install.perform_preinstall_checks_once - # Main block: if asking the user is enabled, show dependency and size information. - Install.ask_formulae(formulae_to_install, args: args) if args.ask? - - Upgrade.upgrade_formulae( + formulae_installer = Upgrade.get_formulae_dependencies( formulae_to_install, flags: args.flags_only, dry_run: args.dry_run?, @@ -239,10 +236,11 @@ module Homebrew verbose: args.verbose?, ) - Upgrade.check_installed_dependents( + dependants = Upgrade.get_dependants( formulae_to_install, flags: args.flags_only, dry_run: args.dry_run?, + ask: args.ask?, force_bottle: args.force_bottle?, build_from_source_formulae: args.build_from_source_formulae, interactive: args.interactive?, @@ -254,6 +252,36 @@ module Homebrew verbose: args.verbose?, ) + formulae_dependencies = formulae_installer.flat_map do |f| + [f.formula, f.compute_dependencies.flatten.filter do |c| + c.is_a? Dependency + end.flat_map(&:to_formula)] + end.flatten.uniq + formulae_dependencies.concat(dependants.upgradeable) if dependants + # Main block: if asking the user is enabled, show dependency and size information. + Install.ask_formulae(formulae_dependencies, args: args) if args.ask? + + Upgrade.upgrade_formulae(formulae_installer, + dry_run: args.dry_run?, + verbose: args.verbose?) + + if dependants + Upgrade.upgrade_dependents( + dependants, formulae_to_install, + flags: args.flags_only, + dry_run: args.dry_run?, + force_bottle: args.force_bottle?, + build_from_source_formulae: args.build_from_source_formulae, + interactive: args.interactive?, + keep_tmp: args.keep_tmp?, + debug_symbols: args.debug_symbols?, + force: args.force?, + debug: args.debug?, + quiet: args.quiet?, + verbose: args.verbose? + ) + end + true end diff --git a/Library/Homebrew/upgrade.rb b/Library/Homebrew/upgrade.rb index 112893aac1..6bac1f4c7e 100644 --- a/Library/Homebrew/upgrade.rb +++ b/Library/Homebrew/upgrade.rb @@ -11,7 +11,9 @@ require "utils/topological_hash" module Homebrew # Helper functions for upgrading formulae. module Upgrade - def self.upgrade_formulae( + Dependents = Struct.new(:upgradeable, :pinned, :skipped) + + def self.get_formulae_dependencies( formulae_to_install, flags:, dry_run: false, @@ -48,7 +50,7 @@ module Homebrew raise CyclicDependencyError, dependency_graph.strongly_connected_components if Homebrew::EnvConfig.developer? end - formula_installers = formulae_to_install.filter_map do |formula| + formulae_to_install.filter_map do |formula| Migrator.migrate_if_needed(formula, force:, dry_run:) begin fi = create_formula_installer( @@ -65,18 +67,15 @@ module Homebrew quiet:, verbose:, ) - unless dry_run - fi.prelude - + if !dry_run && dependents && fi.bottle_tab_runtime_dependencies.presence&.all? do |dependency, hash| + minimum_version = Version.new(hash["version"]) if hash["version"].present? + Dependency.new(dependency).installed?(minimum_version:, minimum_revision: hash["revision"]) + end # Don't need to install this bottle if all of the runtime # dependencies have the same or newer version already installed. - next if dependents && fi.bottle_tab_runtime_dependencies.presence&.all? do |dependency, hash| - minimum_version = Version.new(hash["version"]) if hash["version"].present? - Dependency.new(dependency).installed?(minimum_version:, minimum_revision: hash["revision"]) - end - - fi.fetch + next end + fi rescue CannotInstallFormulaError => e ofail e @@ -86,8 +85,19 @@ module Homebrew nil end end + end + def self.upgrade_formulae(formula_installers, dry_run: false, verbose: false) formula_installers.each do |fi| + begin + fi.prelude + fi.fetch + rescue CannotInstallFormulaError => e + ofail e + rescue UnsatisfiedRequirements, DownloadError => e + ofail "#{formula}: #{e}" + end + upgrade_formula(fi, dry_run:, verbose:) Cleanup.install_formula_clean!(fi.formula, dry_run:) end @@ -250,10 +260,11 @@ module Homebrew @puts_no_installed_dependents_check_disable_message_if_not_already = true end - def self.check_installed_dependents( + def self.get_dependants( formulae, flags:, dry_run: false, + ask: false, installed_on_request: false, force_bottle: false, build_from_source_formulae: [], @@ -275,7 +286,7 @@ module Homebrew return end - installed_formulae = (dry_run ? formulae : FormulaInstaller.installed.to_a).dup + installed_formulae = ((dry_run || ask) ? formulae : FormulaInstaller.installed.to_a).dup installed_formulae.reject! { |f| f.core_formula? && f.versioned_formula? } return if installed_formulae.empty? @@ -292,14 +303,6 @@ module Homebrew dependent.bottled? && dependent.deps.map(&:to_formula).all?(&:bottled?) end - if skipped_dependents.present? - opoo <<~EOS - The following dependents of upgraded formulae are outdated but will not - be upgraded because they are not bottled: - #{skipped_dependents * "\n "} - EOS - end - return if outdated_dependents.blank? && already_broken_dependents.blank? outdated_dependents -= installed_formulae if dry_run @@ -311,24 +314,50 @@ module Homebrew outdated_dependents.select(&:pinned?) .sort { |a, b| depends_on(a, b) } - if pinned_dependents.present? - plural = Utils.pluralize("dependent", pinned_dependents.count) - opoo "Not upgrading #{pinned_dependents.count} pinned #{plural}:" - puts(pinned_dependents.map do |f| + Dependents.new(upgradeable_dependents, pinned_dependents, skipped_dependents) + end + + def self.upgrade_dependents(deps, formulae, + flags:, + dry_run: false, + installed_on_request: false, + force_bottle: false, + build_from_source_formulae: [], + interactive: false, + keep_tmp: false, + debug_symbols: false, + force: false, + debug: false, + quiet: false, + verbose: false) + upgradeable = deps.upgradeable + pinned = deps.pinned + skipped = deps.skipped + if pinned.present? + plural = Utils.pluralize("dependent", pinned.count) + opoo "Not upgrading #{pinned.count} pinned #{plural}:" + puts(pinned.map do |f| "#{f.full_specified_name} #{f.pkg_version}" end.join(", ")) end - + if skipped.present? + opoo <<~EOS + The following dependents of upgraded formulae are outdated but will not + be upgraded because they are not bottled: + #{skipped * "\n "} + EOS + end # Print the upgradable dependents. - if upgradeable_dependents.blank? + if upgradeable.blank? ohai "No outdated dependents to upgrade!" unless dry_run else + installed_formulae = (dry_run ? formulae : FormulaInstaller.installed.to_a).dup formula_plural = Utils.pluralize("formula", installed_formulae.count, plural: "e") upgrade_verb = dry_run ? "Would upgrade" : "Upgrading" - ohai "#{upgrade_verb} #{Utils.pluralize("dependent", upgradeable_dependents.count, + ohai "#{upgrade_verb} #{Utils.pluralize("dependent", upgradeable.count, include_count: true)} of upgraded #{formula_plural}:" Upgrade.puts_no_installed_dependents_check_disable_message_if_not_already! - formulae_upgrades = upgradeable_dependents.map do |f| + formulae_upgrades = upgradeable.map do |f| name = f.full_specified_name if f.optlinked? "#{name} #{Keg.new(f.opt_prefix).version} -> #{f.pkg_version}" @@ -340,8 +369,8 @@ module Homebrew end unless dry_run - upgrade_formulae( - upgradeable_dependents, + formulae_dependencies = get_formulae_dependencies( + upgradeable, flags:, force_bottle:, build_from_source_formulae:, @@ -354,6 +383,7 @@ module Homebrew quiet:, verbose:, ) + upgrade_formulae formulae_dependencies end # Update installed formulae after upgrading From 628d265d7aed231808661b072d18cac67787bae3 Mon Sep 17 00:00:00 2001 From: thibhero Date: Sun, 8 Jun 2025 11:31:51 -0400 Subject: [PATCH 11/37] updating test for upgrade --- Library/Homebrew/test/cmd/upgrade_spec.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Library/Homebrew/test/cmd/upgrade_spec.rb b/Library/Homebrew/test/cmd/upgrade_spec.rb index fa50430084..a0b57c0e74 100644 --- a/Library/Homebrew/test/cmd/upgrade_spec.rb +++ b/Library/Homebrew/test/cmd/upgrade_spec.rb @@ -33,7 +33,7 @@ RSpec.describe Homebrew::Cmd::UpgradeCmd do setup_test_formula "testball", <<~RUBY depends_on "testball5" # should work as its not building but test doesnt pass if dependant - depends_on "testball-build" => :build + #depends_on "testball-build" => :build depends_on "installed" RUBY setup_test_formula "installed" @@ -89,7 +89,7 @@ RSpec.describe Homebrew::Cmd::UpgradeCmd do content = <<~RUBY depends_on "testball5" # should work as its not building but test doesnt pass if dependant - # depends_on "build" => :build + depends_on "testball-build" => :build depends_on "installed" version "0.1" RUBY @@ -106,7 +106,7 @@ RSpec.describe Homebrew::Cmd::UpgradeCmd do RUBY setup_test_formula "testball4", content, testball_bottle: true setup_test_formula "hiop" - setup_test_formula "build" + setup_test_formula "testball-build" (HOMEBREW_CELLAR/"testball/0.0.1/foo").mkpath (HOMEBREW_CELLAR/"testball5/0.0.1/foo").mkpath From fd159ed32c399b5f25b0cb3378f1f178440adc27 Mon Sep 17 00:00:00 2001 From: thibhero Date: Sun, 8 Jun 2025 11:32:21 -0400 Subject: [PATCH 12/37] updating ask function --- Library/Homebrew/install.rb | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Library/Homebrew/install.rb b/Library/Homebrew/install.rb index eed1d65f18..561c27e601 100644 --- a/Library/Homebrew/install.rb +++ b/Library/Homebrew/install.rb @@ -336,11 +336,10 @@ module Homebrew ohai "Looking for bottles..." - sized_formulae = compute_sized_formulae(formulae, args: args) - sizes = compute_total_sizes(sized_formulae, debug: args.debug?) + sizes = compute_total_sizes(formulae, debug: args.debug?) - puts "#{::Utils.pluralize("Formula", sized_formulae.count, plural: "e")} \ -(#{sized_formulae.count}): #{sized_formulae.join(", ")}\n\n" + puts "#{::Utils.pluralize("Formula", formulae.count, plural: "e")} \ +(#{formulae.count}): #{formulae.join(", ")}\n\n" puts "Download Size: #{disk_usage_readable(sizes[:download])}" puts "Install Size: #{disk_usage_readable(sizes[:installed])}" puts "Net Install Size: #{disk_usage_readable(sizes[:net])}" if sizes[:net] != 0 From a5251b2fb6ee50c3033a0408c05fbcda707aac36 Mon Sep 17 00:00:00 2001 From: thibhero Date: Sun, 8 Jun 2025 12:34:24 -0400 Subject: [PATCH 13/37] refactoring install --- Library/Homebrew/cmd/install.rb | 84 ++++++++++++++++++++++++++------- Library/Homebrew/install.rb | 60 ++++++++++++++++------- 2 files changed, 108 insertions(+), 36 deletions(-) diff --git a/Library/Homebrew/cmd/install.rb b/Library/Homebrew/cmd/install.rb index 517414f9fe..79e6b527ac 100644 --- a/Library/Homebrew/cmd/install.rb +++ b/Library/Homebrew/cmd/install.rb @@ -310,9 +310,7 @@ module Homebrew Install.perform_preinstall_checks_once Install.check_cc_argv(args.cc) - Install.ask_formulae(installed_formulae, args: args) if args.ask? - - Install.install_formulae( + formulae_installer = Install.get_formulae_dependencies( installed_formulae, installed_on_request: !args.as_dependency?, installed_as_dependency: args.as_dependency?, @@ -338,21 +336,71 @@ module Homebrew skip_link: args.skip_link?, ) - Upgrade.check_installed_dependents( - installed_formulae, - flags: args.flags_only, - installed_on_request: !args.as_dependency?, - force_bottle: args.force_bottle?, - build_from_source_formulae: args.build_from_source_formulae, - interactive: args.interactive?, - keep_tmp: args.keep_tmp?, - debug_symbols: args.debug_symbols?, - force: args.force?, - debug: args.debug?, - quiet: args.quiet?, - verbose: args.verbose?, - dry_run: args.dry_run?, - ) + if args.ask? + dependants = Upgrade.get_dependants( + installed_formulae, + flags: args.flags_only, + installed_on_request: !args.as_dependency?, + force_bottle: args.force_bottle?, + build_from_source_formulae: args.build_from_source_formulae, + interactive: args.interactive?, + keep_tmp: args.keep_tmp?, + debug_symbols: args.debug_symbols?, + force: args.force?, + debug: args.debug?, + quiet: args.quiet?, + verbose: args.verbose?, + dry_run: args.dry_run?, + ) + + formulae_dependencies = formulae_installer.flat_map do |f| + [f.formula, f.compute_dependencies.flatten.filter do |c| + c.is_a? Dependency + end.flat_map(&:to_formula)] + end.flatten.uniq + formulae_dependencies.concat(dependants.upgradeable) if dependants + # Main block: if asking the user is enabled, show dependency and size information. + Install.ask_formulae(formulae_dependencies, args: args) + end + + Upgrade.upgrade_formulae(formulae_installer, + dry_run: args.dry_run?, + verbose: args.verbose?) + + unless args.ask? + dependants = Upgrade.get_dependants( + installed_formulae, + flags: args.flags_only, + dry_run: args.dry_run?, + ask: args.ask?, + force_bottle: args.force_bottle?, + build_from_source_formulae: args.build_from_source_formulae, + interactive: args.interactive?, + keep_tmp: args.keep_tmp?, + debug_symbols: args.debug_symbols?, + force: args.force?, + debug: args.debug?, + quiet: args.quiet?, + verbose: args.verbose?, + ) + end + + if dependants + Upgrade.upgrade_dependents( + dependants, installed_formulae, + flags: args.flags_only, + dry_run: args.dry_run?, + force_bottle: args.force_bottle?, + build_from_source_formulae: args.build_from_source_formulae, + interactive: args.interactive?, + keep_tmp: args.keep_tmp?, + debug_symbols: args.debug_symbols?, + force: args.force?, + debug: args.debug?, + quiet: args.quiet?, + verbose: args.verbose? + ) + end Cleanup.periodic_clean!(dry_run: args.dry_run?) diff --git a/Library/Homebrew/install.rb b/Library/Homebrew/install.rb index 561c27e601..bcf328c46d 100644 --- a/Library/Homebrew/install.rb +++ b/Library/Homebrew/install.rb @@ -232,7 +232,7 @@ module Homebrew false end - def install_formulae( + def get_formulae_dependencies( formulae_to_install, installed_on_request: true, installed_as_dependency: false, @@ -257,11 +257,11 @@ module Homebrew skip_post_install: false, skip_link: false ) - formula_installers = formulae_to_install.filter_map do |formula| + formulae_to_install.filter_map do |formula| Migrator.migrate_if_needed(formula, force:, dry_run:) build_options = formula.build - formula_installer = FormulaInstaller.new( + FormulaInstaller.new( formula, options: build_options.used_options, installed_on_request:, @@ -286,24 +286,36 @@ module Homebrew skip_post_install:, skip_link:, ) - - begin - unless dry_run - formula_installer.prelude - formula_installer.fetch - end - formula_installer - rescue CannotInstallFormulaError => e - ofail e.message - nil - rescue UnsatisfiedRequirements, DownloadError, ChecksumMismatchError => e - ofail "#{formula}: #{e}" - nil - end end + end + def install_formulae( + formula_installers, + installed_on_request: true, + installed_as_dependency: false, + build_bottle: false, + force_bottle: false, + bottle_arch: nil, + ignore_deps: false, + only_deps: false, + include_test_formulae: [], + build_from_source_formulae: [], + cc: nil, + git: false, + interactive: false, + keep_tmp: false, + debug_symbols: false, + force: false, + overwrite: false, + debug: false, + quiet: false, + verbose: false, + dry_run: false, + skip_post_install: false, + skip_link: false + ) if dry_run - if (formulae_name_to_install = formulae_to_install.map(&:name)) + if (formulae_name_to_install = formula_installers.map(&:name)) ohai "Would install #{Utils.pluralize("formula", formulae_name_to_install.count, plural: "e", include_count: true)}:" puts formulae_name_to_install.join(" ") @@ -316,6 +328,18 @@ module Homebrew end formula_installers.each do |fi| + begin + unless dry_run + fi.prelude + fi.fetch + end + rescue CannotInstallFormulaError => e + ofail e.message + next + rescue UnsatisfiedRequirements, DownloadError, ChecksumMismatchError => e + ofail "#{formula}: #{e}" + next + end install_formula(fi) Cleanup.install_formula_clean!(fi.formula) end From 8222b192ec9edfc26db42734470cdcaa5345bb84 Mon Sep 17 00:00:00 2001 From: thibhero Date: Sun, 8 Jun 2025 12:34:56 -0400 Subject: [PATCH 14/37] updating upgrade to work --- Library/Homebrew/cmd/upgrade.rb | 67 ++++++++++++++++++++++----------- 1 file changed, 44 insertions(+), 23 deletions(-) diff --git a/Library/Homebrew/cmd/upgrade.rb b/Library/Homebrew/cmd/upgrade.rb index e7f56cb919..f6c6ae7e3b 100644 --- a/Library/Homebrew/cmd/upgrade.rb +++ b/Library/Homebrew/cmd/upgrade.rb @@ -236,35 +236,56 @@ module Homebrew verbose: args.verbose?, ) - dependants = Upgrade.get_dependants( - formulae_to_install, - flags: args.flags_only, - dry_run: args.dry_run?, - ask: args.ask?, - force_bottle: args.force_bottle?, - build_from_source_formulae: args.build_from_source_formulae, - interactive: args.interactive?, - keep_tmp: args.keep_tmp?, - debug_symbols: args.debug_symbols?, - force: args.force?, - debug: args.debug?, - quiet: args.quiet?, - verbose: args.verbose?, - ) + if args.ask? + dependants = Upgrade.get_dependants( + formulae_to_install, + flags: args.flags_only, + dry_run: args.dry_run?, + ask: args.ask?, + force_bottle: args.force_bottle?, + build_from_source_formulae: args.build_from_source_formulae, + interactive: args.interactive?, + keep_tmp: args.keep_tmp?, + debug_symbols: args.debug_symbols?, + force: args.force?, + debug: args.debug?, + quiet: args.quiet?, + verbose: args.verbose?, + ) - formulae_dependencies = formulae_installer.flat_map do |f| - [f.formula, f.compute_dependencies.flatten.filter do |c| - c.is_a? Dependency - end.flat_map(&:to_formula)] - end.flatten.uniq - formulae_dependencies.concat(dependants.upgradeable) if dependants - # Main block: if asking the user is enabled, show dependency and size information. - Install.ask_formulae(formulae_dependencies, args: args) if args.ask? + formulae_dependencies = formulae_installer.flat_map do |f| + [f.formula, f.compute_dependencies.flatten.filter do |c| + c.is_a? Dependency + end.flat_map(&:to_formula)] + end.flatten.uniq + formulae_dependencies.concat(dependants.upgradeable) if dependants + # Main block: if asking the user is enabled, show dependency and size information. + Install.ask_formulae(formulae_dependencies, args: args) + + end Upgrade.upgrade_formulae(formulae_installer, dry_run: args.dry_run?, verbose: args.verbose?) + unless args.ask? + dependants = Upgrade.get_dependants( + formulae_to_install, + flags: args.flags_only, + dry_run: args.dry_run?, + ask: args.ask?, + force_bottle: args.force_bottle?, + build_from_source_formulae: args.build_from_source_formulae, + interactive: args.interactive?, + keep_tmp: args.keep_tmp?, + debug_symbols: args.debug_symbols?, + force: args.force?, + debug: args.debug?, + quiet: args.quiet?, + verbose: args.verbose?, + ) + end + if dependants Upgrade.upgrade_dependents( dependants, formulae_to_install, From a8638270f28ecb9737939009a318a1d4f78c0e09 Mon Sep 17 00:00:00 2001 From: thibhero Date: Sun, 8 Jun 2025 12:35:10 -0400 Subject: [PATCH 15/37] putting up to date install test --- Library/Homebrew/test/cmd/install_spec.rb | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/Library/Homebrew/test/cmd/install_spec.rb b/Library/Homebrew/test/cmd/install_spec.rb index d9768624f1..917633db1e 100644 --- a/Library/Homebrew/test/cmd/install_spec.rb +++ b/Library/Homebrew/test/cmd/install_spec.rb @@ -103,7 +103,7 @@ RSpec.describe Homebrew::Cmd::InstallCmd do setup_test_formula "testball1", <<~RUBY depends_on "testball5" - depends_on "testball-build" => :build + #depends_on "testball-build" => :build depends_on "installed" RUBY setup_test_formula "installed" @@ -119,10 +119,19 @@ RSpec.describe Homebrew::Cmd::InstallCmd do keg_dir.mkpath touch keg_dir/AbstractTab::FILENAME + regex = / + Formulae\s*\(3\):\s* + (testball1|testball5|testball4) + \s*,\s* + ((?!\1)testball1|testball5|testball4) + \s*,\s* + ((?!\1|\2)testball1|testball5|testball4) + /x + expect do brew "install", "--ask", "testball1" - end.to output(/.*Formulae\s*\(3\):\s*testball1\s*,?\s*testball5\s*,?\s*testball4.*/).to_stdout - .and not_to_output.to_stderr + end.to output(regex).to_stdout + .and not_to_output.to_stderr expect(HOMEBREW_CELLAR/"testball1/0.1/bin/test").to be_a_file expect(HOMEBREW_CELLAR/"testball4/0.1/bin/testball4").to be_a_file From aa47105d2a49ed99dea15f8c4d19b05ecc5f437a Mon Sep 17 00:00:00 2001 From: thibhero Date: Mon, 9 Jun 2025 00:14:16 -0400 Subject: [PATCH 16/37] refactoring code --- Library/Homebrew/cmd/install.rb | 12 ++-- Library/Homebrew/cmd/reinstall.rb | 94 ++++++++++++++++++++++++------- Library/Homebrew/cmd/upgrade.rb | 8 +-- Library/Homebrew/install.rb | 10 ++++ Library/Homebrew/reinstall.rb | 35 ++++++++++-- Library/Homebrew/upgrade.rb | 16 +++++- 6 files changed, 134 insertions(+), 41 deletions(-) diff --git a/Library/Homebrew/cmd/install.rb b/Library/Homebrew/cmd/install.rb index 79e6b527ac..3dfd07d756 100644 --- a/Library/Homebrew/cmd/install.rb +++ b/Library/Homebrew/cmd/install.rb @@ -340,6 +340,7 @@ module Homebrew dependants = Upgrade.get_dependants( installed_formulae, flags: args.flags_only, + ask: args.ask?, installed_on_request: !args.as_dependency?, force_bottle: args.force_bottle?, build_from_source_formulae: args.build_from_source_formulae, @@ -353,17 +354,12 @@ module Homebrew dry_run: args.dry_run?, ) - formulae_dependencies = formulae_installer.flat_map do |f| - [f.formula, f.compute_dependencies.flatten.filter do |c| - c.is_a? Dependency - end.flat_map(&:to_formula)] - end.flatten.uniq - formulae_dependencies.concat(dependants.upgradeable) if dependants + formulae_dependencies = Install.get_hierarchy(formulae_installer, dependants) # Main block: if asking the user is enabled, show dependency and size information. Install.ask_formulae(formulae_dependencies, args: args) end - Upgrade.upgrade_formulae(formulae_installer, + Install.install_formulae(formulae_installer, dry_run: args.dry_run?, verbose: args.verbose?) @@ -372,7 +368,7 @@ module Homebrew installed_formulae, flags: args.flags_only, dry_run: args.dry_run?, - ask: args.ask?, + installed_on_request: !args.as_dependency?, force_bottle: args.force_bottle?, build_from_source_formulae: args.build_from_source_formulae, interactive: args.interactive?, diff --git a/Library/Homebrew/cmd/reinstall.rb b/Library/Homebrew/cmd/reinstall.rb index 2c1208e54a..4c6d2d27c6 100644 --- a/Library/Homebrew/cmd/reinstall.rb +++ b/Library/Homebrew/cmd/reinstall.rb @@ -130,16 +130,13 @@ module Homebrew unless formulae.empty? Install.perform_preinstall_checks_once - # If asking the user is enabled, show dependency and size information. - Install.ask_formulae(formulae, args: args) if args.ask? - - formulae.each do |formula| + formulae_keg = formulae.map do |formula| if formula.pinned? onoe "#{formula.full_name} is pinned. You must unpin it to reinstall." next end Migrator.migrate_if_needed(formula, force: args.force?) - Homebrew::Reinstall.reinstall_formula( + Homebrew::Reinstall.get_formula_to_reinstall( formula, flags: args.flags_only, force_bottle: args.force_bottle?, @@ -153,22 +150,81 @@ module Homebrew verbose: args.verbose?, git: args.git?, ) - Cleanup.install_formula_clean!(formula) end - Upgrade.check_installed_dependents( - formulae, - flags: args.flags_only, - force_bottle: args.force_bottle?, - build_from_source_formulae: args.build_from_source_formulae, - interactive: args.interactive?, - keep_tmp: args.keep_tmp?, - debug_symbols: args.debug_symbols?, - force: args.force?, - debug: args.debug?, - quiet: args.quiet?, - verbose: args.verbose?, - ) + if args.ask? + dependants = Upgrade.get_dependants( + formulae, + flags: args.flags_only, + ask: args.ask?, + force_bottle: args.force_bottle?, + build_from_source_formulae: args.build_from_source_formulae, + interactive: args.interactive?, + keep_tmp: args.keep_tmp?, + debug_symbols: args.debug_symbols?, + force: args.force?, + debug: args.debug?, + quiet: args.quiet?, + verbose: args.verbose?, + ) + + formulae_dependencies = formulae_keg.map(&:formula_installer) + + formulae_dependencies = Install.get_hierarchy(formulae_dependencies, dependants) + # Main block: if asking the user is enabled, show dependency and size information. + Install.ask_formulae(formulae_dependencies, args: args) + + end + + formulae_keg.each do |f| + Homebrew::Reinstall.reinstall_formula( + f, + flags: args.flags_only, + force_bottle: args.force_bottle?, + build_from_source_formulae: args.build_from_source_formulae, + interactive: args.interactive?, + keep_tmp: args.keep_tmp?, + debug_symbols: args.debug_symbols?, + force: args.force?, + debug: args.debug?, + quiet: args.quiet?, + verbose: args.verbose?, + git: args.git?, + ) + Cleanup.install_formula_clean!(f.formula) + end + + unless args.ask? + dependants = Upgrade.get_dependants( + formulae, + flags: args.flags_only, + force_bottle: args.force_bottle?, + build_from_source_formulae: args.build_from_source_formulae, + interactive: args.interactive?, + keep_tmp: args.keep_tmp?, + debug_symbols: args.debug_symbols?, + force: args.force?, + debug: args.debug?, + quiet: args.quiet?, + verbose: args.verbose?, + ) + end + + if dependants + Upgrade.upgrade_dependents( + dependants, formulae, + flags: args.flags_only, + force_bottle: args.force_bottle?, + build_from_source_formulae: args.build_from_source_formulae, + interactive: args.interactive?, + keep_tmp: args.keep_tmp?, + debug_symbols: args.debug_symbols?, + force: args.force?, + debug: args.debug?, + quiet: args.quiet?, + verbose: args.verbose? + ) + end end if casks.any? diff --git a/Library/Homebrew/cmd/upgrade.rb b/Library/Homebrew/cmd/upgrade.rb index f6c6ae7e3b..80f987e905 100644 --- a/Library/Homebrew/cmd/upgrade.rb +++ b/Library/Homebrew/cmd/upgrade.rb @@ -253,12 +253,7 @@ module Homebrew verbose: args.verbose?, ) - formulae_dependencies = formulae_installer.flat_map do |f| - [f.formula, f.compute_dependencies.flatten.filter do |c| - c.is_a? Dependency - end.flat_map(&:to_formula)] - end.flatten.uniq - formulae_dependencies.concat(dependants.upgradeable) if dependants + formulae_dependencies = Install.get_hierarchy(formulae_installer, dependants) # Main block: if asking the user is enabled, show dependency and size information. Install.ask_formulae(formulae_dependencies, args: args) @@ -273,7 +268,6 @@ module Homebrew formulae_to_install, flags: args.flags_only, dry_run: args.dry_run?, - ask: args.ask?, force_bottle: args.force_bottle?, build_from_source_formulae: args.build_from_source_formulae, interactive: args.interactive?, diff --git a/Library/Homebrew/install.rb b/Library/Homebrew/install.rb index bcf328c46d..2a2ecfb8ba 100644 --- a/Library/Homebrew/install.rb +++ b/Library/Homebrew/install.rb @@ -354,6 +354,16 @@ module Homebrew puts formula_names.join(" ") end + def get_hierarchy(formulae_installer, dependants) + formulae_dependencies = formulae_installer.flat_map do |f| + [f.formula, f.compute_dependencies.flatten.filter do |c| + c.is_a? Dependency + end.flat_map(&:to_formula)] + end.flatten.uniq + formulae_dependencies.concat(dependants.upgradeable) if dependants&.upgradeable + formulae_dependencies + end + # If asking the user is enabled, show dependency and size information. def ask_formulae(formulae, args:) return if formulae.empty? diff --git a/Library/Homebrew/reinstall.rb b/Library/Homebrew/reinstall.rb index b8260b1116..75e29ea0ac 100644 --- a/Library/Homebrew/reinstall.rb +++ b/Library/Homebrew/reinstall.rb @@ -7,7 +7,8 @@ require "messages" module Homebrew module Reinstall - def self.reinstall_formula( + Formula_keg = Struct.new(:formula_installer, :keg, :formula, :options) + def self.get_formula_to_reinstall( formula, flags:, force_bottle: false, @@ -61,16 +62,38 @@ module Homebrew verbose:, }.compact, ) - fi.prelude - fi.fetch + Formula_keg.new(fi, keg, formula, options) + end + + def self.reinstall_formula( + formula_keg, + flags:, + force_bottle: false, + build_from_source_formulae: [], + interactive: false, + keep_tmp: false, + debug_symbols: false, + force: false, + debug: false, + quiet: false, + verbose: false, + git: false + ) + formula_installer = formula_keg.formula_installer + keg = formula_keg.keg + formula = formula_keg.formula + options = formula_keg.options + link_keg = keg.linked? + formula_installer.prelude + formula_installer.fetch oh1 "Reinstalling #{Formatter.identifier(formula.full_name)} #{options.to_a.join " "}" - fi.install - fi.finish + formula_installer.install + formula_installer.finish rescue FormulaInstallationAlreadyAttemptedError nil - # Any other exceptions we want to restore the previous keg and report the error. + # Any other exceptions we want to restore the previous keg and report the error. rescue Exception # rubocop:disable Lint/RescueException ignore_interrupts { restore_backup(keg, link_keg, verbose:) } raise diff --git a/Library/Homebrew/upgrade.rb b/Library/Homebrew/upgrade.rb index 6bac1f4c7e..938a90522a 100644 --- a/Library/Homebrew/upgrade.rb +++ b/Library/Homebrew/upgrade.rb @@ -439,7 +439,7 @@ module Homebrew return if dry_run reinstallable_broken_dependents.each do |formula| - Reinstall.reinstall_formula( + formula_installer = Reinstall.get_formula_to_reinstall( formula, flags:, force_bottle:, @@ -452,6 +452,20 @@ module Homebrew quiet:, verbose:, ) + Reinstall.reinstall_formula( + formula_installer, + flags: args.flags_only, + force_bottle: args.force_bottle?, + build_from_source_formulae: args.build_from_source_formulae, + interactive: args.interactive?, + keep_tmp: args.keep_tmp?, + debug_symbols: args.debug_symbols?, + force: args.force?, + debug: args.debug?, + quiet: args.quiet?, + verbose: args.verbose?, + git: args.git?, + ) rescue FormulaInstallationAlreadyAttemptedError # We already attempted to reinstall f as part of the dependency tree of # another formula. In that case, don't generate an error, just move on. From 32a53ab285c2e56520b3c360b88b0905c51724e3 Mon Sep 17 00:00:00 2001 From: thibhero Date: Mon, 9 Jun 2025 00:42:24 -0400 Subject: [PATCH 17/37] resolving error typecheck --- Library/Homebrew/upgrade.rb | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/Library/Homebrew/upgrade.rb b/Library/Homebrew/upgrade.rb index 938a90522a..a52a58713b 100644 --- a/Library/Homebrew/upgrade.rb +++ b/Library/Homebrew/upgrade.rb @@ -454,17 +454,16 @@ module Homebrew ) Reinstall.reinstall_formula( formula_installer, - flags: args.flags_only, - force_bottle: args.force_bottle?, - build_from_source_formulae: args.build_from_source_formulae, - interactive: args.interactive?, - keep_tmp: args.keep_tmp?, - debug_symbols: args.debug_symbols?, - force: args.force?, - debug: args.debug?, - quiet: args.quiet?, - verbose: args.verbose?, - git: args.git?, + flags:, + force_bottle:, + build_from_source_formulae:, + interactive:, + keep_tmp:, + debug_symbols:, + force:, + debug:, + quiet:, + verbose:, ) rescue FormulaInstallationAlreadyAttemptedError # We already attempted to reinstall f as part of the dependency tree of From 7e876e46811aa1819e77eaafc4717ce5a3f99ed8 Mon Sep 17 00:00:00 2001 From: thibhero Date: Wed, 11 Jun 2025 22:35:00 -0400 Subject: [PATCH 18/37] resolving discussions --- Library/Homebrew/cmd/install.rb | 10 +++--- Library/Homebrew/cmd/reinstall.rb | 16 +++++----- Library/Homebrew/cmd/upgrade.rb | 10 +++--- Library/Homebrew/install.rb | 53 ++----------------------------- Library/Homebrew/reinstall.rb | 6 ++-- Library/Homebrew/upgrade.rb | 17 ++++++---- 6 files changed, 33 insertions(+), 79 deletions(-) diff --git a/Library/Homebrew/cmd/install.rb b/Library/Homebrew/cmd/install.rb index 644415950e..ec0c4ca6f2 100644 --- a/Library/Homebrew/cmd/install.rb +++ b/Library/Homebrew/cmd/install.rb @@ -310,7 +310,7 @@ module Homebrew Install.perform_preinstall_checks_once Install.check_cc_argv(args.cc) - formulae_installer = Install.get_formulae_dependencies( + formulae_installer = Install.formulae_installer( installed_formulae, installed_on_request: !args.as_dependency?, installed_as_dependency: args.as_dependency?, @@ -337,7 +337,7 @@ module Homebrew ) if args.ask? - dependants = Upgrade.get_dependants( + dependants = Upgrade.dependants( installed_formulae, flags: args.flags_only, ask: args.ask?, @@ -354,7 +354,7 @@ module Homebrew dry_run: args.dry_run?, ) - formulae_dependencies = Install.get_hierarchy(formulae_installer, dependants) + formulae_dependencies = Install.collect_dependencies(formulae_installer, dependants) # Main block: if asking the user is enabled, show dependency and size information. Install.ask_formulae(formulae_dependencies, args: args) end @@ -364,7 +364,7 @@ module Homebrew verbose: args.verbose?) unless args.ask? - dependants = Upgrade.get_dependants( + dependants = Upgrade.dependants( installed_formulae, flags: args.flags_only, dry_run: args.dry_run?, @@ -381,7 +381,7 @@ module Homebrew ) end - if dependants + if dependants.present? Upgrade.upgrade_dependents( dependants, installed_formulae, flags: args.flags_only, diff --git a/Library/Homebrew/cmd/reinstall.rb b/Library/Homebrew/cmd/reinstall.rb index 01e44115f8..7a65ea3251 100644 --- a/Library/Homebrew/cmd/reinstall.rb +++ b/Library/Homebrew/cmd/reinstall.rb @@ -130,13 +130,13 @@ module Homebrew unless formulae.empty? Install.perform_preinstall_checks_once - formulae_keg = formulae.map do |formula| + formulae_kegs = formulae.map do |formula| if formula.pinned? onoe "#{formula.full_name} is pinned. You must unpin it to reinstall." next end Migrator.migrate_if_needed(formula, force: args.force?) - Homebrew::Reinstall.get_formula_to_reinstall( + Homebrew::Reinstall.formula_installer( formula, flags: args.flags_only, force_bottle: args.force_bottle?, @@ -153,7 +153,7 @@ module Homebrew end if args.ask? - dependants = Upgrade.get_dependants( + dependants = Upgrade.dependants( formulae, flags: args.flags_only, ask: args.ask?, @@ -168,15 +168,15 @@ module Homebrew verbose: args.verbose?, ) - formulae_dependencies = formulae_keg.map(&:formula_installer) + formulae_installer = formulae_kegs.map(&:formula_installer) - formulae_dependencies = Install.get_hierarchy(formulae_dependencies, dependants) + formulae_dependencies = Install.collect_dependencies(formulae_installer, dependants) # Main block: if asking the user is enabled, show dependency and size information. Install.ask_formulae(formulae_dependencies, args: args) end - formulae_keg.each do |f| + formulae_kegs.each do |f| Homebrew::Reinstall.reinstall_formula( f, flags: args.flags_only, @@ -195,7 +195,7 @@ module Homebrew end unless args.ask? - dependants = Upgrade.get_dependants( + dependants = Upgrade.dependants( formulae, flags: args.flags_only, force_bottle: args.force_bottle?, @@ -210,7 +210,7 @@ module Homebrew ) end - if dependants + if dependants.present? Upgrade.upgrade_dependents( dependants, formulae, flags: args.flags_only, diff --git a/Library/Homebrew/cmd/upgrade.rb b/Library/Homebrew/cmd/upgrade.rb index 52fe6e4f76..ff6b344054 100644 --- a/Library/Homebrew/cmd/upgrade.rb +++ b/Library/Homebrew/cmd/upgrade.rb @@ -220,7 +220,7 @@ module Homebrew Install.perform_preinstall_checks_once - formulae_installer = Upgrade.get_formulae_dependencies( + formulae_installer = Upgrade.formulae_installer( formulae_to_install, flags: args.flags_only, dry_run: args.dry_run?, @@ -237,7 +237,7 @@ module Homebrew ) if args.ask? - dependants = Upgrade.get_dependants( + dependants = Upgrade.dependants( formulae_to_install, flags: args.flags_only, dry_run: args.dry_run?, @@ -253,7 +253,7 @@ module Homebrew verbose: args.verbose?, ) - formulae_dependencies = Install.get_hierarchy(formulae_installer, dependants) + formulae_dependencies = Install.collect_dependencies(formulae_installer, dependants) # Main block: if asking the user is enabled, show dependency and size information. Install.ask_formulae(formulae_dependencies, args: args) @@ -264,7 +264,7 @@ module Homebrew verbose: args.verbose?) unless args.ask? - dependants = Upgrade.get_dependants( + dependants = Upgrade.dependants( formulae_to_install, flags: args.flags_only, dry_run: args.dry_run?, @@ -280,7 +280,7 @@ module Homebrew ) end - if dependants + if dependants.present? Upgrade.upgrade_dependents( dependants, formulae_to_install, flags: args.flags_only, diff --git a/Library/Homebrew/install.rb b/Library/Homebrew/install.rb index 2a2ecfb8ba..d1f23e77e7 100644 --- a/Library/Homebrew/install.rb +++ b/Library/Homebrew/install.rb @@ -232,7 +232,7 @@ module Homebrew false end - def get_formulae_dependencies( + def formulae_installer( formulae_to_install, installed_on_request: true, installed_as_dependency: false, @@ -354,7 +354,7 @@ module Homebrew puts formula_names.join(" ") end - def get_hierarchy(formulae_installer, dependants) + def collect_dependencies(formulae_installer, dependants) formulae_dependencies = formulae_installer.flat_map do |f| [f.formula, f.compute_dependencies.flatten.filter do |c| c.is_a? Dependency @@ -446,55 +446,6 @@ module Homebrew end end - # Build a unique list of formulae to size by including: - # 1. The original formulae to install. - # 2. Their outdated dependents (subject to pruning criteria). - # 3. Optionally, any installed formula that depends on one of these and is outdated. - def compute_sized_formulae(formulae, args:) - sized_formulae = formulae.flat_map do |formula| - # Always include the formula itself. - formula_list = [formula] - - deps = args.build_from_source? ? formula.deps.build : formula.deps.required - - outdated_dependents = deps.map(&:to_formula).reject(&:pinned?).select do |dep| - dep.installed_kegs.empty? || (dep.bottled? && dep.outdated?) - end - deps.map(&:to_formula).each do |f| - prune_build = f.recursive_dependencies do |_, dep| - :prune if dep.build? - end - # select the outdated one or not installed - outdated_dependents.concat(prune_build.map(&:to_formula).reject(&:pinned?).select do |dep| - dep.installed_kegs.empty? || (dep.bottled? && dep.outdated?) - end) - end - formula_list.concat(outdated_dependents) - - formula_list - end - # Add any installed formula that depends on one of the sized formulae and is outdated. - unless Homebrew::EnvConfig.no_installed_dependents_check? - loop do - new_parents = Formula.installed.select do |installed_formula| - next unless installed_formula.bottled? - next unless installed_formula.outdated? - - required_deps = installed_formula.deps.required.map(&:to_formula) - required_deps.intersect?(sized_formulae) - end - - # Exclude anything already in sized_formulae - new_parents -= sized_formulae - break if new_parents.empty? - - sized_formulae.concat(new_parents) - end - end - - sized_formulae.uniq(&:to_s).compact - end - # Compute the total sizes (download, installed, and net) for the given formulae. def compute_total_sizes(sized_formulae, debug: false) total_download_size = 0 diff --git a/Library/Homebrew/reinstall.rb b/Library/Homebrew/reinstall.rb index 75e29ea0ac..8fd5329dc9 100644 --- a/Library/Homebrew/reinstall.rb +++ b/Library/Homebrew/reinstall.rb @@ -7,8 +7,8 @@ require "messages" module Homebrew module Reinstall - Formula_keg = Struct.new(:formula_installer, :keg, :formula, :options) - def self.get_formula_to_reinstall( + FormulaKeg = Struct.new(:formula_installer, :keg, :formula, :options) + def self.formula_installer( formula, flags:, force_bottle: false, @@ -62,7 +62,7 @@ module Homebrew verbose:, }.compact, ) - Formula_keg.new(fi, keg, formula, options) + FormulaKeg.new(fi, keg, formula, options) end def self.reinstall_formula( diff --git a/Library/Homebrew/upgrade.rb b/Library/Homebrew/upgrade.rb index a52a58713b..a7826ca7a6 100644 --- a/Library/Homebrew/upgrade.rb +++ b/Library/Homebrew/upgrade.rb @@ -13,7 +13,7 @@ module Homebrew module Upgrade Dependents = Struct.new(:upgradeable, :pinned, :skipped) - def self.get_formulae_dependencies( + def self.formulae_installer( formulae_to_install, flags:, dry_run: false, @@ -95,7 +95,7 @@ module Homebrew rescue CannotInstallFormulaError => e ofail e rescue UnsatisfiedRequirements, DownloadError => e - ofail "#{formula}: #{e}" + ofail "#{fi.formula.full_name}: #{e}" end upgrade_formula(fi, dry_run:, verbose:) @@ -260,7 +260,7 @@ module Homebrew @puts_no_installed_dependents_check_disable_message_if_not_already = true end - def self.get_dependants( + def self.dependants( formulae, flags:, dry_run: false, @@ -285,8 +285,11 @@ module Homebrew end return end - - installed_formulae = ((dry_run || ask) ? formulae : FormulaInstaller.installed.to_a).dup + if dry_run || ask + installed_formulae = formulae.dup + else + installed_formulae = FormulaInstaller.installed.to_a.dup + end installed_formulae.reject! { |f| f.core_formula? && f.versioned_formula? } return if installed_formulae.empty? @@ -369,7 +372,7 @@ module Homebrew end unless dry_run - formulae_dependencies = get_formulae_dependencies( + formulae_dependencies = formulae_installer( upgradeable, flags:, force_bottle:, @@ -439,7 +442,7 @@ module Homebrew return if dry_run reinstallable_broken_dependents.each do |formula| - formula_installer = Reinstall.get_formula_to_reinstall( + formula_installer = Reinstall.formula_installer( formula, flags:, force_bottle:, From fb5ddde5ade4c5bec23de41769b5fdced416f8d0 Mon Sep 17 00:00:00 2001 From: thibhero Date: Wed, 11 Jun 2025 22:36:57 -0400 Subject: [PATCH 19/37] resolving discussions --- Library/Homebrew/test/cmd/install_spec.rb | 4 ++-- Library/Homebrew/test/cmd/upgrade_spec.rb | 6 ++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/Library/Homebrew/test/cmd/install_spec.rb b/Library/Homebrew/test/cmd/install_spec.rb index 917633db1e..ebc4afd61c 100644 --- a/Library/Homebrew/test/cmd/install_spec.rb +++ b/Library/Homebrew/test/cmd/install_spec.rb @@ -103,7 +103,7 @@ RSpec.describe Homebrew::Cmd::InstallCmd do setup_test_formula "testball1", <<~RUBY depends_on "testball5" - #depends_on "testball-build" => :build + #depends_on "build" => :build depends_on "installed" RUBY setup_test_formula "installed" @@ -112,7 +112,7 @@ RSpec.describe Homebrew::Cmd::InstallCmd do RUBY setup_test_formula "testball4", "" setup_test_formula "hiop" - setup_test_formula "testball-build", "" + setup_test_formula "build", "" # Mock `Formula#any_version_installed?` by creating the tab in a plausible keg directory keg_dir = HOMEBREW_CELLAR/"installed"/"1.0" diff --git a/Library/Homebrew/test/cmd/upgrade_spec.rb b/Library/Homebrew/test/cmd/upgrade_spec.rb index a0b57c0e74..0913af485d 100644 --- a/Library/Homebrew/test/cmd/upgrade_spec.rb +++ b/Library/Homebrew/test/cmd/upgrade_spec.rb @@ -32,8 +32,7 @@ RSpec.describe Homebrew::Cmd::UpgradeCmd do it "upgrades dependencies with asking for user prompts", :integration_test do setup_test_formula "testball", <<~RUBY depends_on "testball5" - # should work as its not building but test doesnt pass if dependant - #depends_on "testball-build" => :build + #depends_on "build" => :build depends_on "installed" RUBY setup_test_formula "installed" @@ -42,7 +41,7 @@ RSpec.describe Homebrew::Cmd::UpgradeCmd do RUBY setup_test_formula "testball4" setup_test_formula "hiop" - setup_test_formula "testball-build" + setup_test_formula "build" (HOMEBREW_CELLAR/"testball/0.0.1/foo").mkpath (HOMEBREW_CELLAR/"testball5/0.0.1/foo").mkpath @@ -88,7 +87,6 @@ RSpec.describe Homebrew::Cmd::UpgradeCmd do content = <<~RUBY depends_on "testball5" - # should work as its not building but test doesnt pass if dependant depends_on "testball-build" => :build depends_on "installed" version "0.1" From d525e25e99a8c00c86bbd4f3196d5e0b5750865d Mon Sep 17 00:00:00 2001 From: thibhero Date: Wed, 11 Jun 2025 22:41:22 -0400 Subject: [PATCH 20/37] resolving discussions --- Library/Homebrew/upgrade.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Library/Homebrew/upgrade.rb b/Library/Homebrew/upgrade.rb index a7826ca7a6..2e3b8727d9 100644 --- a/Library/Homebrew/upgrade.rb +++ b/Library/Homebrew/upgrade.rb @@ -285,10 +285,10 @@ module Homebrew end return end - if dry_run || ask - installed_formulae = formulae.dup + installed_formulae = if dry_run || ask + formulae.dup else - installed_formulae = FormulaInstaller.installed.to_a.dup + FormulaInstaller.installed.to_a.dup end installed_formulae.reject! { |f| f.core_formula? && f.versioned_formula? } return if installed_formulae.empty? From 8c203df671fd1c682ff9cb9caa3868244a390d94 Mon Sep 17 00:00:00 2001 From: thibhero Date: Tue, 17 Jun 2025 19:20:43 -0400 Subject: [PATCH 21/37] trying to remove FormulaInstaller.installed to formulae --- Library/Homebrew/upgrade.rb | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Library/Homebrew/upgrade.rb b/Library/Homebrew/upgrade.rb index 2e3b8727d9..29d8c41a2d 100644 --- a/Library/Homebrew/upgrade.rb +++ b/Library/Homebrew/upgrade.rb @@ -285,11 +285,7 @@ module Homebrew end return end - installed_formulae = if dry_run || ask - formulae.dup - else - FormulaInstaller.installed.to_a.dup - end + installed_formulae = formulae.dup installed_formulae.reject! { |f| f.core_formula? && f.versioned_formula? } return if installed_formulae.empty? From 971a8b40e67a85c1ba20757fe4c50666f7a7d493 Mon Sep 17 00:00:00 2001 From: thibhero Date: Tue, 17 Jun 2025 19:21:17 -0400 Subject: [PATCH 22/37] refactoring as we can get dependants before installing --- Library/Homebrew/cmd/upgrade.rb | 50 +++++++++++---------------------- 1 file changed, 16 insertions(+), 34 deletions(-) diff --git a/Library/Homebrew/cmd/upgrade.rb b/Library/Homebrew/cmd/upgrade.rb index ff6b344054..3c1d553904 100644 --- a/Library/Homebrew/cmd/upgrade.rb +++ b/Library/Homebrew/cmd/upgrade.rb @@ -236,50 +236,32 @@ module Homebrew verbose: args.verbose?, ) - if args.ask? - dependants = Upgrade.dependants( - formulae_to_install, - flags: args.flags_only, - dry_run: args.dry_run?, - ask: args.ask?, - force_bottle: args.force_bottle?, - build_from_source_formulae: args.build_from_source_formulae, - interactive: args.interactive?, - keep_tmp: args.keep_tmp?, - debug_symbols: args.debug_symbols?, - force: args.force?, - debug: args.debug?, - quiet: args.quiet?, - verbose: args.verbose?, - ) + dependants = Upgrade.dependants( + formulae_to_install, + flags: args.flags_only, + dry_run: args.dry_run?, + ask: args.ask?, + force_bottle: args.force_bottle?, + build_from_source_formulae: args.build_from_source_formulae, + interactive: args.interactive?, + keep_tmp: args.keep_tmp?, + debug_symbols: args.debug_symbols?, + force: args.force?, + debug: args.debug?, + quiet: args.quiet?, + verbose: args.verbose?, + ) + if args.ask? formulae_dependencies = Install.collect_dependencies(formulae_installer, dependants) # Main block: if asking the user is enabled, show dependency and size information. Install.ask_formulae(formulae_dependencies, args: args) - end Upgrade.upgrade_formulae(formulae_installer, dry_run: args.dry_run?, verbose: args.verbose?) - unless args.ask? - dependants = Upgrade.dependants( - formulae_to_install, - flags: args.flags_only, - dry_run: args.dry_run?, - force_bottle: args.force_bottle?, - build_from_source_formulae: args.build_from_source_formulae, - interactive: args.interactive?, - keep_tmp: args.keep_tmp?, - debug_symbols: args.debug_symbols?, - force: args.force?, - debug: args.debug?, - quiet: args.quiet?, - verbose: args.verbose?, - ) - end - if dependants.present? Upgrade.upgrade_dependents( dependants, formulae_to_install, From fc18956eeba92b16e9fda5274c45822d663a8bf2 Mon Sep 17 00:00:00 2001 From: thibhero Date: Tue, 17 Jun 2025 20:21:32 -0400 Subject: [PATCH 23/37] removing longer tests and putting back integration_test.rb --- Library/Homebrew/test/cmd/install_spec.rb | 42 ------ Library/Homebrew/test/cmd/upgrade_spec.rb | 120 ------------------ .../spec/shared_context/integration_test.rb | 57 +++------ 3 files changed, 17 insertions(+), 202 deletions(-) diff --git a/Library/Homebrew/test/cmd/install_spec.rb b/Library/Homebrew/test/cmd/install_spec.rb index ebc4afd61c..1e8d70948d 100644 --- a/Library/Homebrew/test/cmd/install_spec.rb +++ b/Library/Homebrew/test/cmd/install_spec.rb @@ -95,46 +95,4 @@ RSpec.describe Homebrew::Cmd::InstallCmd do expect(HOMEBREW_CELLAR/"testball1/0.1/bin/test").to be_a_file end - - it "installs with asking for user prompts with installed dependent checks", :integration_test do - setup_test_formula "testball-parent", <<~RUBY - depends_on "testball1" - RUBY - - setup_test_formula "testball1", <<~RUBY - depends_on "testball5" - #depends_on "build" => :build - depends_on "installed" - RUBY - setup_test_formula "installed" - setup_test_formula "testball5", <<~RUBY - depends_on "testball4" - RUBY - setup_test_formula "testball4", "" - setup_test_formula "hiop" - setup_test_formula "build", "" - - # Mock `Formula#any_version_installed?` by creating the tab in a plausible keg directory - keg_dir = HOMEBREW_CELLAR/"installed"/"1.0" - keg_dir.mkpath - touch keg_dir/AbstractTab::FILENAME - - regex = / - Formulae\s*\(3\):\s* - (testball1|testball5|testball4) - \s*,\s* - ((?!\1)testball1|testball5|testball4) - \s*,\s* - ((?!\1|\2)testball1|testball5|testball4) - /x - - expect do - brew "install", "--ask", "testball1" - end.to output(regex).to_stdout - .and not_to_output.to_stderr - - expect(HOMEBREW_CELLAR/"testball1/0.1/bin/test").to be_a_file - expect(HOMEBREW_CELLAR/"testball4/0.1/bin/testball4").to be_a_file - expect(HOMEBREW_CELLAR/"testball5/0.1/bin/testball5").to be_a_file - end end diff --git a/Library/Homebrew/test/cmd/upgrade_spec.rb b/Library/Homebrew/test/cmd/upgrade_spec.rb index 0913af485d..cc82c242c4 100644 --- a/Library/Homebrew/test/cmd/upgrade_spec.rb +++ b/Library/Homebrew/test/cmd/upgrade_spec.rb @@ -28,124 +28,4 @@ RSpec.describe Homebrew::Cmd::UpgradeCmd do expect(HOMEBREW_CELLAR/"testball/0.1").to be_a_directory expect(HOMEBREW_CELLAR/"testball/0.0.1").not_to exist end - - it "upgrades dependencies with asking for user prompts", :integration_test do - setup_test_formula "testball", <<~RUBY - depends_on "testball5" - #depends_on "build" => :build - depends_on "installed" - RUBY - setup_test_formula "installed" - setup_test_formula "testball5", <<~RUBY - depends_on "testball4" - RUBY - setup_test_formula "testball4" - setup_test_formula "hiop" - setup_test_formula "build" - - (HOMEBREW_CELLAR/"testball/0.0.1/foo").mkpath - (HOMEBREW_CELLAR/"testball5/0.0.1/foo").mkpath - (HOMEBREW_CELLAR/"testball4/0.0.1/foo").mkpath - - keg_dir = HOMEBREW_CELLAR/"installed"/"1.0" - keg_dir.mkpath - touch keg_dir/AbstractTab::FILENAME - - regex = / - Formulae\s*\(3\):\s* - (testball|testball5|testball4) - \s*,\s* - ((?!\1)testball|testball5|testball4) - \s*,\s* - ((?!\1|\2)testball|testball5|testball4) - /x - expect do - brew "upgrade", "--ask" - end.to output(regex) - .to_stdout.and not_to_output.to_stderr - - expect(HOMEBREW_CELLAR/"testball/0.1").to be_a_directory - expect(HOMEBREW_CELLAR/"testball/0.0.1").not_to exist - expect(HOMEBREW_CELLAR/"testball5/0.1").to be_a_directory - expect(HOMEBREW_CELLAR/"testball5/0.0.1").not_to exist - expect(HOMEBREW_CELLAR/"testball4/0.1").to be_a_directory - expect(HOMEBREW_CELLAR/"testball4/0.0.1").not_to exist - end - - it "upgrades only the ‘testball’ formula, prompts for dependent checks, and verifies that other fields are updated", - :integration_test do - content = <<~RUBY - version "0.1" - depends_on "testball-parent" - RUBY - setup_test_formula "testball-parent-parent", content, testball_bottle: true - content = <<~RUBY - version "0.1" - depends_on "testball" - RUBY - setup_test_formula "testball-parent", content, testball_bottle: true - - content = <<~RUBY - depends_on "testball5" - depends_on "testball-build" => :build - depends_on "installed" - version "0.1" - RUBY - setup_test_formula "testball", content, testball_bottle: true - setup_test_formula "installed" - - content = <<~RUBY - version "0.1" - depends_on "testball4" - RUBY - setup_test_formula "testball5", content, testball_bottle: true - content = <<~RUBY - version "0.1" - RUBY - setup_test_formula "testball4", content, testball_bottle: true - setup_test_formula "hiop" - setup_test_formula "testball-build" - - (HOMEBREW_CELLAR/"testball/0.0.1/foo").mkpath - (HOMEBREW_CELLAR/"testball5/0.0.1/foo").mkpath - (HOMEBREW_CELLAR/"testball4/0.0.1/foo").mkpath - (HOMEBREW_CELLAR/"testball-parent/0.0.1/foo").mkpath - (HOMEBREW_CELLAR/"testball-parent-parent/0.0.1/foo").mkpath - - keg_dir = HOMEBREW_CELLAR/"installed"/"1.0" - keg_dir.mkpath - touch keg_dir/AbstractTab::FILENAME - - regex = / - Formulae\s*\(5\):\s* - (testball|testball5|testball4|testball-parent|testball-parent-parent) - \s*,\s* - ((?!\1)testball|testball5|testball4|testball-parent|testball-parent-parent) - \s*,\s* - ((?!\1|\2)testball|testball5|testball4|testball-parent|testball-parent-parent) - \s*,\s* - ((?!\1|\2|\3)testball|testball5|testball4|testball-parent|testball-parent-parent) - \s*,\s* - ((?!\1|\2|\3|\4)testball|testball5|testball4|testball-parent|testball-parent-parent) - /x - expect do - brew "upgrade", "--ask", "testball" - end.to output(regex) - .to_stdout.and not_to_output.to_stderr - - expect(HOMEBREW_CELLAR/"testball/0.1").to be_a_directory - expect(HOMEBREW_CELLAR/"testball/0.0.1").not_to exist - expect(HOMEBREW_CELLAR/"testball5/0.1").to be_a_directory - expect(HOMEBREW_CELLAR/"testball4/0.1").to be_a_directory - expect(HOMEBREW_CELLAR/"testball-parent/0.1").to be_a_directory - expect(HOMEBREW_CELLAR/"testball-parent/0.0.1").not_to exist - expect(HOMEBREW_CELLAR/"testball-parent-parent/0.1").to be_a_directory - expect(HOMEBREW_CELLAR/"testball-parent-parent/0.0.1").not_to exist - - # Those directories shouldn't exist anymore - # brew upgrade testball remove testball directory but not the following one - # Cleanup isn't applied on the dependencies - # expect(HOMEBREW_CELLAR/"testball5/0.0.1").not_to exist - # expect(HOMEBREW_CELLAR/"testball4/0.0.1").not_to exist - end end diff --git a/Library/Homebrew/test/support/helper/spec/shared_context/integration_test.rb b/Library/Homebrew/test/support/helper/spec/shared_context/integration_test.rb index f97343cfbc..c8fd48c78f 100644 --- a/Library/Homebrew/test/support/helper/spec/shared_context/integration_test.rb +++ b/Library/Homebrew/test/support/helper/spec/shared_context/integration_test.rb @@ -131,57 +131,34 @@ RSpec.shared_context "integration test" do # rubocop:disable RSpec/ContextWordin end end - def setup_test_formula(name, content = nil, testball_bottle: false, tap: CoreTap.instance, + def setup_test_formula(name, content = nil, tap: CoreTap.instance, bottle_block: nil, tab_attributes: nil) case name when /^testball/ - name_to_prog = { - "testball4" => "testball4", - "testball5" => "testball5", - "testball-build" => "testball-build", - "testball-parent" => "testball-parent", - "testball-parent-parent" => "testball-parent-parent", - "testball2" => "test", - } - - if (prog = name_to_prog[name]) - prefix = name - program_name = prog - else - prefix = "testball" - program_name = "test" - end - - tarball_name = "#{prefix}-0.1#{"-linux" if OS.linux?}.tbz" - tarball = TEST_FIXTURE_DIR / "tarballs/#{tarball_name}" - + # Use a different tarball for testball2 to avoid lock errors when writing concurrency tests + prefix = (name == "testball2") ? "testball2" : "testball" + tarball = if OS.linux? + TEST_FIXTURE_DIR/"tarballs/testball-0.1-linux.tbz" + TEST_FIXTURE_DIR/"tarballs/#{prefix}-0.1-linux.tbz" + else + TEST_FIXTURE_DIR/"tarballs/testball-0.1.tbz" + TEST_FIXTURE_DIR/"tarballs/#{prefix}-0.1.tbz" + end content = <<~RUBY desc "Some test" homepage "https://brew.sh/#{name}" url "file://#{tarball}" - #{ unless testball_bottle - <<~SHA_BLOCK - sha256 "#{tarball.sha256}" - SHA_BLOCK - end } + sha256 "#{tarball.sha256}" + option "with-foo", "Build with foo" - #{ if testball_bottle - tarball_bottle_name = "#{prefix}-0.1.all.bottle.tar.gz" - tarball_bottle = TEST_FIXTURE_DIR / "tarballs/#{tarball_bottle_name}" - <<~BOTTLE_BLOCK - bottle do - root_url "file://#{TEST_FIXTURE_DIR}/tarballs" - sha256 cellar: :any, all: "#{tarball_bottle.sha256}" - end - BOTTLE_BLOCK - end }#{bottle_block} + #{bottle_block} def install - (prefix/"foo"/"#{program_name}").write("#{program_name}") if build.with? "foo" + (prefix/"foo"/"test").write("test") if build.with? "foo" prefix.install Dir["*"] - (buildpath/"#{program_name}.c").write \ - "#include \\nint main(){printf(\\"#{program_name}\\");return 0;}" + (buildpath/"test.c").write \ + "#include \\nint main(){printf(\\"test\\");return 0;}" bin.mkpath - system ENV.cc, "#{program_name}.c", "-o", bin/"#{program_name}" + system ENV.cc, "test.c", "-o", bin/"test" end #{content} From ea7d441370c8aff15999c34648ed7351f820b99b Mon Sep 17 00:00:00 2001 From: thibhero Date: Tue, 17 Jun 2025 20:21:41 -0400 Subject: [PATCH 24/37] removing fixture --- .../tarballs/testball-0.1.all.bottle.tar.gz | Bin 172 -> 0 bytes .../tarballs/testball-build-0.1-linux.tbz | Bin 182 -> 0 bytes .../fixtures/tarballs/testball-build-0.1.tbz | Bin 172 -> 0 bytes .../tarballs/testball-parent-0.1-linux.tbz | Bin 180 -> 0 bytes .../testball-parent-0.1.all.bottle.tar.gz | Bin 176 -> 0 bytes .../fixtures/tarballs/testball-parent-0.1.tbz | Bin 181 -> 0 bytes .../testball-parent-parent-0.1.all.bottle.tar.gz | Bin 176 -> 0 bytes .../fixtures/tarballs/testball4-0.1-linux.tbz | Bin 176 -> 0 bytes .../tarballs/testball4-0.1.all.bottle.tar.gz | Bin 173 -> 0 bytes .../support/fixtures/tarballs/testball4-0.1.tbz | Bin 172 -> 0 bytes .../fixtures/tarballs/testball5-0.1-linux.tbz | Bin 177 -> 0 bytes .../tarballs/testball5-0.1.all.bottle.tar.gz | Bin 171 -> 0 bytes .../support/fixtures/tarballs/testball5-0.1.tbz | Bin 169 -> 0 bytes 13 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Library/Homebrew/test/support/fixtures/tarballs/testball-0.1.all.bottle.tar.gz delete mode 100644 Library/Homebrew/test/support/fixtures/tarballs/testball-build-0.1-linux.tbz delete mode 100644 Library/Homebrew/test/support/fixtures/tarballs/testball-build-0.1.tbz delete mode 100644 Library/Homebrew/test/support/fixtures/tarballs/testball-parent-0.1-linux.tbz delete mode 100644 Library/Homebrew/test/support/fixtures/tarballs/testball-parent-0.1.all.bottle.tar.gz delete mode 100644 Library/Homebrew/test/support/fixtures/tarballs/testball-parent-0.1.tbz delete mode 100644 Library/Homebrew/test/support/fixtures/tarballs/testball-parent-parent-0.1.all.bottle.tar.gz delete mode 100644 Library/Homebrew/test/support/fixtures/tarballs/testball4-0.1-linux.tbz delete mode 100644 Library/Homebrew/test/support/fixtures/tarballs/testball4-0.1.all.bottle.tar.gz delete mode 100644 Library/Homebrew/test/support/fixtures/tarballs/testball4-0.1.tbz delete mode 100644 Library/Homebrew/test/support/fixtures/tarballs/testball5-0.1-linux.tbz delete mode 100644 Library/Homebrew/test/support/fixtures/tarballs/testball5-0.1.all.bottle.tar.gz delete mode 100644 Library/Homebrew/test/support/fixtures/tarballs/testball5-0.1.tbz diff --git a/Library/Homebrew/test/support/fixtures/tarballs/testball-0.1.all.bottle.tar.gz b/Library/Homebrew/test/support/fixtures/tarballs/testball-0.1.all.bottle.tar.gz deleted file mode 100644 index 91294f5506273e1a118e4e2b4e8d04387f6d48f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172 zcmb2|=3oE==C_v|xegf!I9!xbRlmS_Hs##qqykHc4wYI00;m8fCw-ExC~^( z(+Q>~0%?H8OieJFVqhki0;q^+nuFBQMNQrj+!2`fo8`+l36I=lGW!Db|s kI9SP(C)HUMZ{%W^2R!KEqxs7v=!5)S$rRy2K!z@H99;NQ+yDRo diff --git a/Library/Homebrew/test/support/fixtures/tarballs/testball-build-0.1.tbz b/Library/Homebrew/test/support/fixtures/tarballs/testball-build-0.1.tbz deleted file mode 100644 index 6235bb5fb135ad6c63cbd3b8b7ed71694db76e84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172 zcmV;d08{@$T4*^jL0KkKS$a8kVgLZReTBe)1OPw-?|=Y;c4nRc00;m8fCw-ExC~)2 zGGHbE0~kz9ms~i%DD3u#1?((yv z8#fmJR#5wDrU{7WuLhW_TJf#ySu;%Wt0pB3A=kt7*wNAF*1n9Hl2G=^c5eBU aZN$khX8Y*=b8f02{}*yaI8cy!Id)=GW=u!` diff --git a/Library/Homebrew/test/support/fixtures/tarballs/testball-parent-0.1-linux.tbz b/Library/Homebrew/test/support/fixtures/tarballs/testball-parent-0.1-linux.tbz deleted file mode 100644 index c47d8469368ba0ade02ebfc54312c81d341a5c33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180 zcmV;l089TuT4*^jL0KkKSq3fjsQ>`JeTBe)1OPw-=YT-~c4yu|00;m8fCw-ExINn3`cU#K2831yLgspQwz7lo--zeYMk$GyWi(ArR%~Qr?khQZ?HM+c;9mp@i(@=M`o$l~u@6}RBl#az4dOBx&hCa(MLuir9Z2?y_z_vOWUW;Y&K zTbAwQ%iX=ZRYd>ig0O_Dsl|tjc7 diff --git a/Library/Homebrew/test/support/fixtures/tarballs/testball-parent-0.1.tbz b/Library/Homebrew/test/support/fixtures/tarballs/testball-parent-0.1.tbz deleted file mode 100644 index 4bc8f25414cfad9d3764a08653305b3adda7c726..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181 zcmV;m080NtT4*^jL0KkKSrk)dkN^O>eTBe)1OPw-_kaNec4yuI00;m8fCw-ExC~^( z(+Q>~0%?H8OieJFVqhki0;rQs6!ko#O+2Pdo~BPzvut$Aybw*0h-vM4YJ0L(V>F@) zB}VEzJFjzFBIDsBUA+-;E7UX5t7UAMj#GuRV>#Cn|2`a&fI! z{hBJiJFm3Ua_*_xoDknMfjQF4S<>e{Zx%{F!v3*W_S(_P+Zu0I?MpheRo^gstylGp zt(xR{WVMP$^Y25UtIgk|5o$A#a+LXR}~zWxDow3vi>IDU+3gKmzEv6 ZyZPT9dx)zbMgRb~eTBe)1OPw-?|=aWc4wYI00;m8fCw-ExC~^( z(+Q>~0%?H8OieJFVqhki0;q|U%3@?~5r(7G^*lP`$J-5vCg?;s+Qj?Ol2$jR5K$^U zD6^8ySH!ael1EJPMM+&k@0M!WF&I3k;I~?Eu2NMqyBaRCg<+rD^z?YsJqs>LLz$a% eOqi8<-fEVn+jDCEY{h~g{}*yaI8cxcb#F%4>`Qt8 diff --git a/Library/Homebrew/test/support/fixtures/tarballs/testball4-0.1.all.bottle.tar.gz b/Library/Homebrew/test/support/fixtures/tarballs/testball4-0.1.all.bottle.tar.gz deleted file mode 100644 index 38dfb779246df71b53a2efb265fa4afb3e18a755..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 173 zcmb2|=3oE==C_v|xegf!I9!xbRlneKR^@r7VZcJAEg%1F&o&W#{004jpFaWql zG{j*VU;qHdn2aM#000G15vqQQZ8bF7fsIW)PS2b3&khJC$V576iEnLQtR9AmL=;Mo z3M|2PH!5n8*K4Aru~55d>aR4}DA_Jn?xL5*x@VD8+bXiUg<-eb^ze4yZOm3Aq0wgc aDDRo&FDD#o{&1oo*t?P`!i0d|3%GC*TS+4T diff --git a/Library/Homebrew/test/support/fixtures/tarballs/testball5-0.1-linux.tbz b/Library/Homebrew/test/support/fixtures/tarballs/testball5-0.1-linux.tbz deleted file mode 100644 index 5fe9e86f878298002ebc01c64f958433e7d7d45b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 177 zcmV;i08alxT4*^jL0KkKSu$bvtN;MGeTBe)1OPw-?|=aWc4wYI00;m8fCw-ExC~^( z(+Q>~0%?H8OieJFVqhki0;*`4PgKni+foc_Jx^1+wfXVOazt4qq|cp8bcYodGeS}( zgx*tCbz3cwL)8OJT`CZ&W|^s@3fTg=xKTb=tHR|_ie77=wIs*W^zwJt8kJarXG0DR feHSS4$k`2z_x5c5Zo4F;e~Y;yoG3^cF#A>jrHV=E diff --git a/Library/Homebrew/test/support/fixtures/tarballs/testball5-0.1.all.bottle.tar.gz b/Library/Homebrew/test/support/fixtures/tarballs/testball5-0.1.all.bottle.tar.gz deleted file mode 100644 index 77b8c88413c7bca5534be4bc65924045b1f619af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 171 zcmb2|=3oE==C_ycavd_@X?qxVYMq1dwJp~-Cng?px$)}nZP_2}T}rbJYUWRtF}ZMH z`V*69+g?`R-gVSN@a(cx7oY5lvoO6VVCuo)w{rp3Nj z)!+98{hYNwr(~h*52gC}TPOds%YBv)+HAdK=l>Z@eD~_7)yIBwsl8D2-{`x-`9GEa UAP$0%5!;RR^Hi2GXfQAU06pJObN~PV diff --git a/Library/Homebrew/test/support/fixtures/tarballs/testball5-0.1.tbz b/Library/Homebrew/test/support/fixtures/tarballs/testball5-0.1.tbz deleted file mode 100644 index 98c4fa6b74bde104aed5ea94f26729d9de6c862e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 169 zcmV;a09OA(T4*^jL0KkKS!D{r!~g)ae}%w+1OPw-?|=XV5CC>&o&W#{004jpFaWql zFqoMz6955>CMHY-zyK9QOp{Gbq-`L^iRsz*!1N{dqhcw(GHF$tY;MYm|55 XdP~v1{NL@=L>w1#ML1B9WeUN>Wu--T From 1b0e79121a734c1f939224ccaf411b6ff4385b2e Mon Sep 17 00:00:00 2001 From: thibhero Date: Tue, 17 Jun 2025 20:36:47 -0400 Subject: [PATCH 25/37] brew style error --- .../helper/spec/shared_context/integration_test.rb | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/Library/Homebrew/test/support/helper/spec/shared_context/integration_test.rb b/Library/Homebrew/test/support/helper/spec/shared_context/integration_test.rb index c8fd48c78f..6c24f3635e 100644 --- a/Library/Homebrew/test/support/helper/spec/shared_context/integration_test.rb +++ b/Library/Homebrew/test/support/helper/spec/shared_context/integration_test.rb @@ -138,12 +138,10 @@ RSpec.shared_context "integration test" do # rubocop:disable RSpec/ContextWordin # Use a different tarball for testball2 to avoid lock errors when writing concurrency tests prefix = (name == "testball2") ? "testball2" : "testball" tarball = if OS.linux? - TEST_FIXTURE_DIR/"tarballs/testball-0.1-linux.tbz" - TEST_FIXTURE_DIR/"tarballs/#{prefix}-0.1-linux.tbz" - else - TEST_FIXTURE_DIR/"tarballs/testball-0.1.tbz" - TEST_FIXTURE_DIR/"tarballs/#{prefix}-0.1.tbz" - end + TEST_FIXTURE_DIR/"tarballs/#{prefix}-0.1-linux.tbz" + else + TEST_FIXTURE_DIR/"tarballs/#{prefix}-0.1.tbz" + end content = <<~RUBY desc "Some test" homepage "https://brew.sh/#{name}" From fe06e04e287e6c85d98eef6ef460cd23fa81c4aa Mon Sep 17 00:00:00 2001 From: thibhero Date: Tue, 17 Jun 2025 21:12:47 -0400 Subject: [PATCH 26/37] refactoring install.rb and reinstall.rb after removing Formula.installed --- Library/Homebrew/cmd/install.rb | 52 ++++++++++--------------------- Library/Homebrew/cmd/reinstall.rb | 50 ++++++++++------------------- 2 files changed, 34 insertions(+), 68 deletions(-) diff --git a/Library/Homebrew/cmd/install.rb b/Library/Homebrew/cmd/install.rb index ec0c4ca6f2..4a93db4044 100644 --- a/Library/Homebrew/cmd/install.rb +++ b/Library/Homebrew/cmd/install.rb @@ -336,24 +336,24 @@ module Homebrew skip_link: args.skip_link?, ) - if args.ask? - dependants = Upgrade.dependants( - installed_formulae, - flags: args.flags_only, - ask: args.ask?, - installed_on_request: !args.as_dependency?, - force_bottle: args.force_bottle?, - build_from_source_formulae: args.build_from_source_formulae, - interactive: args.interactive?, - keep_tmp: args.keep_tmp?, - debug_symbols: args.debug_symbols?, - force: args.force?, - debug: args.debug?, - quiet: args.quiet?, - verbose: args.verbose?, - dry_run: args.dry_run?, - ) + dependants = Upgrade.dependants( + installed_formulae, + flags: args.flags_only, + ask: args.ask?, + installed_on_request: !args.as_dependency?, + force_bottle: args.force_bottle?, + build_from_source_formulae: args.build_from_source_formulae, + interactive: args.interactive?, + keep_tmp: args.keep_tmp?, + debug_symbols: args.debug_symbols?, + force: args.force?, + debug: args.debug?, + quiet: args.quiet?, + verbose: args.verbose?, + dry_run: args.dry_run?, + ) + if args.ask? formulae_dependencies = Install.collect_dependencies(formulae_installer, dependants) # Main block: if asking the user is enabled, show dependency and size information. Install.ask_formulae(formulae_dependencies, args: args) @@ -363,24 +363,6 @@ module Homebrew dry_run: args.dry_run?, verbose: args.verbose?) - unless args.ask? - dependants = Upgrade.dependants( - installed_formulae, - flags: args.flags_only, - dry_run: args.dry_run?, - installed_on_request: !args.as_dependency?, - force_bottle: args.force_bottle?, - build_from_source_formulae: args.build_from_source_formulae, - interactive: args.interactive?, - keep_tmp: args.keep_tmp?, - debug_symbols: args.debug_symbols?, - force: args.force?, - debug: args.debug?, - quiet: args.quiet?, - verbose: args.verbose?, - ) - end - if dependants.present? Upgrade.upgrade_dependents( dependants, installed_formulae, diff --git a/Library/Homebrew/cmd/reinstall.rb b/Library/Homebrew/cmd/reinstall.rb index 7a65ea3251..3aff30f285 100644 --- a/Library/Homebrew/cmd/reinstall.rb +++ b/Library/Homebrew/cmd/reinstall.rb @@ -152,28 +152,28 @@ module Homebrew ) end - if args.ask? - dependants = Upgrade.dependants( - formulae, - flags: args.flags_only, - ask: args.ask?, - force_bottle: args.force_bottle?, - build_from_source_formulae: args.build_from_source_formulae, - interactive: args.interactive?, - keep_tmp: args.keep_tmp?, - debug_symbols: args.debug_symbols?, - force: args.force?, - debug: args.debug?, - quiet: args.quiet?, - verbose: args.verbose?, - ) + dependants = Upgrade.dependants( + formulae, + flags: args.flags_only, + ask: args.ask?, + force_bottle: args.force_bottle?, + build_from_source_formulae: args.build_from_source_formulae, + interactive: args.interactive?, + keep_tmp: args.keep_tmp?, + debug_symbols: args.debug_symbols?, + force: args.force?, + debug: args.debug?, + quiet: args.quiet?, + verbose: args.verbose?, + ) - formulae_installer = formulae_kegs.map(&:formula_installer) + formulae_installer = formulae_kegs.map(&:formula_installer) + + if args.ask? formulae_dependencies = Install.collect_dependencies(formulae_installer, dependants) # Main block: if asking the user is enabled, show dependency and size information. Install.ask_formulae(formulae_dependencies, args: args) - end formulae_kegs.each do |f| @@ -194,22 +194,6 @@ module Homebrew Cleanup.install_formula_clean!(f.formula) end - unless args.ask? - dependants = Upgrade.dependants( - formulae, - flags: args.flags_only, - force_bottle: args.force_bottle?, - build_from_source_formulae: args.build_from_source_formulae, - interactive: args.interactive?, - keep_tmp: args.keep_tmp?, - debug_symbols: args.debug_symbols?, - force: args.force?, - debug: args.debug?, - quiet: args.quiet?, - verbose: args.verbose?, - ) - end - if dependants.present? Upgrade.upgrade_dependents( dependants, formulae, From 19901b5332affcd121c6afbb32f28bf2d23714f9 Mon Sep 17 00:00:00 2001 From: thibhero Date: Wed, 18 Jun 2025 16:05:19 -0400 Subject: [PATCH 27/37] refactoring style to resolve the last discussions --- Library/Homebrew/cmd/install.rb | 37 +++++++++++++------------------ Library/Homebrew/cmd/reinstall.rb | 36 +++++++++++++----------------- Library/Homebrew/cmd/upgrade.rb | 37 +++++++++++++------------------ Library/Homebrew/install.rb | 26 ++++++++++++---------- Library/Homebrew/upgrade.rb | 2 ++ 5 files changed, 63 insertions(+), 75 deletions(-) diff --git a/Library/Homebrew/cmd/install.rb b/Library/Homebrew/cmd/install.rb index 4a93db4044..2958afb0e4 100644 --- a/Library/Homebrew/cmd/install.rb +++ b/Library/Homebrew/cmd/install.rb @@ -353,32 +353,27 @@ module Homebrew dry_run: args.dry_run?, ) - if args.ask? - formulae_dependencies = Install.collect_dependencies(formulae_installer, dependants) - # Main block: if asking the user is enabled, show dependency and size information. - Install.ask_formulae(formulae_dependencies, args: args) - end + # Main block: if asking the user is enabled, show dependency and size information. + Install.ask_formulae(formulae_installer, dependants, args: args) if args.ask? Install.install_formulae(formulae_installer, dry_run: args.dry_run?, verbose: args.verbose?) - if dependants.present? - Upgrade.upgrade_dependents( - dependants, installed_formulae, - flags: args.flags_only, - dry_run: args.dry_run?, - force_bottle: args.force_bottle?, - build_from_source_formulae: args.build_from_source_formulae, - interactive: args.interactive?, - keep_tmp: args.keep_tmp?, - debug_symbols: args.debug_symbols?, - force: args.force?, - debug: args.debug?, - quiet: args.quiet?, - verbose: args.verbose? - ) - end + Upgrade.upgrade_dependents( + dependants, installed_formulae, + flags: args.flags_only, + dry_run: args.dry_run?, + force_bottle: args.force_bottle?, + build_from_source_formulae: args.build_from_source_formulae, + interactive: args.interactive?, + keep_tmp: args.keep_tmp?, + debug_symbols: args.debug_symbols?, + force: args.force?, + debug: args.debug?, + quiet: args.quiet?, + verbose: args.verbose? + ) Cleanup.periodic_clean!(dry_run: args.dry_run?) diff --git a/Library/Homebrew/cmd/reinstall.rb b/Library/Homebrew/cmd/reinstall.rb index 3aff30f285..e6cb06a53d 100644 --- a/Library/Homebrew/cmd/reinstall.rb +++ b/Library/Homebrew/cmd/reinstall.rb @@ -169,12 +169,8 @@ module Homebrew formulae_installer = formulae_kegs.map(&:formula_installer) - if args.ask? - - formulae_dependencies = Install.collect_dependencies(formulae_installer, dependants) - # Main block: if asking the user is enabled, show dependency and size information. - Install.ask_formulae(formulae_dependencies, args: args) - end + # Main block: if asking the user is enabled, show dependency and size information. + Install.ask_formulae(formulae_installer, dependants, args: args) if args.ask? formulae_kegs.each do |f| Homebrew::Reinstall.reinstall_formula( @@ -194,21 +190,19 @@ module Homebrew Cleanup.install_formula_clean!(f.formula) end - if dependants.present? - Upgrade.upgrade_dependents( - dependants, formulae, - flags: args.flags_only, - force_bottle: args.force_bottle?, - build_from_source_formulae: args.build_from_source_formulae, - interactive: args.interactive?, - keep_tmp: args.keep_tmp?, - debug_symbols: args.debug_symbols?, - force: args.force?, - debug: args.debug?, - quiet: args.quiet?, - verbose: args.verbose? - ) - end + Upgrade.upgrade_dependents( + dependants, formulae, + flags: args.flags_only, + force_bottle: args.force_bottle?, + build_from_source_formulae: args.build_from_source_formulae, + interactive: args.interactive?, + keep_tmp: args.keep_tmp?, + debug_symbols: args.debug_symbols?, + force: args.force?, + debug: args.debug?, + quiet: args.quiet?, + verbose: args.verbose? + ) end if casks.any? diff --git a/Library/Homebrew/cmd/upgrade.rb b/Library/Homebrew/cmd/upgrade.rb index 3c1d553904..1959c6ea46 100644 --- a/Library/Homebrew/cmd/upgrade.rb +++ b/Library/Homebrew/cmd/upgrade.rb @@ -252,32 +252,27 @@ module Homebrew verbose: args.verbose?, ) - if args.ask? - formulae_dependencies = Install.collect_dependencies(formulae_installer, dependants) - # Main block: if asking the user is enabled, show dependency and size information. - Install.ask_formulae(formulae_dependencies, args: args) - end + # Main block: if asking the user is enabled, show dependency and size information. + Install.ask_formulae(formulae_installer, dependants, args: args) if args.ask? Upgrade.upgrade_formulae(formulae_installer, dry_run: args.dry_run?, verbose: args.verbose?) - if dependants.present? - Upgrade.upgrade_dependents( - dependants, formulae_to_install, - flags: args.flags_only, - dry_run: args.dry_run?, - force_bottle: args.force_bottle?, - build_from_source_formulae: args.build_from_source_formulae, - interactive: args.interactive?, - keep_tmp: args.keep_tmp?, - debug_symbols: args.debug_symbols?, - force: args.force?, - debug: args.debug?, - quiet: args.quiet?, - verbose: args.verbose? - ) - end + Upgrade.upgrade_dependents( + dependants, formulae_to_install, + flags: args.flags_only, + dry_run: args.dry_run?, + force_bottle: args.force_bottle?, + build_from_source_formulae: args.build_from_source_formulae, + interactive: args.interactive?, + keep_tmp: args.keep_tmp?, + debug_symbols: args.debug_symbols?, + force: args.force?, + debug: args.debug?, + quiet: args.quiet?, + verbose: args.verbose? + ) true end diff --git a/Library/Homebrew/install.rb b/Library/Homebrew/install.rb index 0d773bbaf5..53c28b6b52 100644 --- a/Library/Homebrew/install.rb +++ b/Library/Homebrew/install.rb @@ -353,19 +353,11 @@ module Homebrew puts formula_names.join(" ") end - def collect_dependencies(formulae_installer, dependants) - formulae_dependencies = formulae_installer.flat_map do |f| - [f.formula, f.compute_dependencies.flatten.filter do |c| - c.is_a? Dependency - end.flat_map(&:to_formula)] - end.flatten.uniq - formulae_dependencies.concat(dependants.upgradeable) if dependants&.upgradeable - formulae_dependencies - end - # If asking the user is enabled, show dependency and size information. - def ask_formulae(formulae, args:) - return if formulae.empty? + def ask_formulae(formulae_installer, dependants, args:) + return if formulae_installer.empty? + + formulae = collect_dependencies(formulae_installer, dependants) ohai "Looking for bottles..." @@ -469,6 +461,16 @@ module Homebrew installed: total_installed_size, net: total_net_size } end + + def collect_dependencies(formulae_installer, dependants) + formulae_dependencies = formulae_installer.flat_map do |f| + [f.formula, f.compute_dependencies.flatten.filter do |c| + c.is_a? Dependency + end.flat_map(&:to_formula)] + end.flatten.uniq + formulae_dependencies.concat(dependants.upgradeable) if dependants&.upgradeable + formulae_dependencies + end end end end diff --git a/Library/Homebrew/upgrade.rb b/Library/Homebrew/upgrade.rb index 29d8c41a2d..be3c21463e 100644 --- a/Library/Homebrew/upgrade.rb +++ b/Library/Homebrew/upgrade.rb @@ -329,6 +329,8 @@ module Homebrew debug: false, quiet: false, verbose: false) + return if deps.blank? + upgradeable = deps.upgradeable pinned = deps.pinned skipped = deps.skipped From bcc7f0f79615a9a4c5939261161d19590b3e5cec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibaut=20H=C3=A9rault?= <78233978+tyuwags@users.noreply.github.com> Date: Fri, 20 Jun 2025 11:10:18 -0400 Subject: [PATCH 28/37] Update Library/Homebrew/install.rb Co-authored-by: Bo Anderson --- Library/Homebrew/install.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Library/Homebrew/install.rb b/Library/Homebrew/install.rb index 53c28b6b52..48b9acb362 100644 --- a/Library/Homebrew/install.rb +++ b/Library/Homebrew/install.rb @@ -231,7 +231,7 @@ module Homebrew false end - def formulae_installer( + def formula_installers( formulae_to_install, installed_on_request: true, installed_as_dependency: false, From 0800faf0938c8208a5dc3334bdc83523e5bb122f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibaut=20H=C3=A9rault?= <78233978+tyuwags@users.noreply.github.com> Date: Fri, 20 Jun 2025 11:10:36 -0400 Subject: [PATCH 29/37] Update Library/Homebrew/upgrade.rb Co-authored-by: Bo Anderson --- Library/Homebrew/upgrade.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Library/Homebrew/upgrade.rb b/Library/Homebrew/upgrade.rb index be3c21463e..b4ce68697a 100644 --- a/Library/Homebrew/upgrade.rb +++ b/Library/Homebrew/upgrade.rb @@ -13,7 +13,7 @@ module Homebrew module Upgrade Dependents = Struct.new(:upgradeable, :pinned, :skipped) - def self.formulae_installer( + def self.formula_installers( formulae_to_install, flags:, dry_run: false, From 052c0ae2cd18518e83281383b5fa7df94ebccaf4 Mon Sep 17 00:00:00 2001 From: thibhero Date: Fri, 20 Jun 2025 12:25:12 -0400 Subject: [PATCH 30/37] adding parameter to fetch quietly if wanted --- Library/Homebrew/formula.rb | 6 +++--- Library/Homebrew/formula_installer.rb | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index bf570f6c1e..f0c46d1f28 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -3205,11 +3205,11 @@ class Formula patchlist.select(&:external?).each(&:fetch) end - sig { void } - def fetch_bottle_tab + sig { params(quiet: T::Boolean).void } + def fetch_bottle_tab(quiet: false) return unless bottled? - T.must(bottle).fetch_tab + T.must(bottle).fetch_tab(quiet: quiet) end sig { returns(T::Hash[String, T.untyped]) } diff --git a/Library/Homebrew/formula_installer.rb b/Library/Homebrew/formula_installer.rb index 56d9094ac2..3cb2518c89 100644 --- a/Library/Homebrew/formula_installer.rb +++ b/Library/Homebrew/formula_installer.rb @@ -1355,12 +1355,12 @@ on_request: installed_on_request?, options:) end end - sig { void } - def fetch_bottle_tab + sig { params(quiet: T::Boolean).void } + def fetch_bottle_tab(quiet: false) return if @fetch_bottle_tab begin - formula.fetch_bottle_tab + formula.fetch_bottle_tab(quiet: quiet) @bottle_tab_runtime_dependencies = formula.bottle_tab_attributes .fetch("runtime_dependencies", []).then { |deps| deps || [] } .each_with_object({}) { |dep, h| h[dep["full_name"]] = dep } From 0db36b57c85dd0c75b293388e462d936cc2e0bac Mon Sep 17 00:00:00 2001 From: thibhero Date: Fri, 20 Jun 2025 12:25:55 -0400 Subject: [PATCH 31/37] fetching tab and renaming variables --- Library/Homebrew/upgrade.rb | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/Library/Homebrew/upgrade.rb b/Library/Homebrew/upgrade.rb index be3c21463e..4bbb821c7c 100644 --- a/Library/Homebrew/upgrade.rb +++ b/Library/Homebrew/upgrade.rb @@ -67,10 +67,12 @@ module Homebrew quiet:, verbose:, ) + fi.fetch_bottle_tab(quiet: !debug) + if !dry_run && dependents && fi.bottle_tab_runtime_dependencies.presence&.all? do |dependency, hash| - minimum_version = Version.new(hash["version"]) if hash["version"].present? - Dependency.new(dependency).installed?(minimum_version:, minimum_revision: hash["revision"]) - end + minimum_version = Version.new(hash["version"]) if hash["version"].present? + Dependency.new(dependency).installed?(minimum_version:, minimum_revision: hash["revision"]) + end # Don't need to install this bottle if all of the runtime # dependencies have the same or newer version already installed. next @@ -285,15 +287,15 @@ module Homebrew end return end - installed_formulae = formulae.dup - installed_formulae.reject! { |f| f.core_formula? && f.versioned_formula? } - return if installed_formulae.empty? + formulae_to_install = formulae.dup + formulae_to_install.reject! { |f| f.core_formula? && f.versioned_formula? } + return if formulae_to_install.empty? - already_broken_dependents = check_broken_dependents(installed_formulae) + already_broken_dependents = check_broken_dependents(formulae_to_install) # TODO: this should be refactored to use FormulaInstaller new logic outdated_dependents = - installed_formulae.flat_map(&:runtime_installed_formula_dependents) + formulae_to_install.flat_map(&:runtime_installed_formula_dependents) .uniq .select(&:outdated?) @@ -304,7 +306,7 @@ module Homebrew return if outdated_dependents.blank? && already_broken_dependents.blank? - outdated_dependents -= installed_formulae if dry_run + outdated_dependents -= formulae_to_install if dry_run upgradeable_dependents = outdated_dependents.reject(&:pinned?) @@ -370,7 +372,7 @@ module Homebrew end unless dry_run - formulae_dependencies = formulae_installer( + dependent_installers = formulae_installer( upgradeable, flags:, force_bottle:, @@ -384,7 +386,7 @@ module Homebrew quiet:, verbose:, ) - upgrade_formulae formulae_dependencies + upgrade_formulae dependent_installers end # Update installed formulae after upgrading @@ -440,7 +442,7 @@ module Homebrew return if dry_run reinstallable_broken_dependents.each do |formula| - formula_installer = Reinstall.formula_installer( + formula_installer = Reinstall.build_install_context( formula, flags:, force_bottle:, From 90b697995ff05376a5a4ecfe0dd09e6d95740afd Mon Sep 17 00:00:00 2001 From: thibhero Date: Fri, 20 Jun 2025 12:28:38 -0400 Subject: [PATCH 32/37] renaming parameter, method and struct to make it more understandable --- Library/Homebrew/reinstall.rb | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Library/Homebrew/reinstall.rb b/Library/Homebrew/reinstall.rb index 8fd5329dc9..f6a7cc882e 100644 --- a/Library/Homebrew/reinstall.rb +++ b/Library/Homebrew/reinstall.rb @@ -7,8 +7,8 @@ require "messages" module Homebrew module Reinstall - FormulaKeg = Struct.new(:formula_installer, :keg, :formula, :options) - def self.formula_installer( + InstallationContext = Struct.new(:formula_installer, :keg, :formula, :options) + def self.build_install_context( formula, flags:, force_bottle: false, @@ -62,11 +62,11 @@ module Homebrew verbose:, }.compact, ) - FormulaKeg.new(fi, keg, formula, options) + InstallationContext.new(fi, keg, formula, options) end def self.reinstall_formula( - formula_keg, + install_context, flags:, force_bottle: false, build_from_source_formulae: [], @@ -79,10 +79,10 @@ module Homebrew verbose: false, git: false ) - formula_installer = formula_keg.formula_installer - keg = formula_keg.keg - formula = formula_keg.formula - options = formula_keg.options + formula_installer = install_context.formula_installer + keg = install_context.keg + formula = install_context.formula + options = install_context.options link_keg = keg.linked? formula_installer.prelude formula_installer.fetch From 2fb6105f26c062f0cf9de38c2ad28bf83bfedc0f Mon Sep 17 00:00:00 2001 From: thibhero Date: Fri, 20 Jun 2025 12:29:02 -0400 Subject: [PATCH 33/37] renaming variable --- Library/Homebrew/cmd/reinstall.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Library/Homebrew/cmd/reinstall.rb b/Library/Homebrew/cmd/reinstall.rb index e6cb06a53d..e0dd7182dc 100644 --- a/Library/Homebrew/cmd/reinstall.rb +++ b/Library/Homebrew/cmd/reinstall.rb @@ -130,13 +130,13 @@ module Homebrew unless formulae.empty? Install.perform_preinstall_checks_once - formulae_kegs = formulae.map do |formula| + install_context = formulae.map do |formula| if formula.pinned? onoe "#{formula.full_name} is pinned. You must unpin it to reinstall." next end Migrator.migrate_if_needed(formula, force: args.force?) - Homebrew::Reinstall.formula_installer( + Homebrew::Reinstall.build_install_context( formula, flags: args.flags_only, force_bottle: args.force_bottle?, @@ -167,12 +167,12 @@ module Homebrew verbose: args.verbose?, ) - formulae_installer = formulae_kegs.map(&:formula_installer) + formulae_installer = install_context.map(&:formula_installer) # Main block: if asking the user is enabled, show dependency and size information. Install.ask_formulae(formulae_installer, dependants, args: args) if args.ask? - formulae_kegs.each do |f| + install_context.each do |f| Homebrew::Reinstall.reinstall_formula( f, flags: args.flags_only, From 6d0a77fc79ae4b0feb5d5d63fc44a3f7b04c07ef Mon Sep 17 00:00:00 2001 From: thibhero Date: Fri, 20 Jun 2025 12:32:46 -0400 Subject: [PATCH 34/37] fixing method refactoring --- Library/Homebrew/cmd/install.rb | 2 +- Library/Homebrew/cmd/upgrade.rb | 2 +- Library/Homebrew/upgrade.rb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Library/Homebrew/cmd/install.rb b/Library/Homebrew/cmd/install.rb index 2958afb0e4..60c272ac9e 100644 --- a/Library/Homebrew/cmd/install.rb +++ b/Library/Homebrew/cmd/install.rb @@ -310,7 +310,7 @@ module Homebrew Install.perform_preinstall_checks_once Install.check_cc_argv(args.cc) - formulae_installer = Install.formulae_installer( + formulae_installer = Install.formula_installers( installed_formulae, installed_on_request: !args.as_dependency?, installed_as_dependency: args.as_dependency?, diff --git a/Library/Homebrew/cmd/upgrade.rb b/Library/Homebrew/cmd/upgrade.rb index 1959c6ea46..aa23543312 100644 --- a/Library/Homebrew/cmd/upgrade.rb +++ b/Library/Homebrew/cmd/upgrade.rb @@ -220,7 +220,7 @@ module Homebrew Install.perform_preinstall_checks_once - formulae_installer = Upgrade.formulae_installer( + formulae_installer = Upgrade.formula_installers( formulae_to_install, flags: args.flags_only, dry_run: args.dry_run?, diff --git a/Library/Homebrew/upgrade.rb b/Library/Homebrew/upgrade.rb index ade0a24dbf..7aa08e7ef1 100644 --- a/Library/Homebrew/upgrade.rb +++ b/Library/Homebrew/upgrade.rb @@ -372,7 +372,7 @@ module Homebrew end unless dry_run - dependent_installers = formulae_installer( + dependent_installers = formula_installers( upgradeable, flags:, force_bottle:, From a16129fc5920c4a85c462fe30fae64523911f65b Mon Sep 17 00:00:00 2001 From: thibhero Date: Fri, 20 Jun 2025 12:36:22 -0400 Subject: [PATCH 35/37] new line to make it easier to understand --- Library/Homebrew/upgrade.rb | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Library/Homebrew/upgrade.rb b/Library/Homebrew/upgrade.rb index 7aa08e7ef1..72654c704a 100644 --- a/Library/Homebrew/upgrade.rb +++ b/Library/Homebrew/upgrade.rb @@ -69,7 +69,8 @@ module Homebrew ) fi.fetch_bottle_tab(quiet: !debug) - if !dry_run && dependents && fi.bottle_tab_runtime_dependencies.presence&.all? do |dependency, hash| + if !dry_run && dependents + fi.bottle_tab_runtime_dependencies.presence&.all? do |dependency, hash| minimum_version = Version.new(hash["version"]) if hash["version"].present? Dependency.new(dependency).installed?(minimum_version:, minimum_revision: hash["revision"]) end @@ -296,8 +297,8 @@ module Homebrew # TODO: this should be refactored to use FormulaInstaller new logic outdated_dependents = formulae_to_install.flat_map(&:runtime_installed_formula_dependents) - .uniq - .select(&:outdated?) + .uniq + .select(&:outdated?) # Ensure we never attempt a source build for outdated dependents of upgraded formulae. outdated_dependents, skipped_dependents = outdated_dependents.partition do |dependent| From f674a3ac03b1672de47e64f0d2d3946b9e9f8429 Mon Sep 17 00:00:00 2001 From: thibhero Date: Fri, 20 Jun 2025 12:59:15 -0400 Subject: [PATCH 36/37] comment --- Library/Homebrew/reinstall.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/Library/Homebrew/reinstall.rb b/Library/Homebrew/reinstall.rb index f6a7cc882e..4d5ff2485c 100644 --- a/Library/Homebrew/reinstall.rb +++ b/Library/Homebrew/reinstall.rb @@ -7,6 +7,7 @@ require "messages" module Homebrew module Reinstall + # struct to keep context of the current installer, keg, formula and option InstallationContext = Struct.new(:formula_installer, :keg, :formula, :options) def self.build_install_context( formula, From 2d39c7feb5eda31ed93d24f5f55f6306e0bad65e Mon Sep 17 00:00:00 2001 From: thibhero Date: Fri, 20 Jun 2025 16:41:32 -0400 Subject: [PATCH 37/37] making flow easier to understand --- Library/Homebrew/upgrade.rb | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/Library/Homebrew/upgrade.rb b/Library/Homebrew/upgrade.rb index 72654c704a..fa7bcf7c1f 100644 --- a/Library/Homebrew/upgrade.rb +++ b/Library/Homebrew/upgrade.rb @@ -69,11 +69,12 @@ module Homebrew ) fi.fetch_bottle_tab(quiet: !debug) - if !dry_run && dependents - fi.bottle_tab_runtime_dependencies.presence&.all? do |dependency, hash| - minimum_version = Version.new(hash["version"]) if hash["version"].present? - Dependency.new(dependency).installed?(minimum_version:, minimum_revision: hash["revision"]) - end + all_runtime_deps_installed = fi.bottle_tab_runtime_dependencies.presence&.all? do |dependency, hash| + minimum_version = Version.new(hash["version"]) if hash["version"].present? + Dependency.new(dependency).installed?(minimum_version:, minimum_revision: hash["revision"]) + end + + if !dry_run && dependents && all_runtime_deps_installed # Don't need to install this bottle if all of the runtime # dependencies have the same or newer version already installed. next @@ -91,8 +92,8 @@ module Homebrew end def self.upgrade_formulae(formula_installers, dry_run: false, verbose: false) - formula_installers.each do |fi| - begin + unless dry_run + formula_installers.each do |fi| fi.prelude fi.fetch rescue CannotInstallFormulaError => e @@ -100,7 +101,9 @@ module Homebrew rescue UnsatisfiedRequirements, DownloadError => e ofail "#{fi.formula.full_name}: #{e}" end + end + formula_installers.each do |fi| upgrade_formula(fi, dry_run:, verbose:) Cleanup.install_formula_clean!(fi.formula, dry_run:) end @@ -387,7 +390,9 @@ module Homebrew quiet:, verbose:, ) - upgrade_formulae dependent_installers + puts "here", dependent_installers + puts "here", upgradeable + upgrade_formulae(dependent_installers, dry_run: dry_run, verbose: verbose) end # Update installed formulae after upgrading