Class: Tap
- Extended by:
- Cachable, Enumerable
- Defined in:
- extend/os/mac/tap.rb,
tap.rb
Overview
A Tap is used to extend the formulae provided by Homebrew core.
Usually, it’s synced with a remote Git repository. And it’s likely
a GitHub repository with the name of user/homebrew-repo
. In such
cases, user/repo
will be used as the #name of this Tap, where
#user represents the GitHub username and #repo represents the repository
name without the leading homebrew-
.
Direct Known Subclasses
Constant Summary collapse
- TAP_DIRECTORY =
(HOMEBREW_LIBRARY/"Taps").freeze
- HOMEBREW_TAP_CASK_RENAMES_FILE =
"cask_renames.json"
- HOMEBREW_TAP_FORMULA_RENAMES_FILE =
"formula_renames.json"
- HOMEBREW_TAP_MIGRATIONS_FILE =
"tap_migrations.json"
- HOMEBREW_TAP_AUDIT_EXCEPTIONS_DIR =
"audit_exceptions"
- HOMEBREW_TAP_STYLE_EXCEPTIONS_DIR =
"style_exceptions"
- HOMEBREW_TAP_PYPI_FORMULA_MAPPINGS =
"pypi_formula_mappings.json"
- HOMEBREW_TAP_JSON_FILES =
%W[ #{HOMEBREW_TAP_FORMULA_RENAMES_FILE} #{HOMEBREW_TAP_CASK_RENAMES_FILE} #{HOMEBREW_TAP_MIGRATIONS_FILE} #{HOMEBREW_TAP_AUDIT_EXCEPTIONS_DIR}/*.json #{HOMEBREW_TAP_STYLE_EXCEPTIONS_DIR}/*.json #{HOMEBREW_TAP_PYPI_FORMULA_MAPPINGS} ].freeze
Instance Attribute Summary collapse
-
#full_name ⇒ Object
readonly
The full name of this Tap, including the
homebrew-
prefix. -
#git_repo ⇒ GitRepository
readonly
The git repository of this Tap.
-
#name ⇒ Object
readonly
The name of this Tap.
-
#path ⇒ Pathname
readonly
The local path to this Tap.
-
#repo ⇒ Object
readonly
The repository name of this Tap without the leading
homebrew-
. -
#user ⇒ Object
readonly
The user name of this Tap.
Class Method Summary collapse
- .cask_files_by_name(tap) ⇒ Hash{String => Pathname}
-
.cmd_directories ⇒ Array<Pathname>
An array of all tap cmd directory Pathnames.
-
.default_cask_tap ⇒ T.attached_class
-
.each(&block) ⇒ Object
-
.fetch(*args) ⇒ Object
- .formula_files_by_name(tap) ⇒ Hash{String => Pathname}
-
.from_path(path) ⇒ Object
-
.install_default_cask_tap_if_necessary(force: false) ⇒ Boolean
-
.names ⇒ Array<String>
An array of all installed Tap names.
-
.untapped_official_taps ⇒ Array<String>
An array of official taps that have been manually untapped.
Instance Method Summary collapse
-
#==(other) ⇒ Boolean
-
#audit_exception(list, formula_or_cask, value = nil) ⇒ Object
-
#audit_exceptions ⇒ Hash
Hash with audit exceptions.
- #cask_dir ⇒ Pathname
- #cask_files ⇒ Array<Pathname>
-
#cask_renames ⇒ Hash{String => String}
Hash with tap cask renames.
- #cask_tokens ⇒ Array<String>
-
#clear_cache ⇒ Object
Clear internal cache.
-
#command_dir ⇒ Pathname
-
#command_files ⇒ Array<Pathname>
An array of all commands files of this Tap.
- #config ⇒ Object
-
#contents ⇒ Object
- #custom_remote? ⇒ Boolean
-
#default_remote ⇒ String
The default remote path to this Tap.
-
#fix_remote_configuration(requested_remote: nil, quiet: false) ⇒ Object
- #formula_dir ⇒ Pathname
- #formula_files ⇒ Array<Pathname>
- #formula_names ⇒ Array<String>
-
#formula_renames ⇒ Hash{String => String}
Hash with tap formula renames.
-
#git? ⇒ Boolean
True if this Tap is a Git repository.
-
#git_branch ⇒ Object
git branch for this Tap.
-
#git_head ⇒ Object
git HEAD for this Tap.
-
#git_last_commit ⇒ Object
Time since last git commit for this Tap.
-
#install(quiet: false, clone_target: nil, force_auto_update: nil, custom_remote: false, verify: false) ⇒ Object
Install this Tap.
-
#installed? ⇒ Boolean
True if this Tap has been installed.
-
#issues_url ⇒ String?
The issues URL of this Tap.
-
#link_completions_and_manpages ⇒ Object
-
#official? ⇒ Boolean
True if this Tap is an official Homebrew tap.
-
#potential_formula_dirs ⇒ Array<Pathname>
-
#private? ⇒ Boolean
True if the remote of this Tap is a private repository.
-
#pypi_formula_mappings ⇒ Object
Hash with pypi formula mappings.
-
#remote ⇒ Object
The remote path to this Tap.
-
#remote_repo ⇒ Object
The remote repository name of this Tap.
-
#repo_var ⇒ Object
-
#shallow? ⇒ Boolean
True if this Tap is not a full clone.
-
#style_exceptions ⇒ Hash
Hash with style exceptions.
-
#tap_migrations ⇒ Hash
Hash with tap migrations.
-
#to_hash ⇒ Hash
-
#to_s ⇒ Object
-
#uninstall(manual: false) ⇒ Object
Uninstall this Tap.
- #versioned_formula_files ⇒ Array<Pathname>
Methods included from Cachable
Instance Attribute Details
#git_repo ⇒ GitRepository (readonly)
The git repository of this Tap.
101 102 103 |
# File 'tap.rb', line 101 def git_repo @git_repo end |
#path ⇒ Pathname (readonly)
The local path to this Tap.
e.g. /usr/local/Library/Taps/user/homebrew-repo
97 98 99 |
# File 'tap.rb', line 97 def path @path end |
Class Method Details
.cask_files_by_name(tap) ⇒ Hash{String => Pathname}
550 551 552 553 554 555 556 557 558 559 560 |
# File 'tap.rb', line 550 def self.cask_files_by_name(tap) cache_key = "cask_files_by_name_#{tap}" cache.fetch(cache_key) do |key| cache[key] = tap.cask_files.each_with_object({}) do |file, hash| # If there's more than one file with the same basename: intentionally # ignore the later ones here. hash[file.basename.to_s] ||= file end end end |
.cmd_directories ⇒ Array<Pathname>
An array of all tap cmd directory Pathnames.
775 776 777 |
# File 'tap.rb', line 775 def self.cmd_directories Pathname.glob TAP_DIRECTORY/"*/*/cmd" end |
.default_cask_tap ⇒ T.attached_class
66 67 68 |
# File 'tap.rb', line 66 def self.default_cask_tap @default_cask_tap ||= fetch("Homebrew", "cask") end |
.each(&block) ⇒ Object
755 756 757 758 759 760 761 762 763 764 765 |
# File 'tap.rb', line 755 def self.each(&block) return unless TAP_DIRECTORY.directory? return to_enum unless block TAP_DIRECTORY.subdirs.each do |user| user.subdirs.each do |repo| yield fetch(user.basename.to_s, repo.basename.to_s) end end end |
.fetch(*args) ⇒ Object
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
# File 'tap.rb', line 37 def self.fetch(*args) case args.length when 1 user, repo = args.first.split("/", 2) when 2 user = args.first repo = args.second end raise "Invalid tap name '#{args.join("/")}'" if [user, repo].any? { |part| part.nil? || part.include?("/") } # We special case homebrew and linuxbrew so that users don't have to shift in a terminal. user = user.capitalize if ["homebrew", "linuxbrew"].include? user repo = repo.sub(HOMEBREW_OFFICIAL_REPO_PREFIXES_REGEX, "") return CoreTap.instance if ["Homebrew", "Linuxbrew"].include?(user) && ["core", "homebrew"].include?(repo) cache_key = "#{user}/#{repo}".downcase cache.fetch(cache_key) { |key| cache[key] = Tap.new(user, repo) } end |
.formula_files_by_name(tap) ⇒ Hash{String => Pathname}
514 515 516 517 518 519 520 521 522 523 |
# File 'tap.rb', line 514 def self.formula_files_by_name(tap) cache_key = "formula_files_by_name_#{tap}" cache.fetch(cache_key) do |key| cache[key] = tap.formula_files.each_with_object({}) do |file, hash| # If there's more than one file with the same basename: intentionally # ignore the later ones here. hash[file.basename.to_s] ||= file end end end |
.from_path(path) ⇒ Object
58 59 60 61 62 63 |
# File 'tap.rb', line 58 def self.from_path(path) match = File.(path).match(HOMEBREW_TAP_PATH_REGEX) return if match.blank? || match[:user].blank? || match[:repo].blank? fetch(match[:user], match[:repo]) end |
.install_default_cask_tap_if_necessary(force: false) ⇒ Boolean
5 6 7 8 9 10 11 12 13 |
# File 'extend/os/mac/tap.rb', line 5 def self.install_default_cask_tap_if_necessary(force: false) return false if default_cask_tap.installed? return false unless Homebrew::EnvConfig.no_install_from_api? return false if Homebrew::EnvConfig.automatically_set_no_install_from_api? return false if !force && Tap.untapped_official_taps.include?(default_cask_tap.name) default_cask_tap.install true end |
Instance Method Details
#==(other) ⇒ Boolean
750 751 752 753 |
# File 'tap.rb', line 750 def ==(other) other = Tap.fetch(other) if other.is_a?(String) self.class == other.class && name == other.name end |
#audit_exception(list, formula_or_cask, value = nil) ⇒ Object
797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 |
# File 'tap.rb', line 797 def audit_exception(list, formula_or_cask, value = nil) return false if audit_exceptions.blank? return false unless audit_exceptions.key? list list = audit_exceptions[list] case list when Array list.include? formula_or_cask when Hash return false unless list.include? formula_or_cask return list[formula_or_cask] if value.blank? list[formula_or_cask] == value end end |
#audit_exceptions ⇒ Hash
Hash with audit exceptions
726 727 728 |
# File 'tap.rb', line 726 def audit_exceptions @audit_exceptions = read_formula_list_directory "#{HOMEBREW_TAP_AUDIT_EXCEPTIONS_DIR}/*" end |
#cask_dir ⇒ Pathname
475 476 477 |
# File 'tap.rb', line 475 def cask_dir @cask_dir ||= path/"Casks" end |
#cask_files ⇒ Array<Pathname>
535 536 537 538 539 540 541 542 543 544 545 546 |
# File 'tap.rb', line 535 def cask_files @cask_files ||= if cask_dir.directory? # TODO: odeprecate the non-official/old logic with a new minor release somehow? if official? cask_dir.find else cask_dir.children end.select(&method(:ruby_file?)) else [] end end |
#cask_renames ⇒ Hash{String => String}
Hash with tap cask renames.
694 695 696 697 698 699 700 701 702 |
# File 'tap.rb', line 694 def cask_renames @cask_renames ||= if name == "homebrew/cask" && !Homebrew::EnvConfig.no_install_from_api? Homebrew::API::Cask.all_renames elsif (rename_file = path/HOMEBREW_TAP_CASK_RENAMES_FILE).file? JSON.parse(rename_file.read) else {} end end |
#cask_tokens ⇒ Array<String>
602 603 604 |
# File 'tap.rb', line 602 def cask_tokens @cask_tokens ||= cask_files.map(&method(:formula_file_to_name)) end |
#clear_cache ⇒ Object
Clear internal cache.
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 |
# File 'tap.rb', line 116 def clear_cache @remote = nil @repo_var = nil @formula_dir = nil @cask_dir = nil @command_dir = nil @formula_files = nil @alias_dir = nil @alias_files = nil @aliases = nil @alias_table = nil @alias_reverse_table = nil @command_files = nil @formula_renames = nil @tap_migrations = nil @audit_exceptions = nil @style_exceptions = nil @pypi_formula_mappings = nil @config = nil @spell_checker = nil remove_instance_variable(:@private) if instance_variable_defined?(:@private) end |
#command_dir ⇒ Pathname
653 654 655 |
# File 'tap.rb', line 653 def command_dir @command_dir ||= path/"cmd" end |
#command_files ⇒ Array<Pathname>
An array of all commands files of this Tap.
659 660 661 662 663 664 665 |
# File 'tap.rb', line 659 def command_files @command_files ||= if command_dir.directory? Commands.find_commands(command_dir) else [] end end |
#config ⇒ Object
222 223 224 225 226 227 228 |
# File 'tap.rb', line 222 def config @config ||= begin raise TapUnavailableError, name unless installed? TapConfig.new(self) end end |
#contents ⇒ Object
479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 |
# File 'tap.rb', line 479 def contents contents = [] if (command_count = command_files.count).positive? contents << Utils.pluralize("command", command_count, include_count: true) end if (cask_count = cask_files.count).positive? contents << Utils.pluralize("cask", cask_count, include_count: true) end if (formula_count = formula_files.count).positive? contents << Utils.pluralize("formula", formula_count, plural: "e", include_count: true) end contents end |
#custom_remote? ⇒ Boolean
451 452 453 454 455 |
# File 'tap.rb', line 451 def custom_remote? return true unless remote remote.casecmp(default_remote).nonzero? end |
#default_remote ⇒ String
The default remote path to this Tap.
159 160 161 |
# File 'tap.rb', line 159 def default_remote "https://github.com/#{full_name}" end |
#fix_remote_configuration(requested_remote: nil, quiet: false) ⇒ Object
385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 |
# File 'tap.rb', line 385 def fix_remote_configuration(requested_remote: nil, quiet: false) if requested_remote.present? path.cd do safe_system "git", "remote", "set-url", "origin", requested_remote safe_system "git", "config", "remote.origin.fetch", "+refs/heads/*:refs/remotes/origin/*" end $stderr.ohai "#{name}: changed remote from #{remote} to #{requested_remote}" unless quiet end current_upstream_head = T.must(git_repo.origin_branch_name) return if requested_remote.blank? && git_repo.origin_has_branch?(current_upstream_head) args = %w[fetch] args << "--quiet" if quiet args << "origin" safe_system "git", "-C", path, *args git_repo.set_head_origin_auto new_upstream_head = T.must(git_repo.origin_branch_name) return if new_upstream_head == current_upstream_head git_repo.rename_branch old: current_upstream_head, new: new_upstream_head git_repo.set_upstream_branch local: new_upstream_head, origin: new_upstream_head return if quiet $stderr.ohai "#{name}: changed default branch name from #{current_upstream_head} to #{new_upstream_head}!" end |
#formula_dir ⇒ Pathname
459 460 461 462 463 464 465 466 |
# File 'tap.rb', line 459 def formula_dir # Official formulae taps always use this directory, saves time to hardcode. @formula_dir ||= if official? path/"Formula" else potential_formula_dirs.find(&:directory?) || (path/"Formula") end end |
#formula_files ⇒ Array<Pathname>
499 500 501 502 503 504 505 506 507 508 509 510 |
# File 'tap.rb', line 499 def formula_files @formula_files ||= if formula_dir.directory? # TODO: odeprecate the non-official/old logic with a new minor release somehow? if official? formula_dir.find else formula_dir.children end.select(&method(:formula_file?)) else [] end end |
#formula_names ⇒ Array<String>
596 597 598 |
# File 'tap.rb', line 596 def formula_names @formula_names ||= formula_files.map(&method(:formula_file_to_name)) end |
#formula_renames ⇒ Hash{String => String}
Hash with tap formula renames.
706 707 708 709 710 711 712 |
# File 'tap.rb', line 706 def formula_renames @formula_renames ||= if (rename_file = path/HOMEBREW_TAP_FORMULA_RENAMES_FILE).file? JSON.parse(rename_file.read) else {} end end |
#git? ⇒ Boolean
True if this Tap is a Git repository.
171 172 173 |
# File 'tap.rb', line 171 def git? git_repo.git_repo? end |
#git_branch ⇒ Object
git branch for this Tap.
176 177 178 179 180 |
# File 'tap.rb', line 176 def git_branch raise TapUnavailableError, name unless installed? git_repo.branch_name end |
#git_head ⇒ Object
git HEAD for this Tap.
183 184 185 186 187 |
# File 'tap.rb', line 183 def git_head raise TapUnavailableError, name unless installed? @git_head ||= git_repo.head_ref end |
#git_last_commit ⇒ Object
Time since last git commit for this Tap.
190 191 192 193 194 |
# File 'tap.rb', line 190 def git_last_commit raise TapUnavailableError, name unless installed? git_repo.last_committed end |
#install(quiet: false, clone_target: nil, force_auto_update: nil, custom_remote: false, verify: false) ⇒ Object
Install this Tap.
254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 |
# File 'tap.rb', line 254 def install(quiet: false, clone_target: nil, force_auto_update: nil, custom_remote: false, verify: false) require "descriptions" require "readall" if official? && DEPRECATED_OFFICIAL_TAPS.include?(repo) odie "#{name} was deprecated. This tap is now empty and all its contents were either deleted or migrated." elsif user == "caskroom" || name == "phinze/cask" new_repo = (repo == "cask") ? "cask" : "cask-#{repo}" odie "#{name} was moved. Tap homebrew/#{new_repo} instead." end raise TapNoCustomRemoteError, name if custom_remote && clone_target.nil? requested_remote = clone_target || default_remote if installed? && !custom_remote raise TapRemoteMismatchError.new(name, @remote, requested_remote) if clone_target && requested_remote != remote raise TapAlreadyTappedError, name if force_auto_update.nil? && !shallow? end # ensure git is installed Utils::Git.ensure_installed! if installed? if requested_remote != remote # we are sure that clone_target is not nil and custom_remote is true here fix_remote_configuration(requested_remote: requested_remote, quiet: quiet) end unless force_auto_update.nil? if force_auto_update config["forceautoupdate"] = force_auto_update elsif config["forceautoupdate"] == "true" config.delete("forceautoupdate") end return end $stderr.ohai "Unshallowing #{name}" if shallow? && !quiet args = %w[fetch] # Git throws an error when attempting to unshallow a full clone args << "--unshallow" if shallow? args << "-q" if quiet path.cd { safe_system "git", *args } return end clear_cache $stderr.ohai "Tapping #{name}" unless quiet args = %W[clone #{requested_remote} #{path}] # Override possible user configs like: # git config --global clone.defaultRemoteName notorigin args << "--origin=origin" args << "-q" if quiet # Override user-set default template args << "--template=" begin safe_system "git", *args if verify && !Readall.valid_tap?(self, aliases: true) && !Homebrew::EnvConfig.developer? raise "Cannot tap #{name}: invalid syntax in tap!" end rescue Interrupt, RuntimeError ignore_interrupts do # wait for git to possibly cleanup the top directory when interrupt happens. sleep 0.1 FileUtils.rm_rf path path.parent.rmdir_if_possible end raise end config["forceautoupdate"] = force_auto_update unless force_auto_update.nil? Commands.rebuild_commands_completion_list link_completions_and_manpages formatted_contents = contents.presence&.to_sentence&.dup&.prepend(" ") $stderr.puts "Tapped#{formatted_contents} (#{path.abv})." unless quiet CacheStoreDatabase.use(:descriptions) do |db| DescriptionCacheStore.new(db) .update_from_formula_names!(formula_names) end CacheStoreDatabase.use(:cask_descriptions) do |db| CaskDescriptionCacheStore.new(db) .update_from_cask_tokens!(cask_tokens) end if official? untapped = self.class.untapped_official_taps untapped -= [name] if untapped.empty? Homebrew::Settings.delete :untapped else Homebrew::Settings.write :untapped, untapped.join(";") end end return if clone_target return unless private? return if quiet path.cd do return if Utils.popen_read("git", "config", "--get", "credential.helper").present? end $stderr.puts <<~EOS It looks like you tapped a private repository. To avoid entering your credentials each time you update, you can use git HTTP credential caching or issue the following command: cd #{path} git remote set-url origin git@github.com:#{full_name}.git EOS end |
#installed? ⇒ Boolean
True if this Tap has been installed.
231 232 233 |
# File 'tap.rb', line 231 def installed? path.directory? end |
#issues_url ⇒ String?
The issues URL of this Tap.
e.g. https://github.com/user/homebrew-repo/issues
199 200 201 202 203 |
# File 'tap.rb', line 199 def issues_url return if !official? && custom_remote? "#{default_remote}/issues" end |
#link_completions_and_manpages ⇒ Object
373 374 375 376 377 378 379 380 381 382 383 |
# File 'tap.rb', line 373 def link_completions_and_manpages command = "brew tap --repair" Utils::Link.link_manpages(path, command) Homebrew::Completions. if official? || Homebrew::Completions.link_completions? Utils::Link.link_completions(path, command) else Utils::Link.unlink_completions(path) end end |
#official? ⇒ Boolean
True if this Tap is an official Homebrew tap.
210 211 212 |
# File 'tap.rb', line 210 def official? user == "Homebrew" end |
#potential_formula_dirs ⇒ Array<Pathname>
469 470 471 |
# File 'tap.rb', line 469 def potential_formula_dirs @potential_formula_dirs ||= [path/"Formula", path/"HomebrewFormula", path].freeze end |
#private? ⇒ Boolean
True if the remote of this Tap is a private repository.
215 216 217 218 219 |
# File 'tap.rb', line 215 def private? return @private if instance_variable_defined?(:@private) @private = read_or_set_private_config end |
#pypi_formula_mappings ⇒ Object
Hash with pypi formula mappings
737 738 739 |
# File 'tap.rb', line 737 def pypi_formula_mappings @pypi_formula_mappings = read_formula_list path/HOMEBREW_TAP_PYPI_FORMULA_MAPPINGS end |
#remote ⇒ Object
The remote path to this Tap.
e.g. https://github.com/user/homebrew-repo
141 142 143 144 145 |
# File 'tap.rb', line 141 def remote return default_remote unless installed? @remote ||= git_repo.origin_url end |
#remote_repo ⇒ Object
The remote repository name of this Tap.
e.g. user/homebrew-repo
149 150 151 152 153 154 155 |
# File 'tap.rb', line 149 def remote_repo return unless remote @remote_repo ||= remote.delete_prefix("https://github.com/") .delete_prefix("git@github.com:") .delete_suffix(".git") end |
#repo_var ⇒ Object
163 164 165 166 167 168 |
# File 'tap.rb', line 163 def repo_var @repo_var ||= path.to_s .delete_prefix(TAP_DIRECTORY.to_s) .tr("^A-Za-z0-9", "_") .upcase end |
#shallow? ⇒ Boolean
True if this Tap is not a full clone.
236 237 238 |
# File 'tap.rb', line 236 def shallow? (path/".git/shallow").exist? end |
#style_exceptions ⇒ Hash
Hash with style exceptions
732 733 734 |
# File 'tap.rb', line 732 def style_exceptions @style_exceptions = read_formula_list_directory "#{HOMEBREW_TAP_STYLE_EXCEPTIONS_DIR}/*" end |
#tap_migrations ⇒ Hash
Hash with tap migrations.
716 717 718 719 720 721 722 |
# File 'tap.rb', line 716 def tap_migrations @tap_migrations ||= if (migration_file = path/HOMEBREW_TAP_MIGRATIONS_FILE).file? JSON.parse(migration_file.read) else {} end end |
#to_hash ⇒ Hash
668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 |
# File 'tap.rb', line 668 def to_hash hash = { "name" => name, "user" => user, "repo" => repo, "path" => path.to_s, "installed" => installed?, "official" => official?, "formula_names" => formula_names, "formula_files" => formula_files.map(&:to_s), "cask_tokens" => cask_tokens, "cask_files" => cask_files.map(&:to_s), "command_files" => command_files.map(&:to_s), } if installed? hash["remote"] = remote hash["custom_remote"] = custom_remote? hash["private"] = private? end hash end |
#to_s ⇒ Object
205 206 207 |
# File 'tap.rb', line 205 def to_s name end |
#uninstall(manual: false) ⇒ Object
Uninstall this Tap.
415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 |
# File 'tap.rb', line 415 def uninstall(manual: false) require "descriptions" raise TapUnavailableError, name unless installed? $stderr.puts "Untapping #{name}..." abv = path.abv formatted_contents = contents.presence&.to_sentence&.dup&.prepend(" ") CacheStoreDatabase.use(:descriptions) do |db| DescriptionCacheStore.new(db) .delete_from_formula_names!(formula_names) end CacheStoreDatabase.use(:cask_descriptions) do |db| CaskDescriptionCacheStore.new(db) .delete_from_cask_tokens!(cask_tokens) end Utils::Link.unlink_manpages(path) Utils::Link.unlink_completions(path) path.rmtree path.parent.rmdir_if_possible $stderr.puts "Untapped#{formatted_contents} (#{abv})." Commands.rebuild_commands_completion_list clear_cache return if !manual || !official? untapped = self.class.untapped_official_taps return if untapped.include? name untapped << name Homebrew::Settings.write :untapped, untapped.join(";") end |