Skip to content

Commit 033123b

Browse files
authored
Merge pull request #21700 from Homebrew/unlink_keg_only_fix
unlink: preserve non-keg-only versioned links
2 parents 0160cd1 + 391fb9a commit 033123b

File tree

2 files changed

+31
-14
lines changed

2 files changed

+31
-14
lines changed

Library/Homebrew/test/unlink_spec.rb

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,35 @@
44

55
RSpec.describe Homebrew::Unlink do
66
describe ".unlink_link_overwrite_formulae" do
7-
let(:formula) { instance_double(Formula) }
8-
let(:linked_keg) { instance_double(Keg, directory?: true) }
9-
let(:linked_formula) { instance_double(Formula, keg_only?: true, linked?: true, any_installed_keg: linked_keg) }
7+
let(:formula) { instance_double(Formula, keg_only?: false) }
8+
let(:linked_keg_only_keg) { instance_double(Keg, directory?: true) }
9+
let(:linked_keg_only_formula) do
10+
instance_double(Formula, linked?: true, keg_only?: true, any_installed_keg: linked_keg_only_keg)
11+
end
1012
let(:linked_non_keg_only_keg) { instance_double(Keg, directory?: true) }
1113
let(:linked_non_keg_only_formula) do
12-
instance_double(Formula, keg_only?: false, linked?: true, any_installed_keg: linked_non_keg_only_keg)
14+
instance_double(Formula, linked?: true, keg_only?: false,
15+
any_installed_keg: linked_non_keg_only_keg)
16+
end
17+
let(:unlinked_formula) do
18+
instance_double(Formula, linked?: false, keg_only?: true, any_installed_keg: nil)
1319
end
14-
let(:unlinked_formula) { instance_double(Formula, keg_only?: true, linked?: false, any_installed_keg: nil) }
1520

16-
it "unlinks linked sibling formulae returned by link_overwrite_formulae" do
21+
it "only unlinks linked keg-only sibling formulae for non-keg-only formulae" do
1722
allow(formula).to receive(:link_overwrite_formulae)
18-
.and_return([linked_formula, linked_non_keg_only_formula, unlinked_formula])
19-
expect(described_class).to receive(:unlink).with(linked_keg, verbose: true).once
23+
.and_return([linked_keg_only_formula, linked_non_keg_only_formula, unlinked_formula])
24+
expect(described_class).to receive(:unlink).with(linked_keg_only_keg, verbose: true).once
25+
expect(described_class).not_to receive(:unlink).with(linked_non_keg_only_keg, verbose: true)
26+
27+
described_class.unlink_link_overwrite_formulae(formula, verbose: true)
28+
end
29+
30+
it "unlinks all linked sibling formulae for keg-only formulae" do
31+
allow(formula).to receive_messages(keg_only?: true,
32+
link_overwrite_formulae: [linked_keg_only_formula,
33+
linked_non_keg_only_formula,
34+
unlinked_formula])
35+
expect(described_class).to receive(:unlink).with(linked_keg_only_keg, verbose: true).once
2036
expect(described_class).to receive(:unlink).with(linked_non_keg_only_keg, verbose: true).once
2137

2238
described_class.unlink_link_overwrite_formulae(formula, verbose: true)

Library/Homebrew/unlink.rb

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,13 @@ module Homebrew
66
module Unlink
77
sig { params(formula: Formula, verbose: T::Boolean).void }
88
def self.unlink_link_overwrite_formulae(formula, verbose: false)
9-
formula.link_overwrite_formulae
10-
.select(&:linked?)
11-
.filter_map(&:any_installed_keg)
12-
.select(&:directory?)
13-
.each do |keg|
14-
unlink(keg, verbose:)
9+
overwrite_formulae = formula.link_overwrite_formulae.select(&:linked?)
10+
overwrite_formulae.select!(&:keg_only?) unless formula.keg_only?
11+
12+
overwrite_formulae.filter_map(&:any_installed_keg)
13+
.select(&:directory?)
14+
.each do |keg|
15+
unlink(keg, verbose:)
1516
end
1617
end
1718

0 commit comments

Comments
 (0)