Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add brew link --HEAD #11397

Merged
merged 31 commits into from May 26, 2021
Merged
Show file tree
Hide file tree
Changes from 14 commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
8de9baa
Add `brew link --HEAD`
May 17, 2021
212b648
Update usage message
May 17, 2021
f92300f
Update Library/Homebrew/cmd/link.rb
cnnrmnn May 18, 2021
d46881c
Rename `to_kegs` to `to_keg`
May 18, 2021
d754c0f
Update tests for `to_keg`
May 18, 2021
15dcc6f
Add `to_kegs`
May 18, 2021
f23d4d4
Switch to using `to_keg` and `to_kegs`
May 18, 2021
fe9a9bb
Rename `to_keg` to `to_default_kegs`
May 19, 2021
137914d
Rename `method` `:keg` to `:default_kegs`
May 19, 2021
49aa057
Rename `resolve_keg` to `resolve_default_keg`
May 19, 2021
2bfdbc6
Rename missed `to_keg`
May 19, 2021
3637924
Fix style
May 19, 2021
08bbb95
Add `to_kegs` test
May 19, 2021
26a3218
Deprecate `method: :keg`
May 20, 2021
b1ce7ef
Update Library/Homebrew/cli/named_args.rb
cnnrmnn May 20, 2021
2938b27
Update `to_default_kegs` tests
May 20, 2021
cad6654
Update `to_kegs` tests
May 20, 2021
0938500
Update Library/Homebrew/test/cli/named_args_spec.rb
cnnrmnn May 20, 2021
fa9a525
Add `to_latest_kegs`
May 20, 2021
b72f5ef
Change `brew link` to use `to_latest_kegs`
May 20, 2021
6f005ca
Rename memoized variable
May 20, 2021
e977f35
Warn if no `HEAD` keg installed w/ `--HEAD`
May 21, 2021
074face
Start catching all nil kegs
May 21, 2021
c18c931
Fix tests
May 21, 2021
3b02439
Update Library/Homebrew/cli/named_args.rb
cnnrmnn May 21, 2021
73ef297
Update Library/Homebrew/cli/named_args.rb
cnnrmnn May 21, 2021
b81a522
Add tests for `to_latest_kegs`
May 23, 2021
0a16142
Fix style
May 24, 2021
d50b323
Fix `to_kegs` test
May 24, 2021
ef4c401
Change `kegs` map to array
May 24, 2021
074b2d6
Clean up and fix typecheck issue
May 25, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
23 changes: 18 additions & 5 deletions Library/Homebrew/cli/named_args.rb
Expand Up @@ -98,8 +98,9 @@ def load_formula_or_cask(name, only: nil, method: nil)
Formulary.factory(name, *spec, force_bottle: @force_bottle, flags: @flags)
when :resolve
resolve_formula(name)
when :keg
resolve_keg(name)
# odeprecated "`method: :keg`"
when :keg, :default_kegs
cnnrmnn marked this conversation as resolved.
Show resolved Hide resolved
resolve_default_keg(name)
when :kegs
_, kegs = resolve_kegs(name)
kegs
Expand Down Expand Up @@ -208,10 +209,22 @@ def to_paths(only: parent&.only_formula_or_cask, recurse_tap: false)
end.uniq.freeze
end

sig { returns(T::Array[Keg]) }
def to_default_kegs
@to_default_kegs ||= begin
to_formulae_and_casks(only: :formula, method: :default_kegs).freeze
rescue NoSuchKegError => e
if (reason = MissingFormula.suggest_command(e.name, "uninstall"))
$stderr.puts reason
end
raise e
end
end

sig { returns(T::Array[Keg]) }
def to_kegs
@to_kegs ||= begin
to_formulae_and_casks(only: :formula, method: :keg).freeze
to_formulae_and_casks(only: :formula, method: :kegs).freeze
rescue NoSuchKegError => e
if (reason = MissingFormula.suggest_command(e.name, "uninstall"))
$stderr.puts reason
Expand All @@ -225,7 +238,7 @@ def to_kegs
.returns([T::Array[Keg], T::Array[Cask::Cask]])
}
def to_kegs_to_casks(only: parent&.only_formula_or_cask, ignore_unavailable: nil, all_kegs: nil)
method = all_kegs ? :kegs : :keg
method = all_kegs ? :kegs : :default_kegs
@to_kegs_to_casks ||= {}
@to_kegs_to_casks[method] ||=
to_formulae_and_casks(only: only, ignore_unavailable: ignore_unavailable, method: method)
Expand Down Expand Up @@ -282,7 +295,7 @@ def resolve_kegs(name)
[rack, kegs]
end

def resolve_keg(name)
def resolve_default_keg(name)
rack, kegs = resolve_kegs(name)

linked_keg_ref = HOMEBREW_LINKED_KEGS/rack.basename
Expand Down
16 changes: 10 additions & 6 deletions Library/Homebrew/cmd/link.rb
Expand Up @@ -26,6 +26,8 @@ def link_args
"`brew link --overwrite` without actually linking or deleting any files."
switch "-f", "--force",
description: "Allow keg-only formulae to be linked."
switch "--HEAD",
description: "Link the HEAD version of the formula if it is installed."

named_args :installed_formula, min: 1
end
Expand All @@ -40,16 +42,18 @@ def link
verbose: args.verbose?,
}

args.named.to_kegs.each do |keg|
kegs = if args.HEAD?
args.named.to_kegs.filter { |keg| keg.version.head? }
else
args.named.to_default_kegs
end

kegs.freeze.each do |keg|
keg_only = Formulary.keg_only?(keg.rack)

if keg.linked?
opoo "Already linked: #{keg}"
name_and_flag = if keg_only
"--force #{keg.name}"
else
keg.name
end
name_and_flag = "#{"--HEAD " if args.HEAD?}#{"--force " if keg_only}#{keg.name}"
puts <<~EOS
To relink:
brew unlink #{keg.name} && brew link #{name_and_flag}
Expand Down
5 changes: 3 additions & 2 deletions Library/Homebrew/cmd/list.rb
Expand Up @@ -129,9 +129,10 @@ def list
safe_system "ls", *ls_args, Cask::Caskroom.path
end
elsif args.verbose? || !$stdout.tty?
system_command! "find", args: args.named.to_kegs.map(&:to_s) + %w[-not -type d -print], print_stdout: true
system_command! "find", args: args.named.to_default_kegs.map(&:to_s) + %w[-not -type d -print],
print_stdout: true
else
args.named.to_kegs.each { |keg| PrettyListing.new keg }
args.named.to_default_kegs.each { |keg| PrettyListing.new keg }
end
end

Expand Down
2 changes: 1 addition & 1 deletion Library/Homebrew/cmd/unlink.rb
Expand Up @@ -31,7 +31,7 @@ def unlink

options = { dry_run: args.dry_run?, verbose: args.verbose? }

args.named.to_kegs.each do |keg|
args.named.to_default_kegs.each do |keg|
cnnrmnn marked this conversation as resolved.
Show resolved Hide resolved
if args.dry_run?
puts "Would remove:"
keg.unlink(**options)
Expand Down
4 changes: 2 additions & 2 deletions Library/Homebrew/dev-cmd/linkage.rb
Expand Up @@ -35,10 +35,10 @@ def linkage
args = linkage_args.parse

CacheStoreDatabase.use(:linkage) do |db|
kegs = if args.named.to_kegs.empty?
kegs = if args.named.to_default_kegs.empty?
Formula.installed.map(&:any_installed_keg).reject(&:nil?)
else
args.named.to_kegs
args.named.to_default_kegs
end
kegs.each do |keg|
ohai "Checking #{keg.name} linkage" if kegs.size > 1
Expand Down
22 changes: 21 additions & 1 deletion Library/Homebrew/test/cli/named_args_spec.rb
Expand Up @@ -179,18 +179,38 @@ def setup_unredable_cask(name)
describe "#to_kegs" do
before do
(HOMEBREW_CELLAR/"foo/1.0").mkpath
(HOMEBREW_CELLAR/"foo/2.0").mkpath
(HOMEBREW_CELLAR/"bar/1.0").mkpath
end

it "resolves kegs with #resolve_kegs" do
expect(described_class.new("foo", "bar").to_kegs.map(&:name)).to eq ["foo", "bar"]
expect(described_class.new("foo", "bar").to_kegs.map(&:name)).to eq ["foo", "foo", "bar"]
end

it "resolves kegs with multiple versions with #resolve_keg" do
cnnrmnn marked this conversation as resolved.
Show resolved Hide resolved
expect(described_class.new("foo").to_kegs.map(&->(k) { k.version.version })).to eq ["1.0", "2.0"]
cnnrmnn marked this conversation as resolved.
Show resolved Hide resolved
end

it "when there are no matching kegs returns an array of Kegs" do
expect(described_class.new.to_kegs).to be_empty
end
end

describe "#to_default_kegs" do
cnnrmnn marked this conversation as resolved.
Show resolved Hide resolved
Rylan12 marked this conversation as resolved.
Show resolved Hide resolved
before do
(HOMEBREW_CELLAR/"foo/1.0").mkpath
(HOMEBREW_CELLAR/"bar/1.0").mkpath
end

it "resolves kegs with #resolve_default_keg" do
expect(described_class.new("foo", "bar").to_default_kegs.map(&:name)).to eq ["foo", "bar"]
end

it "when there are no matching kegs returns an array of Kegs" do
cnnrmnn marked this conversation as resolved.
Show resolved Hide resolved
expect(described_class.new.to_default_kegs).to be_empty
end
end

describe "#to_kegs_to_casks" do
before do
(HOMEBREW_CELLAR/"foo/1.0").mkpath
Expand Down