Skip to content

Commit 3aae2a3

Browse files
authored
Merge pull request #21966 from Homebrew/share-full-name-utils
Share full-name parsing helpers
2 parents d476a82 + 3148d27 commit 3aae2a3

24 files changed

Lines changed: 160 additions & 89 deletions

Library/Homebrew/bundle/brew.rb

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
require "json"
55
require "tsort"
6+
require "utils"
67
require "utils/output"
78
require "bundle/package_type"
89

@@ -80,16 +81,16 @@ def no_upgrade_with_args?(no_upgrade, formula_name)
8081
sig { params(formula: String, array: T::Array[String]).returns(T::Boolean) }
8182
def formula_in_array?(formula, array)
8283
return true if array.include?(formula)
83-
return true if array.include?(formula.split("/").fetch(-1))
84+
return true if array.include?(Utils.name_from_full_name(formula))
8485

8586
old_name = formula_oldnames[formula]
86-
old_name ||= formula_oldnames[formula.split("/").fetch(-1)]
87+
old_name ||= formula_oldnames[Utils.name_from_full_name(formula)]
8788
return true if old_name && array.include?(old_name)
8889

8990
resolved_full_name = formula_aliases[formula]
9091
return false unless resolved_full_name
9192
return true if array.include?(resolved_full_name)
92-
return true if array.include?(resolved_full_name.split("/").last)
93+
return true if array.include?(Utils.name_from_full_name(resolved_full_name))
9394

9495
false
9596
end
@@ -201,9 +202,8 @@ def dump_output(describe: false, no_restart: false)
201202
def fetchable_name(name, options = {}, no_upgrade: false)
202203
_ = options
203204

204-
user, repository, = name.split("/", 3)
205-
return if user.present? && repository.present? &&
206-
Homebrew::Bundle::Tap.installed_taps.exclude?("#{user}/#{repository}")
205+
return if (tap_name = Utils.tap_from_full_name(name)) &&
206+
Homebrew::Bundle::Tap.installed_taps.exclude?(tap_name)
207207
return if formula_installed_and_up_to_date?(name, no_upgrade:)
208208

209209
name
@@ -220,8 +220,7 @@ def formula_aliases
220220

221221
aliases.each do |a|
222222
@formula_aliases[a] = f[:full_name]
223-
if f[:full_name].include? "/" # tap formula
224-
tap_name = f[:full_name].rpartition("/").first
223+
if (tap_name = Utils.tap_from_full_name(f[:full_name]))
225224
@formula_aliases["#{tap_name}/#{a}"] = f[:full_name]
226225
end
227226
end
@@ -240,8 +239,7 @@ def formula_oldnames
240239

241240
oldnames.each do |oldname|
242241
@formula_oldnames[oldname] = f[:full_name]
243-
if f[:full_name].include? "/" # tap formula
244-
tap_name = f[:full_name].rpartition("/").first
242+
if (tap_name = Utils.tap_from_full_name(f[:full_name]))
245243
@formula_oldnames["#{tap_name}/#{oldname}"] = f[:full_name]
246244
end
247245
end
@@ -380,7 +378,7 @@ def sort!(formulae)
380378
def initialize(name = "", options = {})
381379
super()
382380
@full_name = name
383-
@name = T.let(name.split("/").last || name, String)
381+
@name = T.let(Utils.name_from_full_name(name), String)
384382
@args = T.let(options.fetch(:args, []).map { |arg| "--#{arg}" }, T::Array[String])
385383
@conflicts_with_arg = T.let(options.fetch(:conflicts_with, []), T::Array[String])
386384
@restart_service = T.let(options[:restart_service], T.nilable(T.any(Symbol, T::Boolean)))

Library/Homebrew/bundle/brew_services.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ def installed_and_up_to_date?(formula, no_upgrade: false)
124124

125125
# `brew services list` returns base names, so fall back to the last
126126
# path component for tap-qualified entries (e.g., "user/tap/formula").
127-
base_name = name.split("/").fetch(-1)
127+
base_name = Utils.name_from_full_name(name)
128128
return true if base_name != name && self.class.started?(base_name)
129129

130130
old_name = lookup_old_name(name)
@@ -147,7 +147,7 @@ def formula_needs_to_start?(formula)
147147
def lookup_old_name(service_name)
148148
@old_names ||= T.let(Homebrew::Bundle::Brew.formula_oldnames, T.nilable(T::Hash[String, String]))
149149
old_name = @old_names[service_name]
150-
old_name ||= @old_names[service_name.split("/").fetch(-1)]
150+
old_name ||= @old_names[Utils.name_from_full_name(service_name)]
151151
old_name
152152
end
153153

Library/Homebrew/bundle/cask.rb

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# typed: strict
22
# frozen_string_literal: true
33

4+
require "utils"
45
require "utils/output"
56
require "bundle/package_type"
67

@@ -143,9 +144,8 @@ def installable_or_upgradable?(name, no_upgrade: false, **options)
143144
sig { params(name: String, options: Homebrew::Bundle::EntryOptions, no_upgrade: T::Boolean).returns(T.nilable(String)) }
144145
def fetchable_name(name, options = {}, no_upgrade: false)
145146
full_name = T.cast(options.fetch(:full_name, name), String)
146-
user, repository, = full_name.split("/", 3)
147-
return if user.present? && repository.present? &&
148-
Homebrew::Bundle::Tap.installed_taps.exclude?("#{user}/#{repository}")
147+
return if (tap_name = Utils.tap_from_full_name(full_name)) &&
148+
Homebrew::Bundle::Tap.installed_taps.exclude?(tap_name)
149149
return unless installable_or_upgradable?(name, no_upgrade:, **options)
150150

151151
full_name
@@ -163,15 +163,15 @@ def cask_installed_and_up_to_date?(cask, no_upgrade: false)
163163
def cask_in_array?(cask, array)
164164
return true if array.include?(cask)
165165

166-
array.include?(cask.split("/").last)
166+
array.include?(Utils.name_from_full_name(cask))
167167
end
168168

169169
sig { params(cask: String).returns(T::Boolean) }
170170
def cask_installed?(cask)
171171
return true if cask_in_array?(cask, installed_casks)
172172

173173
old_name = cask_oldnames[cask]
174-
old_name ||= cask_oldnames[cask.split("/").fetch(-1)]
174+
old_name ||= cask_oldnames[Utils.name_from_full_name(cask)]
175175
return false unless old_name
176176
return false unless cask_in_array?(old_name, installed_casks)
177177

@@ -242,8 +242,7 @@ def cask_oldnames
242242

243243
oldnames.each do |oldname|
244244
hash[oldname] = c.full_name
245-
if c.full_name.include? "/" # tap cask
246-
tap_name = c.full_name.rpartition("/").first
245+
if (tap_name = Utils.tap_from_full_name(c.full_name))
247246
hash["#{tap_name}/#{oldname}"] = c.full_name
248247
end
249248
end

Library/Homebrew/bundle/dsl.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# frozen_string_literal: true
33

44
require "bundle/package_type"
5+
require "utils"
56

67
module Homebrew
78
module Bundle
@@ -125,8 +126,7 @@ def self.sanitize_tap_name(name)
125126

126127
sig { params(name: String).returns(String) }
127128
def self.sanitize_cask_name(name)
128-
name = name.split("/").fetch(-1) if name.include?("/")
129-
name.downcase
129+
Utils.name_from_full_name(name).downcase
130130
end
131131

132132
sig {

Library/Homebrew/cli/named_args.rb

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# frozen_string_literal: true
33

44
require "cli/args"
5+
require "utils"
56
require "utils/output"
67

78
module Homebrew
@@ -447,10 +448,10 @@ def load_formula_or_cask(name, only: nil, method: nil, warn: false)
447448

448449
raise unreadable_error if unreadable_error
449450

450-
user, repo, short_name = name.downcase.split("/", 3)
451-
if repo.present? && short_name.present?
452-
tap = Tap.fetch(T.must(user), repo)
453-
raise TapFormulaOrCaskUnavailableError.new(tap, short_name)
451+
downcased_name = name.downcase
452+
if (tap_name = Utils.tap_from_full_name(downcased_name))
453+
raise TapFormulaOrCaskUnavailableError.new(Tap.fetch(tap_name),
454+
Utils.name_from_full_name(downcased_name))
454455
end
455456

456457
raise NoSuchKegError, name if resolve_formula(name)

Library/Homebrew/cmd/leaves.rb

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ def run
3434
full_name = dep["full_name"]
3535
next unless full_name
3636

37-
base_name(full_name)
37+
Utils.name_from_full_name(full_name)
3838
end
3939
else
4040
# Fallback for installations without tab runtime_dependencies.
@@ -43,7 +43,9 @@ def run
4343
end
4444

4545
# Add direct cask formula dependency names; their transitive deps are already in dep_names.
46-
cask_dep_names = Cask::Caskroom.casks.flat_map { |cask| CaskDependent.new(cask).deps.map { |dep| base_name(dep.name) } }
46+
cask_dep_names = Cask::Caskroom.casks.flat_map do |cask|
47+
CaskDependent.new(cask).deps.map { |dep| Utils.name_from_full_name(dep.name) }
48+
end
4749

4850
dep_names = T.let((formula_dep_names + cask_dep_names).to_set, T::Set[String])
4951

@@ -58,11 +60,6 @@ def run
5860

5961
private
6062

61-
sig { params(full_name: String).returns(String) }
62-
def base_name(full_name)
63-
full_name.include?("/") ? full_name.rpartition("/").last : full_name
64-
end
65-
6663
sig { params(formula: Formula).returns(T::Boolean) }
6764
def installed_on_request?(formula)
6865
formula.any_installed_keg&.tab&.installed_on_request == true

Library/Homebrew/cmd/untap.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# frozen_string_literal: true
33

44
require "abstract_command"
5+
require "utils"
56

67
module Homebrew
78
module Cmd
@@ -49,7 +50,7 @@ def run
4950
sig { params(tap: Tap).returns(T::Array[Formula]) }
5051
def installed_formulae_for(tap:)
5152
tap.formula_names.filter_map do |formula_name|
52-
next unless installed_formulae_names.include?(formula_name.split("/").fetch(-1))
53+
next unless installed_formulae_names.include?(Utils.name_from_full_name(formula_name))
5354

5455
formula = begin
5556
Formulary.factory(formula_name)
@@ -68,7 +69,7 @@ def installed_formulae_for(tap:)
6869
sig { params(tap: Tap).returns(T::Array[Cask::Cask]) }
6970
def installed_casks_for(tap:)
7071
tap.cask_tokens.filter_map do |cask_token|
71-
next unless installed_cask_tokens.include?(cask_token.split("/").fetch(-1))
72+
next unless installed_cask_tokens.include?(Utils.name_from_full_name(cask_token))
7273

7374
cask = begin
7475
Cask::CaskLoader.load(cask_token)

Library/Homebrew/cmd/update-report.rb

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,7 @@ def report(auto_update: false)
467467
case status
468468
when "A", "D"
469469
full_name = tap.formula_file_to_name(src)
470-
name = full_name.split("/").fetch(-1)
470+
name = Utils.name_from_full_name(full_name)
471471
new_tap = tap.tap_migrations[name]
472472
if new_tap.blank?
473473
@report[T.must(status).to_sym] << full_name
@@ -492,7 +492,7 @@ def report(auto_update: false)
492492

493493
renamed_casks = Set.new
494494
@report[:DC].each do |old_full_name|
495-
old_name = old_full_name.split("/").last
495+
old_name = Utils.name_from_full_name(old_full_name)
496496
new_name = tap.cask_renames[old_name]
497497
next unless new_name
498498

@@ -506,7 +506,7 @@ def report(auto_update: false)
506506
end
507507

508508
@report[:AC].each do |new_full_name|
509-
new_name = new_full_name.split("/").last
509+
new_name = Utils.name_from_full_name(new_full_name)
510510
old_name = tap.cask_renames.key(new_name)
511511
next unless old_name
512512

@@ -527,7 +527,7 @@ def report(auto_update: false)
527527

528528
renamed_formulae = Set.new
529529
@report[:D].each do |old_full_name|
530-
old_name = old_full_name.split("/").last
530+
old_name = Utils.name_from_full_name(old_full_name)
531531
new_name = tap.formula_renames[old_name]
532532
next unless new_name
533533

@@ -541,7 +541,7 @@ def report(auto_update: false)
541541
end
542542

543543
@report[:A].each do |new_full_name|
544-
new_name = new_full_name.split("/").last
544+
new_name = Utils.name_from_full_name(new_full_name)
545545
old_name = tap.formula_renames.key(new_name)
546546
next unless old_name
547547

@@ -586,22 +586,23 @@ def updated?
586586
sig { void }
587587
def migrate_tap_migration
588588
[report[:D], report[:DC], report[:T]].flatten.each do |full_name|
589-
name = full_name.split("/").fetch(-1)
590-
new_tap_name = tap.tap_migrations[name]
591-
next if new_tap_name.nil? # skip if not in tap_migrations list.
592-
593-
new_tap_user, new_tap_repo, new_tap_new_name = new_tap_name.split("/")
594-
new_name = if new_tap_new_name
595-
new_full_name = new_tap_new_name
596-
new_tap_name = "#{new_tap_user}/#{new_tap_repo}"
597-
new_tap_new_name
598-
elsif new_tap_repo
589+
name = Utils.name_from_full_name(full_name)
590+
migration_target = tap.tap_migrations[name]
591+
next if migration_target.nil? # skip if not in tap_migrations list.
592+
593+
migrated_tap_name = Utils.tap_from_full_name(migration_target)
594+
new_name = if migrated_tap_name
595+
new_full_name = Utils.name_from_full_name(migration_target)
596+
new_tap_name = migrated_tap_name
597+
new_full_name
598+
elsif migration_target.include?("/")
599+
new_tap_name = migration_target
599600
new_full_name = "#{new_tap_name}/#{name}"
600601
name
601602
else
602603
new_tap_name = tap.name
603-
new_full_name = "#{new_tap_name}/#{new_tap_user}"
604-
new_tap_user
604+
new_full_name = "#{new_tap_name}/#{migration_target}"
605+
migration_target
605606
end
606607

607608
# This means it is a cask
@@ -614,7 +615,7 @@ def migrate_tap_migration
614615
To uninstall the cask, run:
615616
brew uninstall --cask --force #{name}
616617
EOS
617-
next if (HOMEBREW_CELLAR/new_name.split("/").last).directory?
618+
next if (HOMEBREW_CELLAR/Utils.name_from_full_name(new_name)).directory?
618619

619620
ohai "Installing #{new_name}..."
620621
begin
@@ -894,7 +895,7 @@ def dump_new_cask_report
894895
true
895896
end
896897
casks.each do |cask|
897-
cask_token = cask.split("/").fetch(-1)
898+
cask_token = Utils.name_from_full_name(cask)
898899
if should_display_descriptions && (desc = cask_description(cask))
899900
puts "#{cask_token}: #{desc}"
900901
else
@@ -917,7 +918,7 @@ def dump_deleted_cask_report
917918
return if Homebrew::SimulateSystem.simulating_or_running_on_linux?
918919

919920
casks = select_formula_or_cask(:DC).sort.filter_map do |name|
920-
name = name.split("/").fetch(-1)
921+
name = Utils.name_from_full_name(name)
921922
pretty_uninstalled(name) if cask_installed?(name)
922923
end
923924

@@ -933,7 +934,7 @@ def output_dump_formula_or_cask_report(title, formulae_or_casks)
933934

934935
sig { params(formula: String).returns(T::Boolean) }
935936
def installed?(formula)
936-
(HOMEBREW_CELLAR/formula.split("/").last).directory?
937+
(HOMEBREW_CELLAR/Utils.name_from_full_name(formula)).directory?
937938
end
938939

939940
sig { params(cask: String).returns(T::Boolean) }

Library/Homebrew/dependency.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# frozen_string_literal: true
33

44
require "dependable"
5+
require "utils"
56

67
# A dependency on another Homebrew formula.
78
#
@@ -119,7 +120,7 @@ def missing_options
119120
end
120121

121122
def option_names
122-
[name.split("/").last].freeze
123+
[Utils.name_from_full_name(name)].freeze
123124
end
124125

125126
sig { overridable.returns(T::Boolean) }

Library/Homebrew/descriptions.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ def installed_casks
158158
sig { returns(T::Hash[String, String]) }
159159
def short_names
160160
@short_names ||= T.let(
161-
@descriptions.keys.to_h { |k| [k, k.split("/").fetch(-1)] },
161+
@descriptions.keys.to_h { |k| [k, Utils.name_from_full_name(k)] },
162162
T.nilable(T::Hash[String, String]),
163163
)
164164
end

0 commit comments

Comments
 (0)