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"
- TAP_MIGRATIONS_STALE_SECONDS =
1 day
86400
- 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 ⇒ CoreCaskTap
-
.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.
-
#ensure_installed! ⇒ void
-
#fix_remote_configuration(requested_remote: nil, quiet: false) ⇒ Object
- #formula_dir ⇒ Pathname
- #formula_files ⇒ Array<Pathname>
- #formula_names ⇒ Array<String>
-
#formula_oldnames ⇒ Hash{String => Array<String>}
Hash with tap formula old names.
-
#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, force: 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
-
#new_cask_path(token) ⇒ Pathname
-
#new_formula_path(name) ⇒ Pathname
-
#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.
-
#relative_cask_path(token) ⇒ String
-
#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.
Methods included from Cachable
Instance Attribute Details
#git_repo ⇒ GitRepository (readonly)
The git repository of this Tap.
108 109 110 |
# File 'tap.rb', line 108 def git_repo @git_repo end |
#path ⇒ Pathname (readonly)
The local path to this Tap.
e.g. /usr/local/Library/Taps/user/homebrew-repo
104 105 106 |
# File 'tap.rb', line 104 def path @path end |
Class Method Details
.cask_files_by_name(tap) ⇒ Hash{String => Pathname}
591 592 593 594 595 596 |
# File 'tap.rb', line 591 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_by_name end end |
.cmd_directories ⇒ Array<Pathname>
An array of all tap cmd directory Pathnames.
838 839 840 |
# File 'tap.rb', line 838 def self.cmd_directories Pathname.glob TAP_DIRECTORY/"*/*/cmd" end |
.default_cask_tap ⇒ CoreCaskTap
69 70 71 72 73 |
# File 'tap.rb', line 69 def self.default_cask_tap odeprecated "Tap.default_cask_tap", "CoreCaskTap.instance" CoreCaskTap.instance end |
.each(&block) ⇒ Object
818 819 820 821 822 823 824 825 826 827 828 |
# File 'tap.rb', line 818 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
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
# File 'tap.rb', line 39 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) return CoreCaskTap.instance if user == "Homebrew" && repo == "cask" 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}
561 562 563 564 565 566 |
# File 'tap.rb', line 561 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_by_name end end |
.from_path(path) ⇒ Object
61 62 63 64 65 66 |
# File 'tap.rb', line 61 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 14 15 16 |
# File 'extend/os/mac/tap.rb', line 5 def self.install_default_cask_tap_if_necessary(force: false) odeprecated "Tap.install_default_cask_tap_if_necessary", "CoreCaskTap.ensure_installed!" cask_tap = CoreCaskTap.instance return false if 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?(cask_tap.name) cask_tap.install true end |
Instance Method Details
#==(other) ⇒ Boolean
813 814 815 816 |
# File 'tap.rb', line 813 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
860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 |
# File 'tap.rb', line 860 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
791 792 793 |
# File 'tap.rb', line 791 def audit_exceptions @audit_exceptions = read_formula_list_directory "#{HOMEBREW_TAP_AUDIT_EXCEPTIONS_DIR}/*" end |
#cask_dir ⇒ Pathname
510 511 512 |
# File 'tap.rb', line 510 def cask_dir @cask_dir ||= path/"Casks" end |
#cask_files ⇒ Array<Pathname>
581 582 583 584 585 586 587 |
# File 'tap.rb', line 581 def cask_files @cask_files ||= if cask_dir.directory? cask_dir.find.select(&method(:ruby_file?)) else [] end end |
#cask_renames ⇒ Hash{String => String}
Hash with tap cask renames.
752 753 754 755 756 757 758 |
# File 'tap.rb', line 752 def cask_renames @cask_renames ||= if (rename_file = path/HOMEBREW_TAP_CASK_RENAMES_FILE).file? JSON.parse(rename_file.read) else {} end end |
#cask_tokens ⇒ Array<String>
660 661 662 |
# File 'tap.rb', line 660 def cask_tokens @cask_tokens ||= cask_files.map(&method(:formula_file_to_name)) end |
#clear_cache ⇒ Object
Clear internal cache.
123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
# File 'tap.rb', line 123 def clear_cache @remote = nil @repo_var = nil @formula_dir = nil @cask_dir = nil @command_dir = nil @formula_files = nil @cask_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
711 712 713 |
# File 'tap.rb', line 711 def command_dir @command_dir ||= path/"cmd" end |
#command_files ⇒ Array<Pathname>
An array of all commands files of this Tap.
717 718 719 720 721 722 723 |
# File 'tap.rb', line 717 def command_files @command_files ||= if command_dir.directory? Commands.find_commands(command_dir) else [] end end |
#config ⇒ Object
237 238 239 240 241 242 243 |
# File 'tap.rb', line 237 def config @config ||= begin raise TapUnavailableError, name unless installed? TapConfig.new(self) end end |
#contents ⇒ Object
525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 |
# File 'tap.rb', line 525 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
481 482 483 484 485 |
# File 'tap.rb', line 481 def custom_remote? return true unless remote remote.casecmp(default_remote).nonzero? end |
#default_remote ⇒ String
The default remote path to this Tap.
174 175 176 |
# File 'tap.rb', line 174 def default_remote "https://github.com/#{full_name}" end |
#ensure_installed! ⇒ void
This method returns an undefined value.
148 149 150 151 152 |
# File 'tap.rb', line 148 def ensure_installed! return if installed? install end |
#fix_remote_configuration(requested_remote: nil, quiet: false) ⇒ Object
414 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 |
# File 'tap.rb', line 414 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 return unless remote 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
489 490 491 492 493 494 495 496 |
# File 'tap.rb', line 489 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>
545 546 547 548 549 550 551 552 553 554 555 556 557 |
# File 'tap.rb', line 545 def formula_files @formula_files ||= if formula_dir.directory? if formula_dir == path # We only want the top level here so we don't treat commands & casks as formulae. # Sharding is only supported in Formula/ and HomebrewFormula/. formula_dir.children else formula_dir.find end.select(&method(:formula_file?)) else [] end end |
#formula_names ⇒ Array<String>
643 644 645 |
# File 'tap.rb', line 643 def formula_names @formula_names ||= formula_files.map(&method(:formula_file_to_name)) end |
#formula_oldnames ⇒ Hash{String => Array<String>}
Hash with tap formula old names. Reverse of #formula_renames.
772 773 774 775 776 777 |
# File 'tap.rb', line 772 def formula_oldnames @formula_oldnames ||= formula_renames.each_with_object({}) do |(old_name, new_name), hash| hash[new_name] ||= [] hash[new_name] << old_name end end |
#formula_renames ⇒ Hash{String => String}
Hash with tap formula renames.
762 763 764 765 766 767 768 |
# File 'tap.rb', line 762 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.
186 187 188 |
# File 'tap.rb', line 186 def git? git_repo.git_repo? end |
#git_branch ⇒ Object
Git branch for this Tap.
191 192 193 194 195 |
# File 'tap.rb', line 191 def git_branch raise TapUnavailableError, name unless installed? git_repo.branch_name end |
#git_head ⇒ Object
Git HEAD for this Tap.
198 199 200 201 202 |
# File 'tap.rb', line 198 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.
205 206 207 208 209 |
# File 'tap.rb', line 205 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, force: false) ⇒ Object
Install this Tap.
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 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 |
# File 'tap.rb', line 276 def install(quiet: false, clone_target: nil, force_auto_update: nil, custom_remote: false, verify: false, force: 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 elsif (core_tap? || core_cask_tap?) && !Homebrew::EnvConfig.no_install_from_api? && !force # odeprecated: move to odie in the next minor release. This may break some CI so we should give notice. opoo "Tapping #{name} is no longer typically necessary.\n" \ "Add #{Formatter.option("--force")} if you are sure you need it done." 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=" # prevent fsmonitor from watching this repo args << "--config" << "core.fsmonitor=false" begin safe_system "git", *args if verify && !Homebrew::EnvConfig.developer? && !Readall.valid_tap?(self, aliases: true) 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.
246 247 248 |
# File 'tap.rb', line 246 def installed? path.directory? end |
#issues_url ⇒ String?
The issues URL of this Tap.
e.g. https://github.com/user/homebrew-repo/issues
214 215 216 217 218 |
# File 'tap.rb', line 214 def issues_url return if !official? && custom_remote? "#{default_remote}/issues" end |
#link_completions_and_manpages ⇒ Object
402 403 404 405 406 407 408 409 410 411 412 |
# File 'tap.rb', line 402 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 |
#new_cask_path(token) ⇒ Pathname
515 516 517 |
# File 'tap.rb', line 515 def new_cask_path(token) cask_dir/"#{token.downcase}.rb" end |
#new_formula_path(name) ⇒ Pathname
504 505 506 |
# File 'tap.rb', line 504 def new_formula_path(name) formula_dir/"#{name.downcase}.rb" end |
#official? ⇒ Boolean
True if this Tap is an official Homebrew tap.
225 226 227 |
# File 'tap.rb', line 225 def official? user == "Homebrew" end |
#potential_formula_dirs ⇒ Array<Pathname>
499 500 501 |
# File 'tap.rb', line 499 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.
230 231 232 233 234 |
# File 'tap.rb', line 230 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
802 803 804 |
# File 'tap.rb', line 802 def pypi_formula_mappings @pypi_formula_mappings = read_formula_list path/HOMEBREW_TAP_PYPI_FORMULA_MAPPINGS end |
#relative_cask_path(token) ⇒ String
520 521 522 523 |
# File 'tap.rb', line 520 def relative_cask_path(token) new_cask_path(token).to_s .delete_prefix("#{path}/") end |
#remote ⇒ Object
The remote path to this Tap.
e.g. https://github.com/user/homebrew-repo
156 157 158 159 160 |
# File 'tap.rb', line 156 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
164 165 166 167 168 169 170 |
# File 'tap.rb', line 164 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
178 179 180 181 182 183 |
# File 'tap.rb', line 178 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.
251 252 253 |
# File 'tap.rb', line 251 def shallow? (path/".git/shallow").exist? end |
#style_exceptions ⇒ Hash
Hash with style exceptions
797 798 799 |
# File 'tap.rb', line 797 def style_exceptions @style_exceptions = read_formula_list_directory "#{HOMEBREW_TAP_STYLE_EXCEPTIONS_DIR}/*" end |
#tap_migrations ⇒ Hash
Hash with tap migrations.
781 782 783 784 785 786 787 |
# File 'tap.rb', line 781 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
726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 |
# File 'tap.rb', line 726 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
220 221 222 |
# File 'tap.rb', line 220 def to_s name end |
#uninstall(manual: false) ⇒ Object
Uninstall this Tap.
445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 |
# File 'tap.rb', line 445 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 |