aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--Library/.rubocop.yml12
-rw-r--r--Library/Homebrew/brew.rb19
-rw-r--r--Library/Homebrew/brew.sh1
-rw-r--r--Library/Homebrew/cask/lib/hbc/cask_loader.rb19
-rw-r--r--Library/Homebrew/cask/lib/hbc/cli.rb50
-rw-r--r--Library/Homebrew/cask/lib/hbc/cli/abstract_command.rb38
-rw-r--r--Library/Homebrew/cask/lib/hbc/cli/audit.rb7
-rw-r--r--Library/Homebrew/cask/lib/hbc/cli/cat.rb10
-rw-r--r--Library/Homebrew/cask/lib/hbc/cli/cleanup.rb2
-rw-r--r--Library/Homebrew/cask/lib/hbc/cli/edit.rb10
-rw-r--r--Library/Homebrew/cask/lib/hbc/cli/fetch.rb9
-rw-r--r--Library/Homebrew/cask/lib/hbc/cli/home.rb4
-rw-r--r--Library/Homebrew/cask/lib/hbc/cli/info.rb6
-rw-r--r--Library/Homebrew/cask/lib/hbc/cli/install.rb39
-rw-r--r--Library/Homebrew/cask/lib/hbc/cli/internal_dump.rb18
-rw-r--r--Library/Homebrew/cask/lib/hbc/cli/internal_stanza.rb35
-rw-r--r--Library/Homebrew/cask/lib/hbc/cli/list.rb44
-rw-r--r--Library/Homebrew/cask/lib/hbc/cli/outdated.rb4
-rw-r--r--Library/Homebrew/cask/lib/hbc/cli/reinstall.rb27
-rw-r--r--Library/Homebrew/cask/lib/hbc/cli/search.rb4
-rw-r--r--Library/Homebrew/cask/lib/hbc/cli/style.rb4
-rw-r--r--Library/Homebrew/cask/lib/hbc/cli/uninstall.rb13
-rw-r--r--Library/Homebrew/cask/lib/hbc/cli/zap.rb9
-rw-r--r--Library/Homebrew/cask/lib/hbc/exceptions.rb97
-rw-r--r--Library/Homebrew/cask/lib/hbc/installer.rb3
-rw-r--r--Library/Homebrew/cask/lib/hbc/scopes.rb1
-rw-r--r--Library/Homebrew/cask/lib/hbc/verify/checksum.rb4
-rw-r--r--Library/Homebrew/cmd/--repository.rb3
-rw-r--r--Library/Homebrew/cmd/info.rb2
-rw-r--r--Library/Homebrew/cmd/install.rb2
-rw-r--r--Library/Homebrew/cmd/reinstall.rb4
-rw-r--r--Library/Homebrew/cmd/search.rb2
-rw-r--r--Library/Homebrew/cmd/style.rb2
-rw-r--r--Library/Homebrew/dev-cmd/audit.rb119
-rw-r--r--Library/Homebrew/dev-cmd/bump-formula-pr.rb4
-rw-r--r--Library/Homebrew/dev-cmd/create.rb14
-rw-r--r--Library/Homebrew/dev-cmd/edit.rb4
-rw-r--r--Library/Homebrew/dev-cmd/man.rb2
-rw-r--r--Library/Homebrew/dev-cmd/pull.rb4
-rw-r--r--Library/Homebrew/dev-cmd/release-notes.rb2
-rw-r--r--Library/Homebrew/dev-cmd/tests.rb12
-rw-r--r--Library/Homebrew/diagnostic.rb12
-rw-r--r--Library/Homebrew/download_strategy.rb6
-rw-r--r--Library/Homebrew/exceptions.rb7
-rw-r--r--Library/Homebrew/extend/ENV/std.rb2
-rw-r--r--Library/Homebrew/extend/ENV/super.rb2
-rw-r--r--Library/Homebrew/extend/os/mac/diagnostic.rb5
-rw-r--r--Library/Homebrew/extend/os/mac/requirements/java_requirement.rb2
-rw-r--r--Library/Homebrew/extend/os/mac/utils/bottles.rb2
-rw-r--r--Library/Homebrew/formula.rb4
-rw-r--r--Library/Homebrew/formula_assertions.rb4
-rw-r--r--Library/Homebrew/formula_installer.rb34
-rw-r--r--Library/Homebrew/formulary.rb8
-rw-r--r--Library/Homebrew/global.rb1
-rw-r--r--Library/Homebrew/language/node.rb2
-rw-r--r--Library/Homebrew/os/mac.rb2
-rw-r--r--Library/Homebrew/os/mac/pkgconfig/10.13/libcurl.pc39
-rw-r--r--Library/Homebrew/os/mac/pkgconfig/10.13/libexslt.pc12
-rw-r--r--Library/Homebrew/os/mac/pkgconfig/10.13/libxml-2.0.pc13
-rw-r--r--Library/Homebrew/os/mac/pkgconfig/10.13/libxslt.pc12
-rw-r--r--Library/Homebrew/os/mac/pkgconfig/10.13/sqlite3.pc11
-rw-r--r--Library/Homebrew/os/mac/pkgconfig/10.13/zlib.pc13
-rw-r--r--Library/Homebrew/os/mac/version.rb1
-rw-r--r--Library/Homebrew/os/mac/xcode.rb12
-rw-r--r--Library/Homebrew/patch.rb2
-rw-r--r--Library/Homebrew/readall.rb2
-rw-r--r--Library/Homebrew/requirement.rb2
-rw-r--r--Library/Homebrew/rubocops/formula_desc_cop.rb75
-rw-r--r--Library/Homebrew/rubocops/homepage_cop.rb2
l---------Library/Homebrew/shims/super/g++-71
l---------Library/Homebrew/shims/super/gcc-71
-rw-r--r--Library/Homebrew/system_config.rb2
-rw-r--r--Library/Homebrew/tap.rb4
-rw-r--r--Library/Homebrew/test/.codecov.yml11
-rw-r--r--Library/Homebrew/test/cask/artifact/suite_spec.rb13
-rw-r--r--Library/Homebrew/test/cask/cli/audit_spec.rb2
-rw-r--r--Library/Homebrew/test/cask/cli/cat_spec.rb6
-rw-r--r--Library/Homebrew/test/cask/cli/fetch_spec.rb2
-rw-r--r--Library/Homebrew/test/cask/cli/install_spec.rb8
-rw-r--r--Library/Homebrew/test/cask/cli/style_spec.rb3
-rw-r--r--Library/Homebrew/test/cask/cli/uninstall_spec.rb20
-rw-r--r--Library/Homebrew/test/cask/cli/zap_spec.rb6
-rw-r--r--Library/Homebrew/test/cask/cli_spec.rb23
-rw-r--r--Library/Homebrew/test/cask/dsl_spec.rb2
-rw-r--r--Library/Homebrew/test/cask/installer_spec.rb120
-rw-r--r--Library/Homebrew/test/cask/verify/checksum_spec.rb2
-rw-r--r--Library/Homebrew/test/cmd/cask_spec.rb2
-rw-r--r--Library/Homebrew/test/cmd/services_spec.rb2
-rw-r--r--Library/Homebrew/test/gpg_spec.rb25
-rw-r--r--Library/Homebrew/test/os/mac/diagnostic_spec.rb13
-rw-r--r--Library/Homebrew/test/rubocops/formula_desc_cop_spec.rb55
-rw-r--r--Library/Homebrew/test/spec_helper.rb2
l---------Library/Homebrew/test/support/fixtures/bottles/testball_bottle-0.1.high_sierra.bottle.tar.gz1
-rw-r--r--Library/Homebrew/test/support/fixtures/cask/Casks/container-air.rb9
-rw-r--r--Library/Homebrew/test/support/fixtures/cask/Casks/container-gpg.rb12
-rw-r--r--Library/Homebrew/test/support/fixtures/cask/Casks/container-lzma.rb11
-rw-r--r--Library/Homebrew/test/support/fixtures/cask/Casks/container-rar.rb11
-rw-r--r--Library/Homebrew/test/support/fixtures/cask/Casks/container-sit.rb11
-rw-r--r--Library/Homebrew/test/support/fixtures/cask/Casks/container-xz.rb11
-rw-r--r--Library/Homebrew/test/support/helper/rubocop.rb13
-rw-r--r--Library/Homebrew/test/utils/popen_spec.rb6
-rw-r--r--Library/Homebrew/utils.rb41
-rw-r--r--Library/Homebrew/utils/analytics.rb23
-rw-r--r--Library/Homebrew/utils/analytics.sh53
-rw-r--r--Library/Homebrew/utils/fork.rb4
-rw-r--r--Library/Homebrew/utils/tty.rb5
-rw-r--r--README.md2
-rw-r--r--completions/zsh/_brew6
-rw-r--r--docs/Acceptable-Formulae.md3
-rw-r--r--docs/Analytics.md4
-rw-r--r--docs/Manpage.md9
-rw-r--r--docs/Python-for-Formula-Authors.md14
-rw-r--r--docs/Xcode.md3
-rw-r--r--manpages/brew.17
115 files changed, 705 insertions, 834 deletions
diff --git a/.gitignore b/.gitignore
index 2957e4f79..b70874d2f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -54,6 +54,7 @@
# Unignore our root-level metadata files.
!/.gitignore
!/.travis.yml
+!/.codecov.yml
!/.yardopts
!/CODEOFCONDUCT.md
!/CONTRIBUTING.md
diff --git a/Library/.rubocop.yml b/Library/.rubocop.yml
index 8099c7ad0..19d871414 100644
--- a/Library/.rubocop.yml
+++ b/Library/.rubocop.yml
@@ -118,10 +118,6 @@ Style/BlockDelimiters:
Style/ClassAndModuleChildren:
EnforcedStyle: nested
-# percent-x is allowed for multiline
-Style/CommandLiteral:
- EnforcedStyle: mixed
-
# our current conditional style is established, clear and
# requiring users to change that now would be confusing.
Style/ConditionalAssignment:
@@ -176,10 +172,6 @@ Style/PercentLiteralDelimiters:
'%W': '[]'
'%x': '()'
-# we prefer Perl-style regex back references
-Style/PerlBackrefs:
- Enabled: false
-
Style/RaiseArgs:
EnforcedStyle: exploded
@@ -187,10 +179,6 @@ Style/RaiseArgs:
Style/RegexpLiteral:
EnforcedStyle: slashes
-# not a problem for typical shell users
-Style/SpecialGlobalVars:
- Enabled: false
-
# ruby style guide favorite
Style/StringLiterals:
EnforcedStyle: double_quotes
diff --git a/Library/Homebrew/brew.rb b/Library/Homebrew/brew.rb
index 7222f7e87..11ea8df67 100644
--- a/Library/Homebrew/brew.rb
+++ b/Library/Homebrew/brew.rb
@@ -10,7 +10,8 @@ raise "Homebrew must be run under Ruby 2!" unless RUBY_TWO
require "pathname"
HOMEBREW_LIBRARY_PATH = Pathname.new(__FILE__).realpath.parent
-$:.unshift(HOMEBREW_LIBRARY_PATH.to_s)
+require "English"
+$LOAD_PATH.unshift(HOMEBREW_LIBRARY_PATH.to_s)
require "global"
require "tap"
@@ -20,14 +21,6 @@ if ARGV == %w[--version] || ARGV == %w[-v]
exit 0
end
-def require?(path)
- return false if path.nil?
- require path
-rescue LoadError => e
- # we should raise on syntax errors but not if the file doesn't exist.
- raise unless e.message.include?(path)
-end
-
begin
trap("INT", std_trap) # restore default CTRL-C handler
@@ -134,17 +127,15 @@ rescue Interrupt
$stderr.puts # seemingly a newline is typical
exit 130
rescue BuildError => e
- Utils::Analytics.report_exception(e)
+ Utils::Analytics.report_build_error(e)
e.dump
exit 1
rescue RuntimeError, SystemCallError => e
- Utils::Analytics.report_exception(e)
raise if e.message.empty?
onoe e
$stderr.puts e.backtrace if ARGV.debug?
exit 1
rescue MethodDeprecatedError => e
- Utils::Analytics.report_exception(e)
onoe e
if e.issues_url
$stderr.puts "If reporting this issue please do so at (not Homebrew/brew or Homebrew/core):"
@@ -152,9 +143,9 @@ rescue MethodDeprecatedError => e
end
exit 1
rescue Exception => e
- Utils::Analytics.report_exception(e)
onoe e
- if internal_cmd && defined?(OS::ISSUES_URL)
+ if internal_cmd && defined?(OS::ISSUES_URL) &&
+ !ENV["HOMEBREW_NO_AUTO_UPDATE"]
$stderr.puts "#{Tty.bold}Please report this bug:#{Tty.reset}"
$stderr.puts " #{Formatter.url(OS::ISSUES_URL)}"
end
diff --git a/Library/Homebrew/brew.sh b/Library/Homebrew/brew.sh
index b76280099..97c3b7f86 100644
--- a/Library/Homebrew/brew.sh
+++ b/Library/Homebrew/brew.sh
@@ -278,7 +278,6 @@ fi
# shellcheck source=/dev/null
source "$HOMEBREW_LIBRARY/Homebrew/utils/analytics.sh"
setup-analytics
-report-analytics-screenview-command
# Let user know we're still updating Homebrew if brew update --preinstall
# exceeds 3 seconds.
diff --git a/Library/Homebrew/cask/lib/hbc/cask_loader.rb b/Library/Homebrew/cask/lib/hbc/cask_loader.rb
index a0c44d9b4..43fd9080d 100644
--- a/Library/Homebrew/cask/lib/hbc/cask_loader.rb
+++ b/Library/Homebrew/cask/lib/hbc/cask_loader.rb
@@ -32,9 +32,9 @@ module Hbc
end
def load
- raise CaskError, "'#{@path}' does not exist." unless @path.exist?
- raise CaskError, "'#{@path}' is not readable." unless @path.readable?
- raise CaskError, "'#{@path}' is not a file." unless @path.file?
+ raise CaskUnavailableError.new(@token, "'#{@path}' does not exist.") unless @path.exist?
+ raise CaskUnavailableError.new(@token, "'#{@path}' is not readable.") unless @path.readable?
+ raise CaskUnavailableError.new(@token, "'#{@path}' is not a file.") unless @path.file?
@content = IO.read(@path)
@@ -45,7 +45,7 @@ module Hbc
def cask(header_token, &block)
if @token != header_token
- raise CaskTokenDoesNotMatchError.new(@token, header_token)
+ raise CaskTokenMismatchError.new(@token, header_token)
end
Cask.new(header_token, sourcefile_path: @path, &block)
@@ -57,10 +57,11 @@ module Hbc
ref.to_s.match?(::URI.regexp)
end
+ attr_reader :url
+
def initialize(url)
- @url = url
- uri = URI(url)
- super Hbc.cache/File.basename(uri.path)
+ @url = URI(url)
+ super Hbc.cache/File.basename(@url.path)
end
def load
@@ -71,7 +72,7 @@ module Hbc
ohai "Downloading #{@url}."
curl @url, "-o", @path
rescue ErrorDuringExecution
- raise CaskUnavailableError, @url
+ raise CaskUnavailableError.new(@token, "Failed to download #{Formatter.url(@url)}.")
end
super
@@ -108,7 +109,7 @@ module Hbc
end
def load
- raise CaskUnavailableError, @token
+ raise CaskUnavailableError.new(@token, "No Cask with this name exists.")
end
end
diff --git a/Library/Homebrew/cask/lib/hbc/cli.rb b/Library/Homebrew/cask/lib/hbc/cli.rb
index 99980b88d..0108c1621 100644
--- a/Library/Homebrew/cask/lib/hbc/cli.rb
+++ b/Library/Homebrew/cask/lib/hbc/cli.rb
@@ -66,7 +66,7 @@ module Hbc
option "--help", :help, false
# handled in OS::Mac
- option "--language a,b,c", ->(*) { raise OptionParser::InvalidOption }
+ option "--language a,b,c", ->(*) {}
# override default handling of --version
option "--version", ->(*) { raise OptionParser::InvalidOption }
@@ -92,10 +92,10 @@ module Hbc
command.is_a?(Class) && !command.abstract? && command.needs_init?
end
- def self.run_command(command, *rest)
+ def self.run_command(command, *args)
if command.respond_to?(:run)
# usual case: built-in command verb
- command.run(*rest)
+ command.run(*args)
elsif require?(which("brewcask-#{command}.rb"))
# external command as Ruby library on PATH, Homebrew-style
elsif command.to_s.include?("/") && require?(command.to_s)
@@ -111,7 +111,7 @@ module Hbc
if klass.respond_to?(:run)
# invoke "run" on a Ruby library which follows our coding conventions
# other Ruby libraries must do everything via "require"
- klass.run(*rest)
+ klass.run(*args)
end
elsif which("brewcask-#{command}")
# arbitrary external executable on PATH, Homebrew-style
@@ -124,7 +124,7 @@ module Hbc
exec command, *ARGV[1..-1]
else
# failure
- NullCommand.new(command).run
+ NullCommand.new(command, *args).run
end
end
@@ -136,18 +136,39 @@ module Hbc
@args = process_options(*args)
end
+ def detect_command_and_arguments(*args)
+ command = args.detect do |arg|
+ if self.class.commands.include?(arg)
+ true
+ else
+ break unless arg.start_with?("-")
+ end
+ end
+
+ if index = args.index(command)
+ args.delete_at(index)
+ end
+
+ [*command, *args]
+ end
+
def run
- command_name, *args = *@args
- command = help? ? "help" : self.class.lookup_command(command_name)
+ command_name, *args = detect_command_and_arguments(*@args)
+ command = if help?
+ args.unshift(command_name)
+ "help"
+ else
+ self.class.lookup_command(command_name)
+ end
MacOS.full_version = ENV["MACOS_VERSION"] unless ENV["MACOS_VERSION"].nil?
Hbc.default_tap.install unless Hbc.default_tap.installed?
Hbc.init if self.class.should_init?(command)
self.class.run_command(command, *args)
- rescue CaskError, CaskSha256MismatchError, ArgumentError, OptionParser::InvalidOption => e
+ rescue CaskError, ArgumentError, OptionParser::InvalidOption => e
msg = e.message
- msg << e.backtrace.join("\n") if ARGV.debug?
+ msg << e.backtrace.join("\n").prepend("\n") if ARGV.debug?
onoe msg
exit 1
rescue StandardError, ScriptError, NoMemoryError => e
@@ -199,18 +220,19 @@ module Hbc
end
class NullCommand
- def initialize(attempted_verb)
- @attempted_verb = attempted_verb
+ def initialize(command, *args)
+ @command = command
+ @args = args
end
def run(*_args)
purpose
usage
- return if @attempted_verb.to_s.strip.empty?
- return if @attempted_verb == "help"
+ return if @command == "help" && @args.empty?
- raise ArgumentError, "Unknown command: #{@attempted_verb}"
+ unknown_command = @args.empty? ? @command : @args.first
+ raise ArgumentError, "Unknown command: #{unknown_command}"
end
def purpose
diff --git a/Library/Homebrew/cask/lib/hbc/cli/abstract_command.rb b/Library/Homebrew/cask/lib/hbc/cli/abstract_command.rb
index cdb7f5ec8..77f85301e 100644
--- a/Library/Homebrew/cask/lib/hbc/cli/abstract_command.rb
+++ b/Library/Homebrew/cask/lib/hbc/cli/abstract_command.rb
@@ -9,6 +9,7 @@ module Hbc
option "--debug", :debug, false
option "--verbose", :verbose, false
option "--outdated", :outdated_only, false
+ option "--require-sha", :require_sha, false
def self.command_name
@command_name ||= name.sub(/^.*:/, "").gsub(/(.)([A-Z])/, '\1_\2').downcase
@@ -40,6 +41,43 @@ module Hbc
def initialize(*args)
@args = process_arguments(*args)
end
+
+ def self.warn_unavailable_with_suggestion(cask_token, e)
+ exact_match, partial_matches = Search.search(cask_token)
+ error_message = e.message
+ if exact_match
+ error_message.concat(" Did you mean:\n#{exact_match}")
+ elsif !partial_matches.empty?
+ error_message.concat(" Did you mean one of:\n")
+ .concat(Formatter.columns(partial_matches.take(20)))
+ end
+ onoe error_message
+ end
+
+ private
+
+ def casks(alternative: -> { [] })
+ return to_enum(:casks, alternative: alternative) unless block_given?
+
+ count = 0
+
+ casks = args.empty? ? alternative.call : args
+
+ casks.each do |cask_or_token|
+ begin
+ yield cask_or_token.respond_to?(:token) ? cask_or_token : CaskLoader.load(cask_or_token)
+ count += 1
+ rescue CaskUnavailableError => e
+ cask_token = cask_or_token
+ self.class.warn_unavailable_with_suggestion cask_token, e
+ rescue CaskError => e
+ onoe e.message
+ end
+ end
+
+ return :empty if casks.length.zero?
+ (count == casks.length) ? :complete : :incomplete
+ end
end
end
end
diff --git a/Library/Homebrew/cask/lib/hbc/cli/audit.rb b/Library/Homebrew/cask/lib/hbc/cli/audit.rb
index 74d1ebfa7..35d82800c 100644
--- a/Library/Homebrew/cask/lib/hbc/cli/audit.rb
+++ b/Library/Homebrew/cask/lib/hbc/cli/audit.rb
@@ -9,11 +9,8 @@ module Hbc
end
def run
- casks_to_audit = args.empty? ? Hbc.all : args.map(&CaskLoader.public_method(:load))
-
- failed_casks = casks_to_audit.reject do |cask|
- audit(cask)
- end
+ failed_casks = casks(alternative: -> { Hbc.all })
+ .reject { |cask| audit(cask) }
return if failed_casks.empty?
raise CaskError, "audit failed for casks: #{failed_casks.join(" ")}"
diff --git a/Library/Homebrew/cask/lib/hbc/cli/cat.rb b/Library/Homebrew/cask/lib/hbc/cli/cat.rb
index e68481b46..d08c87bea 100644
--- a/Library/Homebrew/cask/lib/hbc/cli/cat.rb
+++ b/Library/Homebrew/cask/lib/hbc/cli/cat.rb
@@ -7,10 +7,12 @@ module Hbc
end
def run
- args.each do |cask_token|
- cask_path = CaskLoader.path(cask_token)
- raise CaskUnavailableError, cask_token.to_s unless cask_path.exist?
- puts File.open(cask_path, &:read)
+ raise CaskError, "Cat incomplete." if cat_casks == :incomplete
+ end
+
+ def cat_casks
+ casks.each do |cask|
+ puts File.open(cask.sourcefile_path, &:read)
end
end
diff --git a/Library/Homebrew/cask/lib/hbc/cli/cleanup.rb b/Library/Homebrew/cask/lib/hbc/cli/cleanup.rb
index 40b37dd5d..356162db5 100644
--- a/Library/Homebrew/cask/lib/hbc/cli/cleanup.rb
+++ b/Library/Homebrew/cask/lib/hbc/cli/cleanup.rb
@@ -20,7 +20,7 @@ module Hbc
end
def run
- remove_cache_files(*@args)
+ remove_cache_files(*args)
end
def cache_files
diff --git a/Library/Homebrew/cask/lib/hbc/cli/edit.rb b/Library/Homebrew/cask/lib/hbc/cli/edit.rb
index dec0fe36b..b9485886c 100644
--- a/Library/Homebrew/cask/lib/hbc/cli/edit.rb
+++ b/Library/Homebrew/cask/lib/hbc/cli/edit.rb
@@ -9,10 +9,12 @@ module Hbc
def run
cask_token = args.first
- cask_path = CaskLoader.path(cask_token)
-
- unless cask_path.exist?
- raise CaskUnavailableError, %Q(#{cask_token}, run "brew cask create #{cask_token}" to create a new Cask)
+ cask_path = begin
+ CaskLoader.load(cask_token).sourcefile_path
+ rescue CaskUnavailableError => e
+ reason = e.reason.empty? ? "" : "#{e.reason} "
+ reason.concat("Run #{Formatter.identifier("brew cask create #{e.token}")} to create a new Cask.")
+ raise e.class.new(e.token, reason)
end
odebug "Opening editor for Cask #{cask_token}"
diff --git a/Library/Homebrew/cask/lib/hbc/cli/fetch.rb b/Library/Homebrew/cask/lib/hbc/cli/fetch.rb
index 2c1cc5f66..e31b1a17c 100644
--- a/Library/Homebrew/cask/lib/hbc/cli/fetch.rb
+++ b/Library/Homebrew/cask/lib/hbc/cli/fetch.rb
@@ -9,9 +9,12 @@ module Hbc
end
def run
- args.each do |cask_token|
- ohai "Downloading external files for Cask #{cask_token}"
- cask = CaskLoader.load(cask_token)
+ raise CaskError, "Fetch incomplete." if fetch_casks == :incomplete
+ end
+
+ def fetch_casks
+ casks.each do |cask|
+ ohai "Downloading external files for Cask #{cask}"
downloaded_path = Download.new(cask, force: force?).perform
Verify.all(cask, downloaded_path)
ohai "Success! Downloaded to -> #{downloaded_path}"
diff --git a/Library/Homebrew/cask/lib/hbc/cli/home.rb b/Library/Homebrew/cask/lib/hbc/cli/home.rb
index 009bc1e3e..d496e309e 100644
--- a/Library/Homebrew/cask/lib/hbc/cli/home.rb
+++ b/Library/Homebrew/cask/lib/hbc/cli/home.rb
@@ -2,9 +2,7 @@ module Hbc
class CLI
class Home < AbstractCommand
def run
- casks = args.map(&CaskLoader.public_method(:load))
-
- if casks.empty?
+ if casks.none?
odebug "Opening project homepage"
self.class.open_url "https://caskroom.github.io/"
else
diff --git a/Library/Homebrew/cask/lib/hbc/cli/info.rb b/Library/Homebrew/cask/lib/hbc/cli/info.rb
index 623c4b737..d26747e17 100644
--- a/Library/Homebrew/cask/lib/hbc/cli/info.rb
+++ b/Library/Homebrew/cask/lib/hbc/cli/info.rb
@@ -7,10 +7,8 @@ module Hbc
end
def run
- args.each do |cask_token|
- odebug "Getting info for Cask #{cask_token}"
- cask = CaskLoader.load(cask_token)
-
+ casks.each do |cask|
+ odebug "Getting info for Cask #{cask}"
self.class.info(cask)
end
end
diff --git a/Library/Homebrew/cask/lib/hbc/cli/install.rb b/Library/Homebrew/cask/lib/hbc/cli/install.rb
index 72f85fc69..0f1a5dd34 100644
--- a/Library/Homebrew/cask/lib/hbc/cli/install.rb
+++ b/Library/Homebrew/cask/lib/hbc/cli/install.rb
@@ -3,7 +3,6 @@ module Hbc
class Install < AbstractCommand
option "--force", :force, false
option "--skip-cask-deps", :skip_cask_deps, false
- option "--require-sha", :require_sha, false
def initialize(*)
super
@@ -11,53 +10,21 @@ module Hbc
end
def run
- retval = install_casks
- # retval is ternary: true/false/nil
-
- raise CaskError, "nothing to install" if retval.nil?
- raise CaskError, "install incomplete" unless retval
+ raise CaskError, "Install incomplete." if install_casks == :incomplete
end
def install_casks
- count = 0
- args.each do |cask_token|
+ casks.each do |cask|
begin
- cask = CaskLoader.load(cask_token)
Installer.new(cask, binaries: binaries?,
- verbose: verbose?,
+ verbose: verbose?,
force: force?,
skip_cask_deps: skip_cask_deps?,
require_sha: require_sha?).install
- count += 1
rescue CaskAlreadyInstalledError => e
opoo e.message
- count += 1
- rescue CaskAlreadyInstalledAutoUpdatesError => e
- opoo e.message
- count += 1
- rescue CaskUnavailableError => e
- self.class.warn_unavailable_with_suggestion cask_token, e
- rescue CaskNoShasumError => e
- opoo e.message
- count += 1
- rescue CaskError => e
- onoe e.message
end
end
-
- count.zero? ? nil : count == args.length
- end
-
- def self.warn_unavailable_with_suggestion(cask_token, e)
- exact_match, partial_matches = Search.search(cask_token)
- error_message = e.message
- if exact_match
- error_message.concat(". Did you mean:\n#{exact_match}")
- elsif !partial_matches.empty?
- error_message.concat(". Did you mean one of:\n")
- .concat(Formatter.columns(partial_matches.take(20)))
- end
- onoe error_message
end
def self.help
diff --git a/Library/Homebrew/cask/lib/hbc/cli/internal_dump.rb b/Library/Homebrew/cask/lib/hbc/cli/internal_dump.rb
index 78dbf1622..e21ce86b6 100644
--- a/Library/Homebrew/cask/lib/hbc/cli/internal_dump.rb
+++ b/Library/Homebrew/cask/lib/hbc/cli/internal_dump.rb
@@ -7,25 +7,11 @@ module Hbc
end
def run
- retval = dump_casks
- # retval is ternary: true/false/nil
-
- raise CaskError, "nothing to dump" if retval.nil?
- raise CaskError, "dump incomplete" unless retval
+ raise CaskError, "Dump incomplete." if dump_casks == :incomplet
end
def dump_casks
- count = 0
- args.each do |cask_token|
- begin
- cask = CaskLoader.load(cask_token)
- count += 1
- cask.dumpcask
- rescue StandardError => e
- opoo "#{cask_token} was not found or would not load: #{e}"
- end
- end
- count.zero? ? nil : count == args.length
+ casks.each(&:dumpcask)
end
def self.help
diff --git a/Library/Homebrew/cask/lib/hbc/cli/internal_stanza.rb b/Library/Homebrew/cask/lib/hbc/cli/internal_stanza.rb
index 86dee7c9c..4515fe931 100644
--- a/Library/Homebrew/cask/lib/hbc/cli/internal_stanza.rb
+++ b/Library/Homebrew/cask/lib/hbc/cli/internal_stanza.rb
@@ -72,38 +72,22 @@ module Hbc
end
def run
- retval = print_stanzas
- # retval is ternary: true/false/nil
- if retval.nil?
- exit 1 if quiet?
- raise CaskError, "nothing to print"
- elsif !retval
- exit 1 if quiet?
- raise CaskError, "print incomplete"
- end
+ return unless print_stanzas == :incomplete
+ exit 1 if quiet?
+ raise CaskError, "Print incomplete."
end
def print_stanzas
- count = 0
if ARTIFACTS.include?(stanza)
artifact_name = stanza
@stanza = :artifacts
end
- cask_tokens = args.empty? ? Hbc.all_tokens : args
- cask_tokens.each do |cask_token|
- print "#{cask_token}\t" if table?
-
- begin
- cask = CaskLoader.load(cask_token)
- rescue StandardError
- opoo "Cask '#{cask_token}' was not found" unless quiet?
- puts ""
- next
- end
+ casks(alternative: -> { Hbc.all }).each do |cask|
+ print "#{cask}\t" if table?
unless cask.respond_to?(stanza)
- opoo "no such stanza '#{stanza}' on Cask '#{cask_token}'" unless quiet?
+ opoo "no such stanza '#{stanza}' on Cask '#{cask}'" unless quiet?
puts ""
next
end
@@ -111,13 +95,13 @@ module Hbc
begin
value = cask.send(@stanza)
rescue StandardError
- opoo "failure calling '#{stanza}' on Cask '#{cask_token}'" unless quiet?
+ opoo "failure calling '#{stanza}' on Cask '#{cask}'" unless quiet?
puts ""
next
end
if artifact_name && !value.key?(artifact_name)
- opoo "no such stanza '#{artifact_name}' on Cask '#{cask_token}'" unless quiet?
+ opoo "no such stanza '#{artifact_name}' on Cask '#{cask}'" unless quiet?
puts ""
next
end
@@ -131,10 +115,7 @@ module Hbc
else
puts value.to_s
end
-
- count += 1
end
- count.zero? ? nil : count == cask_tokens.length
end
def self.help
diff --git a/Library/Homebrew/cask/lib/hbc/cli/list.rb b/Library/Homebrew/cask/lib/hbc/cli/list.rb
index 9d2ded4be..9d978360e 100644
--- a/Library/Homebrew/cask/lib/hbc/cli/list.rb
+++ b/Library/Homebrew/cask/lib/hbc/cli/list.rb
@@ -11,44 +11,22 @@ module Hbc
def run
retval = args.any? ? list : list_installed
- # retval is ternary: true/false/nil
- if retval.nil? && args.none?
- opoo "nothing to list" # special case: avoid exit code
- elsif retval.nil?
- raise CaskError, "nothing to list"
- elsif !retval
- raise CaskError, "listing incomplete"
- end
+ raise CaskError, "Listing incomplete." if retval == :incomplete
end
def list
- count = 0
-
- args.each do |cask_token|
- odebug "Listing files for Cask #{cask_token}"
- begin
- cask = CaskLoader.load(cask_token)
+ casks.each do |cask|
+ raise CaskNotInstalledError, cask unless cask.installed?
- if cask.installed?
- if one?
- puts cask.token
- elsif versions?
- puts self.class.format_versioned(cask)
- else
- cask = CaskLoader.load_from_file(cask.installed_caskfile)
- self.class.list_artifacts(cask)
- end
-
- count += 1
- else
- opoo "#{cask} is not installed"
- end
- rescue CaskUnavailableError => e
- onoe e
+ if one?
+ puts cask.token
+ elsif versions?
+ puts self.class.format_versioned(cask)
+ else
+ cask = CaskLoader.load_from_file(cask.installed_caskfile)
+ self.class.list_artifacts(cask)
end
end
-
- count.zero? ? nil : count == args.length
end
def self.list_artifacts(cask)
@@ -69,7 +47,7 @@ module Hbc
puts Formatter.columns(installed_casks.map(&:to_s))
end
- installed_casks.empty? ? nil : true
+ installed_casks.empty? ? :empty : :complete
end
def self.format_versioned(cask)
diff --git a/Library/Homebrew/cask/lib/hbc/cli/outdated.rb b/Library/Homebrew/cask/lib/hbc/cli/outdated.rb
index 7877ead05..b0a84e8d2 100644
--- a/Library/Homebrew/cask/lib/hbc/cli/outdated.rb
+++ b/Library/Homebrew/cask/lib/hbc/cli/outdated.rb
@@ -10,9 +10,7 @@ module Hbc
end
def run
- casks_to_check = args.empty? ? Hbc.installed : args.map(&CaskLoader.public_method(:load))
-
- casks_to_check.each do |cask|
+ casks(alternative: -> { Hbc.installed }).each do |cask|
odebug "Checking update info of Cask #{cask}"
self.class.list_if_outdated(cask, greedy?, verbose?)
end
diff --git a/Library/Homebrew/cask/lib/hbc/cli/reinstall.rb b/Library/Homebrew/cask/lib/hbc/cli/reinstall.rb
index eb5f45c90..337a2eb9d 100644
--- a/Library/Homebrew/cask/lib/hbc/cli/reinstall.rb
+++ b/Library/Homebrew/cask/lib/hbc/cli/reinstall.rb
@@ -2,28 +2,13 @@ module Hbc
class CLI
class Reinstall < Install
def install_casks
- count = 0
- args.each do |cask_token|
- begin
- cask = CaskLoader.load(cask_token)
-
- Installer.new(cask,
- binaries: binaries?,
- verbose: verbose?,
- force: force?,
- skip_cask_deps: skip_cask_deps?,
- require_sha: require_sha?).reinstall
-
- count += 1
- rescue CaskUnavailableError => e
- self.class.warn_unavailable_with_suggestion cask_token, e
- rescue CaskNoShasumError => e
- opoo e.message
- count += 1
- end
+ casks.each do |cask|
+ Installer.new(cask, binaries: binaries?,
+ verbose: verbose?,
+ force: force?,
+ skip_cask_deps: skip_cask_deps?,
+ require_sha: require_sha?).reinstall
end
-
- count.zero? ? nil : count == args.length
end
def self.help
diff --git a/Library/Homebrew/cask/lib/hbc/cli/search.rb b/Library/Homebrew/cask/lib/hbc/cli/search.rb
index b24091aef..9d1a16f15 100644
--- a/Library/Homebrew/cask/lib/hbc/cli/search.rb
+++ b/Library/Homebrew/cask/lib/hbc/cli/search.rb
@@ -1,10 +1,6 @@
module Hbc
class CLI
class Search < AbstractCommand
- def initialize(*args)
- @args = args
- end
-
def run
results = self.class.search(*args)
self.class.render_results(*results)
diff --git a/Library/Homebrew/cask/lib/hbc/cli/style.rb b/Library/Homebrew/cask/lib/hbc/cli/style.rb
index 97208232b..86fc98eaa 100644
--- a/Library/Homebrew/cask/lib/hbc/cli/style.rb
+++ b/Library/Homebrew/cask/lib/hbc/cli/style.rb
@@ -1,5 +1,3 @@
-require "English"
-
module Hbc
class CLI
class Style < AbstractCommand
@@ -33,7 +31,7 @@ module Hbc
elsif args.any? { |file| File.exist?(file) }
args
else
- args.map { |token| CaskLoader.path(token) }
+ casks.map(&:sourcefile_path)
end
end
diff --git a/Library/Homebrew/cask/lib/hbc/cli/uninstall.rb b/Library/Homebrew/cask/lib/hbc/cli/uninstall.rb
index 33ee5afa9..c0697c808 100644
--- a/Library/Homebrew/cask/lib/hbc/cli/uninstall.rb
+++ b/Library/Homebrew/cask/lib/hbc/cli/uninstall.rb
@@ -9,9 +9,12 @@ module Hbc
end
def run
- args.each do |cask_token|
- odebug "Uninstalling Cask #{cask_token}"
- cask = CaskLoader.load(cask_token)
+ raise CaskError, "Uninstall incomplete." if uninstall_casks == :incomplete
+ end
+
+ def uninstall_casks
+ casks.each do |cask|
+ odebug "Uninstalling Cask #{cask}"
raise CaskNotInstalledError, cask unless cask.installed? || force?
@@ -27,8 +30,8 @@ module Hbc
single = versions.count == 1
puts <<-EOS.undent
- #{cask_token} #{versions.join(", ")} #{single ? "is" : "are"} still installed.
- Remove #{single ? "it" : "them all"} with `brew cask uninstall --force #{cask_token}`.
+ #{cask} #{versions.join(", ")} #{single ? "is" : "are"} still installed.
+ Remove #{single ? "it" : "them all"} with `brew cask uninstall --force #{cask}`.
EOS
end
end
diff --git a/Library/Homebrew/cask/lib/hbc/cli/zap.rb b/Library/Homebrew/cask/lib/hbc/cli/zap.rb
index 3c07ff9e8..d12943106 100644
--- a/Library/Homebrew/cask/lib/hbc/cli/zap.rb
+++ b/Library/Homebrew/cask/lib/hbc/cli/zap.rb
@@ -7,9 +7,12 @@ module Hbc
end
def run
- args.each do |cask_token|
- odebug "Zapping Cask #{cask_token}"
- cask = CaskLoader.load(cask_token)
+ raise CaskError, "Zap incomplete." if zap_casks == :incomplete
+ end
+
+ def zap_casks
+ casks.each do |cask|
+ odebug "Zapping Cask #{cask}"
Installer.new(cask, verbose: verbose?).zap
end
end
diff --git a/Library/Homebrew/cask/lib/hbc/exceptions.rb b/Library/Homebrew/cask/lib/hbc/exceptions.rb
index b9d305a9b..d9e1b07db 100644
--- a/Library/Homebrew/cask/lib/hbc/exceptions.rb
+++ b/Library/Homebrew/cask/lib/hbc/exceptions.rb
@@ -3,56 +3,40 @@ module Hbc
class AbstractCaskErrorWithToken < CaskError
attr_reader :token
+ attr_reader :reason
- def initialize(token)
+ def initialize(token, reason = nil)
@token = token
+ @reason = reason.to_s
end
end
class CaskNotInstalledError < AbstractCaskErrorWithToken
def to_s
- "#{token} is not installed"
+ "Cask '#{token}' is not installed."
end
end
class CaskUnavailableError < AbstractCaskErrorWithToken
def to_s
- "No available Cask for #{token}"
+ "Cask '#{token}' is unavailable" << (reason.empty? ? "." : ": #{reason}")
end
end
class CaskAlreadyCreatedError < AbstractCaskErrorWithToken
def to_s
- %Q(A Cask for #{token} already exists. Run "brew cask cat #{token}" to see it.)
+ %Q(Cask '#{token}' already exists. Run #{Formatter.identifier("brew cask cat #{token}")} to edit it.)
end
end
class CaskAlreadyInstalledError < AbstractCaskErrorWithToken
def to_s
- s = <<-EOS.undent
- A Cask for #{token} is already installed.
- EOS
-
- s.concat("\n").concat(reinstall_message)
- end
-
- private
-
- def reinstall_message
<<-EOS.undent
- To re-install #{token}, run:
- brew cask reinstall #{token}
- EOS
- end
- end
+ Cask '#{token}' is already installed.
- class CaskAlreadyInstalledAutoUpdatesError < CaskAlreadyInstalledError
- def to_s
- s = <<-EOS.undent
- A Cask for #{token} is already installed and using auto-updates.
+ To re-install #{token}, run:
+ #{Formatter.identifier("brew cask reinstall #{token}")}
EOS
-
- s.concat("\n").concat(reinstall_message)
end
end
@@ -84,8 +68,8 @@ module Hbc
class CaskX11DependencyError < AbstractCaskErrorWithToken
def to_s
<<-EOS.undent
- #{token} requires XQuartz/X11, which can be installed using Homebrew-Cask by running
- brew cask install xquartz
+ Cask '#{token}' requires XQuartz/X11, which can be installed using Homebrew-Cask by running
+ #{Formatter.identifier("brew cask install xquartz")}
or manually, by downloading the package from
#{Formatter.url("https://www.xquartz.org/")}
@@ -101,60 +85,67 @@ module Hbc
class CaskUnspecifiedError < CaskError
def to_s
- "This command requires a Cask token"
+ "This command requires a Cask token."
end
end
class CaskInvalidError < AbstractCaskErrorWithToken
- attr_reader :submsg
- def initialize(token, *submsg)
- super(token)
- @submsg = submsg.join(" ")
- end
-
def to_s
- "Cask '#{token}' definition is invalid#{": #{submsg}" unless submsg.empty?}"
+ "Cask '#{token}' definition is invalid" << (reason.empty? ? ".": ": #{reason}")
end
end
- class CaskTokenDoesNotMatchError < CaskInvalidError
+ class CaskTokenMismatchError < CaskInvalidError
def initialize(token, header_token)
- super(token, "Bad header line: '#{header_token}' does not match file name")
+ super(token, "Token '#{header_token}' in header line does not match the file name.")
end
end
- class CaskSha256MissingError < ArgumentError
- end
+ class CaskSha256Error < AbstractCaskErrorWithToken
+ attr_reader :expected, :actual
- class CaskSha256MismatchError < RuntimeError
- attr_reader :path, :expected, :actual
- def initialize(path, expected, actual)
- @path = path
+ def initialize(token, expected = nil, actual = nil)
+ super(token)
@expected = expected
@actual = actual
end
+ end
+ class CaskSha256MissingError < CaskSha256Error
def to_s
<<-EOS.undent
- sha256 mismatch
- Expected: #{expected}
- Actual: #{actual}
- File: #{path}
- To retry an incomplete download, remove the file above.
+ Cask '#{token}' requires a checksum:
+ #{Formatter.identifier("sha256 '#{actual}'")}
EOS
end
end
- class CaskNoShasumError < CaskError
- attr_reader :token
- def initialize(token)
- @token = token
+ class CaskSha256MismatchError < CaskSha256Error
+ attr_reader :path
+
+ def initialize(token, expected, actual, path)
+ super(token, expected, actual)
+ @path = path
+ end
+
+ def to_s
+ <<-EOS.undent
+ Checksum for Cask '#{token}' does not match.
+
+ Expected: #{Formatter.success(expected.to_s)}
+ Actual: #{Formatter.error(actual.to_s)}
+ File: #{path}
+
+ To retry an incomplete download, remove the file above.
+ EOS
end
+ end
+ class CaskNoShasumError < CaskSha256Error
def to_s
<<-EOS.undent
Cask '#{token}' does not have a sha256 checksum defined and was not installed.
- This means you have the "--require-sha" option set, perhaps in your HOMEBREW_CASK_OPTS.
+ This means you have the #{Formatter.identifier("--require-sha")} option set, perhaps in your HOMEBREW_CASK_OPTS.
EOS
end
end
diff --git a/Library/Homebrew/cask/lib/hbc/installer.rb b/Library/Homebrew/cask/lib/hbc/installer.rb
index 7da9731e5..aa6d600f7 100644
--- a/Library/Homebrew/cask/lib/hbc/installer.rb
+++ b/Library/Homebrew/cask/lib/hbc/installer.rb
@@ -94,7 +94,6 @@ module Hbc
odebug "Hbc::Installer#install"
if @cask.installed? && !force? && !@reinstall
- raise CaskAlreadyInstalledAutoUpdatesError, @cask if @cask.auto_updates
raise CaskAlreadyInstalledError, @cask
end
@@ -143,7 +142,7 @@ module Hbc
def verify_has_sha
odebug "Checking cask has checksum"
return unless @cask.sha256 == :no_check
- raise CaskNoShasumError, @cask
+ raise CaskNoShasumError, @cask.token
end
def verify
diff --git a/Library/Homebrew/cask/lib/hbc/scopes.rb b/Library/Homebrew/cask/lib/hbc/scopes.rb
index 149c2c343..a469ae0fa 100644
--- a/Library/Homebrew/cask/lib/hbc/scopes.rb
+++ b/Library/Homebrew/cask/lib/hbc/scopes.rb
@@ -27,6 +27,7 @@ module Hbc
# TODO: speed up Hbc::Source::Tapped (main perf drag is calling Hbc.all_tokens repeatedly)
# TODO: ability to specify expected source when calling CaskLoader.load (minor perf benefit)
Pathname.glob(caskroom.join("*"))
+ .sort
.map do |caskroom_path|
token = caskroom_path.basename.to_s
diff --git a/Library/Homebrew/cask/lib/hbc/verify/checksum.rb b/Library/Homebrew/cask/lib/hbc/verify/checksum.rb
index d079a4446..620703d31 100644
--- a/Library/Homebrew/cask/lib/hbc/verify/checksum.rb
+++ b/Library/Homebrew/cask/lib/hbc/verify/checksum.rb
@@ -33,13 +33,13 @@ module Hbc
end
def verify_checksum
- raise CaskSha256MissingError, "sha256 required: sha256 '#{computed}'" if expected.nil? || expected.empty?
+ raise CaskSha256MissingError.new(cask.token, expected, computed) if expected.nil? || expected.empty?
if expected == computed
odebug "SHA256 checksums match"
else
ohai 'Note: running "brew update" may fix sha256 checksum errors'
- raise CaskSha256MismatchError.new(downloaded_path, expected, computed)
+ raise CaskSha256MismatchError.new(cask.token, expected, computed, downloaded_path)
end
end
end
diff --git a/Library/Homebrew/cmd/--repository.rb b/Library/Homebrew/cmd/--repository.rb
index 7a25aba1c..006d4cd5d 100644
--- a/Library/Homebrew/cmd/--repository.rb
+++ b/Library/Homebrew/cmd/--repository.rb
@@ -1,6 +1,5 @@
#: * `--repository`:
-#: Display where Homebrew's `.git` directory is located. For standard installs,
-#: the `prefix` and `repository` are the same directory.
+#: Display where Homebrew's `.git` directory is located.
#:
#: * `--repository` <user>`/`<repo>:
#: Display where tap <user>`/`<repo>'s directory is located.
diff --git a/Library/Homebrew/cmd/info.rb b/Library/Homebrew/cmd/info.rb
index 826f31bbd..98200a0b4 100644
--- a/Library/Homebrew/cmd/info.rb
+++ b/Library/Homebrew/cmd/info.rb
@@ -79,7 +79,7 @@ module Homebrew
def github_remote_path(remote, path)
if remote =~ %r{^(?:https?://|git(?:@|://))github\.com[:/](.+)/(.+?)(?:\.git)?$}
- "https://github.com/#{$1}/#{$2}/blob/master/#{path}"
+ "https://github.com/#{Regexp.last_match(1)}/#{Regexp.last_match(2)}/blob/master/#{path}"
else
"#{remote}/#{path}"
end
diff --git a/Library/Homebrew/cmd/install.rb b/Library/Homebrew/cmd/install.rb
index 423b47884..e413bac6f 100644
--- a/Library/Homebrew/cmd/install.rb
+++ b/Library/Homebrew/cmd/install.rb
@@ -80,7 +80,7 @@ module Homebrew
if name !~ HOMEBREW_TAP_FORMULA_REGEX && name !~ HOMEBREW_CASK_TAP_CASK_REGEX
next
end
- tap = Tap.fetch($1, $2)
+ tap = Tap.fetch(Regexp.last_match(1), Regexp.last_match(2))
tap.install unless tap.installed?
end
end
diff --git a/Library/Homebrew/cmd/reinstall.rb b/Library/Homebrew/cmd/reinstall.rb
index c625d2d97..f5d6437bd 100644
--- a/Library/Homebrew/cmd/reinstall.rb
+++ b/Library/Homebrew/cmd/reinstall.rb
@@ -34,7 +34,7 @@ module Homebrew
fi = FormulaInstaller.new(f)
fi.options = options
fi.invalid_option_names = build_options.invalid_option_names
- fi.build_bottle = ARGV.build_bottle? || (!f.bottled? && f.build.build_bottle?)
+ fi.build_bottle = ARGV.build_bottle? || (!f.bottled? && f.build.bottle?)
fi.build_from_source = ARGV.build_from_source? || ARGV.build_all_from_source?
fi.force_bottle = ARGV.force_bottle?
fi.interactive = ARGV.interactive?
@@ -66,6 +66,8 @@ module Homebrew
return unless path.directory?
+ Pathname.new(keg).rmtree if keg.exist?
+
path.rename keg
keg.link unless formula.keg_only?
end
diff --git a/Library/Homebrew/cmd/search.rb b/Library/Homebrew/cmd/search.rb
index 2b35dfc36..b2d069744 100644
--- a/Library/Homebrew/cmd/search.rb
+++ b/Library/Homebrew/cmd/search.rb
@@ -93,7 +93,7 @@ module Homebrew
def query_regexp(query)
case query
- when %r{^/(.*)/$} then Regexp.new($1)
+ when %r{^/(.*)/$} then Regexp.new(Regexp.last_match(1))
else /.*#{Regexp.escape(query)}.*/i
end
rescue RegexpError
diff --git a/Library/Homebrew/cmd/style.rb b/Library/Homebrew/cmd/style.rb
index 7da71749c..c6201e371 100644
--- a/Library/Homebrew/cmd/style.rb
+++ b/Library/Homebrew/cmd/style.rb
@@ -112,7 +112,7 @@ module Homebrew
args << "--display-cop-names" if ARGV.include? "--display-cop-names"
args << "--format" << "simple" if files
system(cache_env, "rubocop", *args)
- !$?.success?
+ !$CHILD_STATUS.success?
when :json
json, _, status = Open3.capture3(cache_env, "rubocop", "--format", "json", *args)
# exit status of 1 just means violations were found; other numbers mean
diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb
index aaac9c96b..0d9a630fd 100644
--- a/Library/Homebrew/dev-cmd/audit.rb
+++ b/Library/Homebrew/dev-cmd/audit.rb
@@ -195,12 +195,12 @@ class FormulaAuditor
@specs = %w[stable devel head].map { |s| formula.send(s) }.compact
end
- def self.check_http_content(url, user_agents: [:default])
+ def self.check_http_content(url, name, user_agents: [:default])
return unless url.start_with? "http"
details = nil
user_agent = nil
- hash_needed = url.start_with?("http:")
+ hash_needed = url.start_with?("http:") && name != "curl"
user_agents.each do |ua|
details = http_content_headers_and_checksum(url, hash_needed: hash_needed, user_agent: ua)
user_agent = ua
@@ -578,7 +578,7 @@ class FormulaAuditor
next unless o.name =~ /^with(out)?-(?:checks?|tests)$/
unless formula.deps.any? { |d| d.name == "check" && (d.optional? || d.recommended?) }
- problem "Use '--with#{$1}-test' instead of '--#{o.name}'. Migrate '--#{o.name}' with `deprecated_option`."
+ problem "Use '--with#{Regexp.last_match(1)}-test' instead of '--#{o.name}'. Migrate '--#{o.name}' with `deprecated_option`."
end
end
@@ -597,7 +597,8 @@ class FormulaAuditor
return unless DevelopmentTools.curl_handles_most_https_homepages?
if http_content_problem = FormulaAuditor.check_http_content(homepage,
- user_agents: [:browser, :default])
+ formula.name,
+ user_agents: [:browser, :default])
problem http_content_problem
end
end
@@ -721,7 +722,7 @@ class FormulaAuditor
stable = formula.stable
case stable && stable.url
when /[\d\._-](alpha|beta|rc\d)/
- matched = $1
+ matched = Regexp.last_match(1)
version_prefix = stable.version.to_s.sub(/\d+$/, "")
return if unstable_whitelist.include?([formula.name, version_prefix])
problem "Stable version URLs should not contain #{matched}"
@@ -836,7 +837,7 @@ class FormulaAuditor
when %r{https?://patch-diff\.githubusercontent\.com/raw/(.+)/(.+)/pull/(.+)\.(?:diff|patch)}
problem <<-EOS.undent
use GitHub pull request URLs:
- https://github.com/#{$1}/#{$2}/pull/#{$3}.patch
+ https://github.com/#{Regexp.last_match(1)}/#{Regexp.last_match(2)}/pull/#{Regexp.last_match(3)}.patch
Rather than patch-diff:
#{patch.url}
EOS
@@ -874,7 +875,7 @@ class FormulaAuditor
def line_problems(line, _lineno)
if line =~ /<(Formula|AmazonWebServicesFormula|ScriptFileFormula|GithubGistFormula)/
- problem "Use a space in class inheritance: class Foo < #{$1}"
+ problem "Use a space in class inheritance: class Foo < #{Regexp.last_match(1)}"
end
# Commented-out cmake support from default template
@@ -898,52 +899,52 @@ class FormulaAuditor
# FileUtils is included in Formula
# encfs modifies a file with this name, so check for some leading characters
if line =~ %r{[^'"/]FileUtils\.(\w+)}
- problem "Don't need 'FileUtils.' before #{$1}."
+ problem "Don't need 'FileUtils.' before #{Regexp.last_match(1)}."
end
# Check for long inreplace block vars
if line =~ /inreplace .* do \|(.{2,})\|/
- problem "\"inreplace <filenames> do |s|\" is preferred over \"|#{$1}|\"."
+ problem "\"inreplace <filenames> do |s|\" is preferred over \"|#{Regexp.last_match(1)}|\"."
end
# Check for string interpolation of single values.
if line =~ /(system|inreplace|gsub!|change_make_var!).*[ ,]"#\{([\w.]+)\}"/
- problem "Don't need to interpolate \"#{$2}\" with #{$1}"
+ problem "Don't need to interpolate \"#{Regexp.last_match(2)}\" with #{Regexp.last_match(1)}"
end
# Check for string concatenation; prefer interpolation
if line =~ /(#\{\w+\s*\+\s*['"][^}]+\})/
- problem "Try not to concatenate paths in string interpolation:\n #{$1}"
+ problem "Try not to concatenate paths in string interpolation:\n #{Regexp.last_match(1)}"
end
# Prefer formula path shortcuts in Pathname+
if line =~ %r{\(\s*(prefix\s*\+\s*(['"])(bin|include|libexec|lib|sbin|share|Frameworks)[/'"])}
- problem "\"(#{$1}...#{$2})\" should be \"(#{$3.downcase}+...)\""
+ problem "\"(#{Regexp.last_match(1)}...#{Regexp.last_match(2)})\" should be \"(#{Regexp.last_match(3).downcase}+...)\""
end
if line =~ /((man)\s*\+\s*(['"])(man[1-8])(['"]))/
- problem "\"#{$1}\" should be \"#{$4}\""
+ problem "\"#{Regexp.last_match(1)}\" should be \"#{Regexp.last_match(4)}\""
end
# Prefer formula path shortcuts in strings
if line =~ %r[(\#\{prefix\}/(bin|include|libexec|lib|sbin|share|Frameworks))]
- problem "\"#{$1}\" should be \"\#{#{$2.downcase}}\""
+ problem "\"#{Regexp.last_match(1)}\" should be \"\#{#{Regexp.last_match(2).downcase}}\""
end
if line =~ %r[((\#\{prefix\}/share/man/|\#\{man\}/)(man[1-8]))]
- problem "\"#{$1}\" should be \"\#{#{$3}}\""
+ problem "\"#{Regexp.last_match(1)}\" should be \"\#{#{Regexp.last_match(3)}}\""
end
if line =~ %r[((\#\{share\}/(man)))[/'"]]
- problem "\"#{$1}\" should be \"\#{#{$3}}\""
+ problem "\"#{Regexp.last_match(1)}\" should be \"\#{#{Regexp.last_match(3)}}\""
end
if line =~ %r[(\#\{prefix\}/share/(info|man))]
- problem "\"#{$1}\" should be \"\#{#{$2}}\""
+ problem "\"#{Regexp.last_match(1)}\" should be \"\#{#{Regexp.last_match(2)}}\""
end
if line =~ /depends_on :(automake|autoconf|libtool)/
- problem ":#{$1} is deprecated. Usage should be \"#{$1}\""
+ problem ":#{Regexp.last_match(1)} is deprecated. Usage should be \"#{Regexp.last_match(1)}\""
end
if line =~ /depends_on :apr/
@@ -953,23 +954,23 @@ class FormulaAuditor
problem ":tex is deprecated" if line =~ /depends_on :tex/
if line =~ /depends_on\s+['"](.+)['"]\s+=>\s+:(lua|perl|python|ruby)(\d*)/
- problem "#{$2} modules should be vendored rather than use deprecated `depends_on \"#{$1}\" => :#{$2}#{$3}`"
+ problem "#{Regexp.last_match(2)} modules should be vendored rather than use deprecated `depends_on \"#{Regexp.last_match(1)}\" => :#{Regexp.last_match(2)}#{Regexp.last_match(3)}`"
end
if line =~ /depends_on\s+['"](.+)['"]\s+=>\s+(.*)/
- dep = $1
- $2.split(" ").map do |o|
+ dep = Regexp.last_match(1)
+ Regexp.last_match(2).split(" ").map do |o|
break if ["if", "unless"].include?(o)
next unless o =~ /^\[?['"](.*)['"]/
- problem "Dependency #{dep} should not use option #{$1}"
+ problem "Dependency #{dep} should not use option #{Regexp.last_match(1)}"
end
end
# Commented-out depends_on
- problem "Commented-out dep #{$1}" if line =~ /#\s*depends_on\s+(.+)\s*$/
+ problem "Commented-out dep #{Regexp.last_match(1)}" if line =~ /#\s*depends_on\s+(.+)\s*$/
if line =~ /if\s+ARGV\.include\?\s+'--(HEAD|devel)'/
- problem "Use \"if build.#{$1.downcase}?\" instead"
+ problem "Use \"if build.#{Regexp.last_match(1).downcase}?\" instead"
end
problem "Use separate make calls" if line.include?("make && make")
@@ -982,15 +983,15 @@ class FormulaAuditor
# Avoid hard-coding compilers
if line =~ %r{(system|ENV\[.+\]\s?=)\s?['"](/usr/bin/)?(gcc|llvm-gcc|clang)['" ]}
- problem "Use \"\#{ENV.cc}\" instead of hard-coding \"#{$3}\""
+ problem "Use \"\#{ENV.cc}\" instead of hard-coding \"#{Regexp.last_match(3)}\""
end
if line =~ %r{(system|ENV\[.+\]\s?=)\s?['"](/usr/bin/)?((g|llvm-g|clang)\+\+)['" ]}
- problem "Use \"\#{ENV.cxx}\" instead of hard-coding \"#{$3}\""
+ problem "Use \"\#{ENV.cxx}\" instead of hard-coding \"#{Regexp.last_match(3)}\""
end
if line =~ /system\s+['"](env|export)(\s+|['"])/
- problem "Use ENV instead of invoking '#{$1}' to modify the environment"
+ problem "Use ENV instead of invoking '#{Regexp.last_match(1)}' to modify the environment"
end
if formula.name != "wine" && line =~ /ENV\.universal_binary/
@@ -1006,27 +1007,27 @@ class FormulaAuditor
end
if line =~ /build\.include\?[\s\(]+['"]\-\-(.*)['"]/
- problem "Reference '#{$1}' without dashes"
+ problem "Reference '#{Regexp.last_match(1)}' without dashes"
end
if line =~ /build\.include\?[\s\(]+['"]with(out)?-(.*)['"]/
- problem "Use build.with#{$1}? \"#{$2}\" instead of build.include? 'with#{$1}-#{$2}'"
+ problem "Use build.with#{Regexp.last_match(1)}? \"#{Regexp.last_match(2)}\" instead of build.include? 'with#{Regexp.last_match(1)}-#{Regexp.last_match(2)}'"
end
if line =~ /build\.with\?[\s\(]+['"]-?-?with-(.*)['"]/
- problem "Don't duplicate 'with': Use `build.with? \"#{$1}\"` to check for \"--with-#{$1}\""
+ problem "Don't duplicate 'with': Use `build.with? \"#{Regexp.last_match(1)}\"` to check for \"--with-#{Regexp.last_match(1)}\""
end
if line =~ /build\.without\?[\s\(]+['"]-?-?without-(.*)['"]/
- problem "Don't duplicate 'without': Use `build.without? \"#{$1}\"` to check for \"--without-#{$1}\""
+ problem "Don't duplicate 'without': Use `build.without? \"#{Regexp.last_match(1)}\"` to check for \"--without-#{Regexp.last_match(1)}\""
end
if line =~ /unless build\.with\?(.*)/
- problem "Use if build.without?#{$1} instead of unless build.with?#{$1}"
+ problem "Use if build.without?#{Regexp.last_match(1)} instead of unless build.with?#{Regexp.last_match(1)}"
end
if line =~ /unless build\.without\?(.*)/
- problem "Use if build.with?#{$1} instead of unless build.without?#{$1}"
+ problem "Use if build.with?#{Regexp.last_match(1)} instead of unless build.without?#{Regexp.last_match(1)}"
end
if line =~ /(not\s|!)\s*build\.with?\?/
@@ -1070,7 +1071,7 @@ class FormulaAuditor
end
if line =~ /^def (\w+).*$/
- problem "Define method #{$1.inspect} in the class body, not at the top-level"
+ problem "Define method #{Regexp.last_match(1).inspect} in the class body, not at the top-level"
end
if line.include?("ENV.fortran") && !formula.requirements.map(&:class).include?(FortranRequirement)
@@ -1082,20 +1083,20 @@ class FormulaAuditor
end
if line =~ /depends_on :(.+) (if.+|unless.+)$/
- conditional_dep_problems($1.to_sym, $2, $&)
+ conditional_dep_problems(Regexp.last_match(1).to_sym, Regexp.last_match(2), $&)
end
if line =~ /depends_on ['"](.+)['"] (if.+|unless.+)$/
- conditional_dep_problems($1, $2, $&)
+ conditional_dep_problems(Regexp.last_match(1), Regexp.last_match(2), $&)
end
if line =~ /(Dir\[("[^\*{},]+")\])/
- problem "#{$1} is unnecessary; just use #{$2}"
+ problem "#{Regexp.last_match(1)} is unnecessary; just use #{Regexp.last_match(2)}"
end
if line =~ /system (["'](#{FILEUTILS_METHODS})["' ])/o
- system = $1
- method = $2
+ system = Regexp.last_match(1)
+ method = Regexp.last_match(2)
problem "Use the `#{method}` Ruby method instead of `system #{system}`"
end
@@ -1113,7 +1114,7 @@ class FormulaAuditor
end
if line =~ /system\s+['"](otool|install_name_tool|lipo)/ && formula.name != "cctools"
- problem "Use ruby-macho instead of calling #{$1}"
+ problem "Use ruby-macho instead of calling #{Regexp.last_match(1)}"
end
if formula.tap.to_s == "homebrew/core"
@@ -1124,29 +1125,29 @@ class FormulaAuditor
end
if line =~ /((revision|version_scheme)\s+0)/
- problem "'#{$1}' should be removed"
+ problem "'#{Regexp.last_match(1)}' should be removed"
end
return unless @strict
- problem "`#{$1}` in formulae is deprecated" if line =~ /(env :(std|userpaths))/
+ problem "`#{Regexp.last_match(1)}` in formulae is deprecated" if line =~ /(env :(std|userpaths))/
if line =~ /system ((["'])[^"' ]*(?:\s[^"' ]*)+\2)/
- bad_system = $1
+ bad_system = Regexp.last_match(1)
unless %w[| < > & ; *].any? { |c| bad_system.include? c }
good_system = bad_system.gsub(" ", "\", \"")
problem "Use `system #{good_system}` instead of `system #{bad_system}` "
end
end
- problem "`#{$1}` is now unnecessary" if line =~ /(require ["']formula["'])/
+ problem "`#{Regexp.last_match(1)}` is now unnecessary" if line =~ /(require ["']formula["'])/
if line =~ %r{#\{share\}/#{Regexp.escape(formula.name)}[/'"]}
problem "Use \#{pkgshare} instead of \#{share}/#{formula.name}"
end
return unless line =~ %r{share(\s*[/+]\s*)(['"])#{Regexp.escape(formula.name)}(?:\2|/)}
- problem "Use pkgshare instead of (share#{$1}\"#{formula.name}\")"
+ problem "Use pkgshare instead of (share#{Regexp.last_match(1)}\"#{formula.name}\")"
end
def audit_reverse_migration
@@ -1296,7 +1297,7 @@ class ResourceAuditor
def audit_download_strategy
if url =~ %r{^(cvs|bzr|hg|fossil)://} || url =~ %r{^(svn)\+http://}
- problem "Use of the #{$&} scheme is deprecated, pass `:using => :#{$1}` instead"
+ problem "Use of the #{$&} scheme is deprecated, pass `:using => :#{Regexp.last_match(1)}` instead"
end
url_strategy = DownloadStrategyDetector.detect(url)
@@ -1340,7 +1341,7 @@ class ResourceAuditor
def audit_urls
# Check GNU urls; doesn't apply to mirrors
if url =~ %r{^(?:https?|ftp)://ftpmirror.gnu.org/(.*)}
- problem "Please use \"https://ftp.gnu.org/gnu/#{$1}\" instead of #{url}."
+ problem "Please use \"https://ftp.gnu.org/gnu/#{Regexp.last_match(1)}\" instead of #{url}."
end
if mirrors.include?(url)
@@ -1374,11 +1375,11 @@ class ResourceAuditor
%r{^http://(?:[^/]*\.)?mirrorservice\.org/}
problem "Please use https:// for #{p}"
when %r{^http://search\.mcpan\.org/CPAN/(.*)}i
- problem "#{p} should be `https://cpan.metacpan.org/#{$1}`"
+ problem "#{p} should be `https://cpan.metacpan.org/#{Regexp.last_match(1)}`"
when %r{^(http|ftp)://ftp\.gnome\.org/pub/gnome/(.*)}i
- problem "#{p} should be `https://download.gnome.org/#{$2}`"
+ problem "#{p} should be `https://download.gnome.org/#{Regexp.last_match(2)}`"
when %r{^git://anonscm\.debian\.org/users/(.*)}i
- problem "#{p} should be `https://anonscm.debian.org/git/users/#{$1}`"
+ problem "#{p} should be `https://anonscm.debian.org/git/users/#{Regexp.last_match(1)}`"
end
end
@@ -1388,7 +1389,7 @@ class ResourceAuditor
when %r{^ftp://ftp\.mirrorservice\.org}
problem "Please use https:// for #{p}"
when %r{^ftp://ftp\.cpan\.org/pub/CPAN(.*)}i
- problem "#{p} should be `http://search.cpan.org/CPAN#{$1}`"
+ problem "#{p} should be `http://search.cpan.org/CPAN#{Regexp.last_match(1)}`"
end
end
@@ -1402,7 +1403,7 @@ class ResourceAuditor
next unless p =~ %r{^https?://.*\b(sourceforge|sf)\.(com|net)}
if p =~ /(\?|&)use_mirror=/
- problem "Don't use #{$1}use_mirror in SourceForge urls (url is #{p})."
+ problem "Don't use #{Regexp.last_match(1)}use_mirror in SourceForge urls (url is #{p})."
end
if p.end_with?("/download")
@@ -1432,7 +1433,7 @@ class ResourceAuditor
problem <<-EOS.undent
Please use a secure mirror for Debian URLs.
We recommend:
- https://mirrors.ocf.berkeley.edu/debian/#{$1}
+ https://mirrors.ocf.berkeley.edu/debian/#{Regexp.last_match(1)}
EOS
end
@@ -1485,7 +1486,7 @@ class ResourceAuditor
next unless u =~ %r{https?://codeload\.github\.com/(.+)/(.+)/(?:tar\.gz|zip)/(.+)}
problem <<-EOS.undent
use GitHub archive URLs:
- https://github.com/#{$1}/#{$2}/archive/#{$3}.tar.gz
+ https://github.com/#{Regexp.last_match(1)}/#{Regexp.last_match(2)}/archive/#{Regexp.last_match(3)}.tar.gz
Rather than codeload:
#{u}
EOS
@@ -1494,14 +1495,18 @@ class ResourceAuditor
# Check for Maven Central urls, prefer HTTPS redirector over specific host
urls.each do |u|
next unless u =~ %r{https?://(?:central|repo\d+)\.maven\.org/maven2/(.+)$}
- problem "#{u} should be `https://search.maven.org/remotecontent?filepath=#{$1}`"
+ problem "#{u} should be `https://search.maven.org/remotecontent?filepath=#{Regexp.last_match(1)}`"
+ end
+
+ if name == "curl" && !urls.find { |u| u.start_with?("http://") }
+ problem "should always include at least one HTTP url"
end
# Check pypi urls
if @strict
urls.each do |p|
next unless p =~ %r{^https?://pypi.python.org/(.*)}
- problem "#{p} should be `https://files.pythonhosted.org/#{$1}`"
+ problem "#{p} should be `https://files.pythonhosted.org/#{Regexp.last_match(1)}`"
end
end
@@ -1514,7 +1519,7 @@ class ResourceAuditor
# A `brew mirror`'ed URL is usually not yet reachable at the time of
# pull request.
next if url =~ %r{^https://dl.bintray.com/homebrew/mirror/}
- if http_content_problem = FormulaAuditor.check_http_content(url)
+ if http_content_problem = FormulaAuditor.check_http_content(url, name)
problem http_content_problem
end
elsif strategy <= GitDownloadStrategy
diff --git a/Library/Homebrew/dev-cmd/bump-formula-pr.rb b/Library/Homebrew/dev-cmd/bump-formula-pr.rb
index 684843d0d..586eec47c 100644
--- a/Library/Homebrew/dev-cmd/bump-formula-pr.rb
+++ b/Library/Homebrew/dev-cmd/bump-formula-pr.rb
@@ -265,10 +265,10 @@ module Homebrew
failed_audit = false
if ARGV.include? "--strict"
system HOMEBREW_BREW_FILE, "audit", "--strict", formula.path
- failed_audit = !$?.success?
+ failed_audit = !$CHILD_STATUS.success?
elsif ARGV.include? "--audit"
system HOMEBREW_BREW_FILE, "audit", formula.path
- failed_audit = !$?.success?
+ failed_audit = !$CHILD_STATUS.success?
end
if failed_audit
formula.path.atomic_write(backup_file)
diff --git a/Library/Homebrew/dev-cmd/create.rb b/Library/Homebrew/dev-cmd/create.rb
index 908f65f8f..802e7b900 100644
--- a/Library/Homebrew/dev-cmd/create.rb
+++ b/Library/Homebrew/dev-cmd/create.rb
@@ -101,13 +101,13 @@ class FormulaCreator
if @name.nil?
case url
when %r{github\.com/(\S+)/(\S+)\.git}
- @user = $1
- @name = $2
+ @user = Regexp.last_match(1)
+ @name = Regexp.last_match(2)
@head = true
@github = true
when %r{github\.com/(\S+)/(\S+)/(archive|releases)/}
- @user = $1
- @name = $2
+ @user = Regexp.last_match(1)
+ @name = Regexp.last_match(2)
@github = true
else
@name = path.basename.to_s[/(.*?)[-_.]?#{Regexp.escape(path.version.to_s)}/, 1]
@@ -226,9 +226,9 @@ class FormulaCreator
test do
# `test do` will create, run in and delete a temporary directory.
#
- # This test will fail and we won't accept that! It's enough to just replace
- # "false" with the main program this formula installs, but it'd be nice if you
- # were more thorough. Run the test with `brew test #{name}`. Options passed
+ # This test will fail and we won't accept that! For Homebrew/homebrew-core
+ # this will need to be a test that verifies the functionality of the
+ # software. Run the test with `brew test #{name}`. Options passed
# to `brew install` such as `--HEAD` also need to be provided to `brew test`.
#
# The installed folder is not in the path, so use the entire path to any
diff --git a/Library/Homebrew/dev-cmd/edit.rb b/Library/Homebrew/dev-cmd/edit.rb
index b3a319088..b1e485fe2 100644
--- a/Library/Homebrew/dev-cmd/edit.rb
+++ b/Library/Homebrew/dev-cmd/edit.rb
@@ -21,8 +21,8 @@ module Homebrew
# If no brews are listed, open the project root in an editor.
if ARGV.named.empty?
editor = File.basename which_editor
- if ["mate", "subl"].include?(editor)
- # If the user is using TextMate or Sublime Text,
+ if ["atom", "subl", "mate"].include?(editor)
+ # If the user is using Atom, Sublime Text or TextMate
# give a nice project view instead.
exec_editor HOMEBREW_REPOSITORY/"bin/brew",
HOMEBREW_REPOSITORY/"README.md",
diff --git a/Library/Homebrew/dev-cmd/man.rb b/Library/Homebrew/dev-cmd/man.rb
index 4e5103910..7ca22575f 100644
--- a/Library/Homebrew/dev-cmd/man.rb
+++ b/Library/Homebrew/dev-cmd/man.rb
@@ -87,7 +87,7 @@ module Homebrew
date = if ARGV.include?("--fail-if-changed") &&
target.extname == ".1" && target.exist?
/"(\d{1,2})" "([A-Z][a-z]+) (\d{4})" "#{organisation}" "#{manual}"/ =~ target.read
- Date.parse("#{$1} #{$2} #{$3}")
+ Date.parse("#{Regexp.last_match(1)} #{Regexp.last_match(2)} #{Regexp.last_match(3)}")
else
Date.today
end
diff --git a/Library/Homebrew/dev-cmd/pull.rb b/Library/Homebrew/dev-cmd/pull.rb
index 492898a47..9681bb2bc 100644
--- a/Library/Homebrew/dev-cmd/pull.rb
+++ b/Library/Homebrew/dev-cmd/pull.rb
@@ -347,7 +347,7 @@ module Homebrew
formulae = []
others = []
File.foreach(patchfile) do |line|
- files << $1 if line =~ %r{^\+\+\+ b/(.*)}
+ files << Regexp.last_match(1) if line =~ %r{^\+\+\+ b/(.*)}
end
files.each do |file|
if tap && tap.formula_file?(file)
@@ -459,7 +459,7 @@ module Homebrew
def self.lookup(name)
json = Utils.popen_read(HOMEBREW_BREW_FILE, "info", "--json=v1", name)
- return nil unless $?.success?
+ return nil unless $CHILD_STATUS.success?
Homebrew.force_utf8!(json)
FormulaInfoFromJson.new(JSON.parse(json)[0])
diff --git a/Library/Homebrew/dev-cmd/release-notes.rb b/Library/Homebrew/dev-cmd/release-notes.rb
index bd6363865..e578869bf 100644
--- a/Library/Homebrew/dev-cmd/release-notes.rb
+++ b/Library/Homebrew/dev-cmd/release-notes.rb
@@ -33,7 +33,7 @@ module Homebrew
if ARGV.include?("--markdown")
output.map! do |s|
/(.*\d)+ \(@(.+)\) - (.*)/ =~ s
- "- [#{$3}](#{$1}) (@#{$2})"
+ "- [#{Regexp.last_match(3)}](#{Regexp.last_match(1)}) (@#{Regexp.last_match(2)})"
end
end
diff --git a/Library/Homebrew/dev-cmd/tests.rb b/Library/Homebrew/dev-cmd/tests.rb
index 13f4d7b1e..658f2e2f3 100644
--- a/Library/Homebrew/dev-cmd/tests.rb
+++ b/Library/Homebrew/dev-cmd/tests.rb
@@ -12,10 +12,8 @@
#: If `--no-compat` is passed, do not load the compatibility layer when
#: running tests.
#:
-#: If `--online` is passed, include tests that use the GitHub API.
-#:
-#: If `--official-cmd-taps` is passed, include tests that use any of the
-#: taps for official external commands.
+#: If `--online` is passed, include tests that use the GitHub API and tests
+#: that use any of the taps for official external commands.
require "fileutils"
require "tap"
@@ -40,10 +38,6 @@ module Homebrew
ENV["HOMEBREW_NO_GITHUB_API"] = "1"
end
- if ARGV.include? "--official-cmd-taps"
- ENV["HOMEBREW_TEST_OFFICIAL_CMD_TAPS"] = "1"
- end
-
if ARGV.include? "--coverage"
ENV["HOMEBREW_TESTS_COVERAGE"] = "1"
FileUtils.rm_f "test/coverage/.resultset.json"
@@ -117,7 +111,7 @@ module Homebrew
system "bundle", "exec", "rspec", *args, "--", *files
end
- return if $?.success?
+ return if $CHILD_STATUS.success?
Homebrew.failed = true
end
end
diff --git a/Library/Homebrew/diagnostic.rb b/Library/Homebrew/diagnostic.rb
index 2741184cc..05e48da21 100644
--- a/Library/Homebrew/diagnostic.rb
+++ b/Library/Homebrew/diagnostic.rb
@@ -49,7 +49,7 @@ module Homebrew
case line.chomp
# regex matches: /dev/disk0s2 489562928 440803616 48247312 91% /
when /^.+\s+[0-9]+\s+[0-9]+\s+[0-9]+\s+[0-9]{1,3}%\s+(.+)/
- vols << $1
+ vols << Regexp.last_match(1)
end
end
end
@@ -740,7 +740,7 @@ module Homebrew
Unless you have compelling reasons, consider setting the
origin remote to point at the main repository by running:
- git -C "#{HOMEBREW_REPOSITORY}" remote add origin #{Formatter.url("https://github.com/Homebrew/brew.git")}
+ git -C "#{HOMEBREW_REPOSITORY}" remote set-url origin #{Formatter.url("https://github.com/Homebrew/brew.git")}
EOS
end
end
@@ -769,7 +769,7 @@ module Homebrew
Unless you have compelling reasons, consider setting the
origin remote to point at the main repository by running:
- git -C "#{coretap_path}" remote add origin #{Formatter.url("https://github.com/Homebrew/homebrew-core.git")}
+ git -C "#{coretap_path}" remote set-url origin #{Formatter.url("https://github.com/Homebrew/homebrew-core.git")}
EOS
end
end
@@ -919,11 +919,11 @@ module Homebrew
return unless which "python"
`python -V 2>&1` =~ /Python (\d+)\./
# This won't be the right warning if we matched nothing at all
- return if $1.nil?
- return if $1 == "2"
+ return if Regexp.last_match(1).nil?
+ return if Regexp.last_match(1) == "2"
<<-EOS.undent
- python is symlinked to python#{$1}
+ python is symlinked to python#{Regexp.last_match(1)}
This will confuse build scripts and in general lead to subtle breakage.
EOS
end
diff --git a/Library/Homebrew/download_strategy.rb b/Library/Homebrew/download_strategy.rb
index 9ca30bb9c..78f6c1e28 100644
--- a/Library/Homebrew/download_strategy.rb
+++ b/Library/Homebrew/download_strategy.rb
@@ -338,7 +338,7 @@ class CurlDownloadStrategy < AbstractFileDownloadStrategy
rescue ErrorDuringExecution
# 33 == range not supported
# try wiping the incomplete download and retrying once
- unless $?.exitstatus == 33 && had_incomplete_download
+ unless $CHILD_STATUS.exitstatus == 33 && had_incomplete_download
raise CurlDownloadStrategyError, @url
end
@@ -517,8 +517,8 @@ class S3DownloadStrategy < CurlDownloadStrategy
if @url !~ %r{^https?://([^.].*)\.s3\.amazonaws\.com/(.+)$}
raise "Bad S3 URL: " + @url
end
- bucket = $1
- key = $2
+ bucket = Regexp.last_match(1)
+ key = Regexp.last_match(2)
ENV["AWS_ACCESS_KEY_ID"] = ENV["HOMEBREW_AWS_ACCESS_KEY_ID"]
ENV["AWS_SECRET_ACCESS_KEY"] = ENV["HOMEBREW_AWS_SECRET_ACCESS_KEY"]
diff --git a/Library/Homebrew/exceptions.rb b/Library/Homebrew/exceptions.rb
index 488ef7064..23a123c44 100644
--- a/Library/Homebrew/exceptions.rb
+++ b/Library/Homebrew/exceptions.rb
@@ -182,7 +182,7 @@ class TapFormulaAmbiguityError < RuntimeError
@paths = paths
@formulae = paths.map do |path|
path.to_s =~ HOMEBREW_TAP_PATH_REGEX
- "#{Tap.fetch($1, $2)}/#{path.basename(".rb")}"
+ "#{Tap.fetch(Regexp.last_match(1), Regexp.last_match(2))}/#{path.basename(".rb")}"
end
super <<-EOS.undent
@@ -202,7 +202,7 @@ class TapFormulaWithOldnameAmbiguityError < RuntimeError
@taps = possible_tap_newname_formulae.map do |newname|
newname =~ HOMEBREW_TAP_FORMULA_REGEX
- "#{$1}/#{$2}"
+ "#{Regexp.last_match(1)}/#{Regexp.last_match(2)}"
end
super <<-EOS.undent
@@ -352,6 +352,7 @@ end
class BuildError < RuntimeError
attr_reader :formula, :env
+ attr_accessor :options
def initialize(formula, cmd, args, env)
@formula = formula
@@ -503,7 +504,7 @@ class CurlDownloadStrategyError < RuntimeError
def initialize(url)
case url
when %r{^file://(.+)}
- super "File does not exist: #{$1}"
+ super "File does not exist: #{Regexp.last_match(1)}"
else
super "Download failed: #{url}"
end
diff --git a/Library/Homebrew/extend/ENV/std.rb b/Library/Homebrew/extend/ENV/std.rb
index 4a871f9bb..a2e800803 100644
--- a/Library/Homebrew/extend/ENV/std.rb
+++ b/Library/Homebrew/extend/ENV/std.rb
@@ -200,7 +200,7 @@ module Stdenv
# @private
def set_cpu_flags(flags, default = DEFAULT_FLAGS, map = Hardware::CPU.optimization_flags)
cflags =~ /(-Xarch_#{Hardware::CPU.arch_32_bit} )-march=/
- xarch = $1.to_s
+ xarch = Regexp.last_match(1).to_s
remove flags, /(-Xarch_#{Hardware::CPU.arch_32_bit} )?-march=\S*/
remove flags, /( -Xclang \S+)+/
remove flags, /-mssse3/
diff --git a/Library/Homebrew/extend/ENV/super.rb b/Library/Homebrew/extend/ENV/super.rb
index ef41161af..692fd3623 100644
--- a/Library/Homebrew/extend/ENV/super.rb
+++ b/Library/Homebrew/extend/ENV/super.rb
@@ -266,7 +266,7 @@ module Superenv
def make_jobs
self["MAKEFLAGS"] =~ /-\w*j(\d+)/
- [$1.to_i, 1].max
+ [Regexp.last_match(1).to_i, 1].max
end
def universal_binary
diff --git a/Library/Homebrew/extend/os/mac/diagnostic.rb b/Library/Homebrew/extend/os/mac/diagnostic.rb
index 58d8c633d..0cdd7b115 100644
--- a/Library/Homebrew/extend/os/mac/diagnostic.rb
+++ b/Library/Homebrew/extend/os/mac/diagnostic.rb
@@ -195,7 +195,8 @@ module Homebrew
end
def check_ruby_version
- return if RUBY_VERSION[/\d\.\d/] == "2.0"
+ ruby_version = "2.0"
+ return if RUBY_VERSION[/\d\.\d/] == ruby_version
<<-EOS.undent
Ruby version #{RUBY_VERSION} is unsupported on #{MacOS.version}. Homebrew
@@ -270,7 +271,7 @@ module Homebrew
def check_xcode_license_approved
# If the user installs Xcode-only, they have to approve the
# license or no "xc*" tool will work.
- return unless `/usr/bin/xcrun clang 2>&1` =~ /license/ && !$?.success?
+ return unless `/usr/bin/xcrun clang 2>&1` =~ /license/ && !$CHILD_STATUS.success?
<<-EOS.undent
You have not agreed to the Xcode license.
diff --git a/Library/Homebrew/extend/os/mac/requirements/java_requirement.rb b/Library/Homebrew/extend/os/mac/requirements/java_requirement.rb
index da2dffba0..2f132d740 100644
--- a/Library/Homebrew/extend/os/mac/requirements/java_requirement.rb
+++ b/Library/Homebrew/extend/os/mac/requirements/java_requirement.rb
@@ -23,7 +23,7 @@ class JavaRequirement < Requirement
args = %w[--failfast]
args << "--version" << @version.to_s if @version
java_home = Utils.popen_read("/usr/libexec/java_home", *args).chomp
- return nil unless $?.success?
+ return nil unless $CHILD_STATUS.success?
Pathname.new(java_home)/"bin/java"
end
diff --git a/Library/Homebrew/extend/os/mac/utils/bottles.rb b/Library/Homebrew/extend/os/mac/utils/bottles.rb
index c54e4e5b7..03980aab0 100644
--- a/Library/Homebrew/extend/os/mac/utils/bottles.rb
+++ b/Library/Homebrew/extend/os/mac/utils/bottles.rb
@@ -32,7 +32,7 @@ module Utils
# :tiger_g4, :tiger_g5, etc.
def find_altivec_tag(tag)
return unless tag.to_s =~ /(\w+)_(g4|g4e|g5)$/
- altivec_tag = "#{$1}_altivec".to_sym
+ altivec_tag = "#{Regexp.last_match(1)}_altivec".to_sym
altivec_tag if key?(altivec_tag)
end
diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb
index d9254d23d..d64191b66 100644
--- a/Library/Homebrew/formula.rb
+++ b/Library/Homebrew/formula.rb
@@ -177,7 +177,7 @@ class Formula
@tap = if path == Formulary.core_path(name)
CoreTap.instance
elsif path.to_s =~ HOMEBREW_TAP_PATH_REGEX
- Tap.fetch($1, $2)
+ Tap.fetch(Regexp.last_match(1), Regexp.last_match(2))
end
@full_name = full_name_with_optional_tap(name)
@@ -1836,7 +1836,7 @@ class Formula
$stdout.flush
- unless $?.success?
+ unless $CHILD_STATUS.success?
log_lines = ENV["HOMEBREW_FAIL_LOG_LINES"]
log_lines ||= "15"
diff --git a/Library/Homebrew/formula_assertions.rb b/Library/Homebrew/formula_assertions.rb
index 477782e53..047b40abc 100644
--- a/Library/Homebrew/formula_assertions.rb
+++ b/Library/Homebrew/formula_assertions.rb
@@ -27,7 +27,7 @@ module Homebrew
def shell_output(cmd, result = 0)
ohai cmd
output = `#{cmd}`
- assert_equal result, $?.exitstatus
+ assert_equal result, $CHILD_STATUS.exitstatus
output
end
@@ -40,7 +40,7 @@ module Homebrew
pipe.close_write
pipe.read
end
- assert_equal result, $?.exitstatus unless result.nil?
+ assert_equal result, $CHILD_STATUS.exitstatus unless result.nil?
output
end
end
diff --git a/Library/Homebrew/formula_installer.rb b/Library/Homebrew/formula_installer.rb
index fa3096542..2a5120342 100644
--- a/Library/Homebrew/formula_installer.rb
+++ b/Library/Homebrew/formula_installer.rb
@@ -261,24 +261,17 @@ class FormulaInstaller
opoo "#{formula.full_name}: this formula has no #{option} option so it will be ignored!"
end
- options = []
- if formula.head?
- options << "--HEAD"
- elsif formula.devel?
- options << "--devel"
+ options = display_options(formula)
+ if show_header?
+ oh1 "Installing #{Formatter.identifier(formula.full_name)} #{options}".strip
end
- options += effective_build_options_for(formula).used_options.to_a
- oh1 "Installing #{Formatter.identifier(formula.full_name)} #{options.join " "}" if show_header?
if formula.tap && !formula.tap.private?
- category = "install"
- action = ([formula.full_name] + options).join(" ")
- Utils::Analytics.report_event(category, action)
+ action = "#{formula.full_name} #{options}".strip
+ Utils::Analytics.report_event("install", action)
if installed_on_request
- category = "install_on_request"
- action = ([formula.full_name] + options).join(" ")
- Utils::Analytics.report_event(category, action)
+ Utils::Analytics.report_event("install_on_request", action)
end
end
@@ -478,6 +471,18 @@ class FormulaInstaller
BuildOptions.new(args, dependent.options)
end
+ def display_options(formula)
+ options = []
+ if formula.head?
+ options << "--HEAD"
+ elsif formula.devel?
+ options << "--devel"
+ end
+ options += effective_build_options_for(formula).used_options.to_a
+ return if options.empty?
+ options.join(" ")
+ end
+
def inherited_options_for(dep)
inherited_options = Options.new
u = Option.new("universal")
@@ -680,7 +685,8 @@ class FormulaInstaller
if !formula.prefix.directory? || Keg.new(formula.prefix).empty_installation?
raise "Empty installation"
end
- rescue Exception
+ rescue Exception => e
+ e.options = display_options(formula) if e.is_a?(BuildError)
ignore_interrupts do
# any exceptions must leave us with nothing installed
formula.update_head_version
diff --git a/Library/Homebrew/formulary.rb b/Library/Homebrew/formulary.rb
index 446d5dc10..a0ccb9ba0 100644
--- a/Library/Homebrew/formulary.rb
+++ b/Library/Homebrew/formulary.rb
@@ -59,7 +59,7 @@ module Formulary
def self.class_s(name)
class_name = name.capitalize
- class_name.gsub!(/[-_.\s]([a-zA-Z0-9])/) { $1.upcase }
+ class_name.gsub!(/[-_.\s]([a-zA-Z0-9])/) { Regexp.last_match(1).upcase }
class_name.tr!("+", "x")
class_name.sub!(/(.)@(\d)/, "\\1AT\\2")
class_name
@@ -96,7 +96,7 @@ module Formulary
private
def load_file
- $stderr.puts "#{$0} (#{self.class.name}): loading #{path}" if ARGV.debug?
+ $stderr.puts "#{$PROGRAM_NAME} (#{self.class.name}): loading #{path}" if ARGV.debug?
raise FormulaUnavailableError, name unless path.file?
Formulary.load_formula_from_path(name, path)
end
@@ -168,7 +168,7 @@ module Formulary
super
rescue MethodDeprecatedError => e
if url =~ %r{github.com/([\w-]+)/homebrew-([\w-]+)/}
- e.issues_url = "https://github.com/#{$1}/homebrew-#{$2}/issues/new"
+ e.issues_url = "https://github.com/#{Regexp.last_match(1)}/homebrew-#{Regexp.last_match(2)}/issues/new"
end
raise
end
@@ -258,7 +258,7 @@ module Formulary
end
def klass
- $stderr.puts "#{$0} (#{self.class.name}): loading #{path}" if ARGV.debug?
+ $stderr.puts "#{$PROGRAM_NAME} (#{self.class.name}): loading #{path}" if ARGV.debug?
namespace = "FormulaNamespace#{Digest::MD5.hexdigest(contents)}"
Formulary.load_formula(name, path, contents, namespace)
end
diff --git a/Library/Homebrew/global.rb b/Library/Homebrew/global.rb
index 877253072..f36b01874 100644
--- a/Library/Homebrew/global.rb
+++ b/Library/Homebrew/global.rb
@@ -12,6 +12,7 @@ require "set"
require "rbconfig"
require "official_taps"
require "pp"
+require "English"
ARGV.extend(HomebrewArgvExtension)
diff --git a/Library/Homebrew/language/node.rb b/Library/Homebrew/language/node.rb
index b9abaea54..47431e8e5 100644
--- a/Library/Homebrew/language/node.rb
+++ b/Library/Homebrew/language/node.rb
@@ -11,7 +11,7 @@ module Language
# directory, consequently breaking that assumption. We require a tarball
# because npm install creates a "real" installation when fed a tarball.
output = Utils.popen_read("npm pack").chomp
- raise "npm failed to pack #{Dir.pwd}" unless $?.exitstatus.zero?
+ raise "npm failed to pack #{Dir.pwd}" unless $CHILD_STATUS.exitstatus.zero?
output
end
diff --git a/Library/Homebrew/os/mac.rb b/Library/Homebrew/os/mac.rb
index bc384da30..5074665fc 100644
--- a/Library/Homebrew/os/mac.rb
+++ b/Library/Homebrew/os/mac.rb
@@ -207,6 +207,8 @@ module OS
"8.3" => { clang: "8.1", clang_build: 802 },
"8.3.1" => { clang: "8.1", clang_build: 802 },
"8.3.2" => { clang: "8.1", clang_build: 802 },
+ "8.3.3" => { clang: "8.1", clang_build: 802 },
+ "9.0" => { clang: "9.0", clang_build: 900 },
}.freeze
def compilers_standard?
diff --git a/Library/Homebrew/os/mac/pkgconfig/10.13/libcurl.pc b/Library/Homebrew/os/mac/pkgconfig/10.13/libcurl.pc
new file mode 100644
index 000000000..91c69df6e
--- /dev/null
+++ b/Library/Homebrew/os/mac/pkgconfig/10.13/libcurl.pc
@@ -0,0 +1,39 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 2004 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at http://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+
+# This should most probably benefit from getting a "Requires:" field added
+# dynamically by configure.
+#
+prefix=/usr
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib
+includedir=${prefix}/include
+supported_protocols="DICT FILE FTP FTPS GOPHER HTTP HTTPS IMAP IMAPS LDAP LDAPS POP3 POP3S RTSP SMB SMBS SMTP SMTPS TELNET TFTP"
+supported_features="AsynchDNS IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz UnixSockets"
+
+Name: libcurl
+URL: https://curl.haxx.se/
+Description: Library to transfer files with ftp, http, etc.
+Version: 7.51.0
+Libs: -L${libdir} -lcurl
+Libs.private: -lldap -lz
+Cflags: -I${includedir}
diff --git a/Library/Homebrew/os/mac/pkgconfig/10.13/libexslt.pc b/Library/Homebrew/os/mac/pkgconfig/10.13/libexslt.pc
new file mode 100644
index 000000000..16276f715
--- /dev/null
+++ b/Library/Homebrew/os/mac/pkgconfig/10.13/libexslt.pc
@@ -0,0 +1,12 @@
+prefix=/usr
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib
+includedir=${prefix}/include
+
+
+Name: libexslt
+Version: 0.8.17
+Description: EXSLT Extension library
+Requires: libxml-2.0
+Libs: -L${libdir} -lexslt -lxslt -lxml2 -lz -lpthread -licucore -lm
+Cflags: -I${includedir}
diff --git a/Library/Homebrew/os/mac/pkgconfig/10.13/libxml-2.0.pc b/Library/Homebrew/os/mac/pkgconfig/10.13/libxml-2.0.pc
new file mode 100644
index 000000000..c297c6b45
--- /dev/null
+++ b/Library/Homebrew/os/mac/pkgconfig/10.13/libxml-2.0.pc
@@ -0,0 +1,13 @@
+prefix=/usr
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib
+includedir=${prefix}/include
+modules=1
+
+Name: libXML
+Version: 2.9.4
+Description: libXML library version2.
+Requires:
+Libs: -L${libdir} -lxml2
+Libs.private: -lz -lpthread -licucore -lm
+Cflags: -I${includedir}/libxml2
diff --git a/Library/Homebrew/os/mac/pkgconfig/10.13/libxslt.pc b/Library/Homebrew/os/mac/pkgconfig/10.13/libxslt.pc
new file mode 100644
index 000000000..92d07a988
--- /dev/null
+++ b/Library/Homebrew/os/mac/pkgconfig/10.13/libxslt.pc
@@ -0,0 +1,12 @@
+prefix=/usr
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib
+includedir=${prefix}/include
+
+
+Name: libxslt
+Version: 1.1.29
+Description: XSLT library version 2.
+Requires: libxml-2.0
+Libs: -L${libdir} -lxslt -lxml2 -lz -lpthread -licucore -lm
+Cflags: -I${includedir}
diff --git a/Library/Homebrew/os/mac/pkgconfig/10.13/sqlite3.pc b/Library/Homebrew/os/mac/pkgconfig/10.13/sqlite3.pc
new file mode 100644
index 000000000..aa78d2c1d
--- /dev/null
+++ b/Library/Homebrew/os/mac/pkgconfig/10.13/sqlite3.pc
@@ -0,0 +1,11 @@
+prefix=/usr
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib
+includedir=${prefix}/include
+
+Name: SQLite
+Description: SQL database engine
+Version: 3.18.0
+Libs: -L${libdir} -lsqlite3
+Libs.private:
+Cflags: -I${includedir}
diff --git a/Library/Homebrew/os/mac/pkgconfig/10.13/zlib.pc b/Library/Homebrew/os/mac/pkgconfig/10.13/zlib.pc
new file mode 100644
index 000000000..628892158
--- /dev/null
+++ b/Library/Homebrew/os/mac/pkgconfig/10.13/zlib.pc
@@ -0,0 +1,13 @@
+prefix=/usr
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib
+sharedlibdir=${libdir}
+includedir=${prefix}/include
+
+Name: zlib
+Description: zlib compression library
+Version: 1.2.8
+
+Requires:
+Libs: -L${libdir} -L${sharedlibdir} -lz
+Cflags: -I${includedir}
diff --git a/Library/Homebrew/os/mac/version.rb b/Library/Homebrew/os/mac/version.rb
index 802ec3035..89016bb4d 100644
--- a/Library/Homebrew/os/mac/version.rb
+++ b/Library/Homebrew/os/mac/version.rb
@@ -4,6 +4,7 @@ module OS
module Mac
class Version < ::Version
SYMBOLS = {
+ high_sierra: "10.13",
sierra: "10.12",
el_capitan: "10.11",
yosemite: "10.10",
diff --git a/Library/Homebrew/os/mac/xcode.rb b/Library/Homebrew/os/mac/xcode.rb
index 9ed95d3f2..d957792af 100644
--- a/Library/Homebrew/os/mac/xcode.rb
+++ b/Library/Homebrew/os/mac/xcode.rb
@@ -17,17 +17,19 @@ module OS
when "10.9" then "6.2"
when "10.10" then "7.2.1"
when "10.11" then "8.2.1"
- when "10.12" then "8.3.2"
+ when "10.12" then "8.3.3"
+ when "10.13" then "9.0"
else
raise "macOS '#{MacOS.version}' is invalid" unless OS::Mac.prerelease?
# Default to newest known version of Xcode for unreleased macOS versions.
- "8.3.2"
+ "9.0"
end
end
def minimum_version
case MacOS.version
+ when "10.13" then "9.0"
when "10.12" then "8.0"
else "2.0"
end
@@ -116,7 +118,7 @@ module OS
].uniq.each do |xcodebuild_path|
next unless File.executable? xcodebuild_path
xcodebuild_output = Utils.popen_read(xcodebuild_path, "-version")
- next unless $?.success?
+ next unless $CHILD_STATUS.success?
xcode_version = xcodebuild_output[/Xcode (\d(\.\d)*)/, 1]
return xcode_version if xcode_version
@@ -152,7 +154,8 @@ module OS
when 73 then "7.3"
when 80 then "8.0"
when 81 then "8.3"
- else "8.3"
+ when 90 then "9.0"
+ else "9.0"
end
end
@@ -213,6 +216,7 @@ module OS
# on the older supported platform for that Xcode release, i.e there's no
# CLT package for 10.11 that contains the Clang version from Xcode 8.
case MacOS.version
+ when "10.13" then "900.0.22.8"
when "10.12" then "802.0.42"
when "10.11" then "800.0.42.1"
when "10.10" then "700.1.81"
diff --git a/Library/Homebrew/patch.rb b/Library/Homebrew/patch.rb
index 7f5a6af35..7045adf5e 100644
--- a/Library/Homebrew/patch.rb
+++ b/Library/Homebrew/patch.rb
@@ -68,7 +68,7 @@ class EmbeddedPatch
cmd = "/usr/bin/patch"
args = %W[-g 0 -f -#{strip}]
IO.popen("#{cmd} #{args.join(" ")}", "w") { |p| p.write(data) }
- raise ErrorDuringExecution.new(cmd, args) unless $?.success?
+ raise ErrorDuringExecution.new(cmd, args) unless $CHILD_STATUS.success?
end
def inspect
diff --git a/Library/Homebrew/readall.rb b/Library/Homebrew/readall.rb
index ddac58444..3595c16be 100644
--- a/Library/Homebrew/readall.rb
+++ b/Library/Homebrew/readall.rb
@@ -82,7 +82,7 @@ module Readall
# Only syntax errors result in a non-zero status code. To detect syntax
# warnings we also need to inspect the output to `$stderr`.
- !$?.success? || !messages.chomp.empty?
+ !$CHILD_STATUS.success? || !messages.chomp.empty?
end
end
end
diff --git a/Library/Homebrew/requirement.rb b/Library/Homebrew/requirement.rb
index cac8c6232..cfb925b49 100644
--- a/Library/Homebrew/requirement.rb
+++ b/Library/Homebrew/requirement.rb
@@ -61,7 +61,7 @@ class Requirement
if parent = satisfied_result_parent
parent.to_s =~ %r{(#{Regexp.escape(HOMEBREW_CELLAR)}|#{Regexp.escape(HOMEBREW_PREFIX)}/opt)/([\w+-.@]+)}
- @formula = $2
+ @formula = Regexp.last_match(2)
end
true
diff --git a/Library/Homebrew/rubocops/formula_desc_cop.rb b/Library/Homebrew/rubocops/formula_desc_cop.rb
index 54a14b39d..e44c222d8 100644
--- a/Library/Homebrew/rubocops/formula_desc_cop.rb
+++ b/Library/Homebrew/rubocops/formula_desc_cop.rb
@@ -8,27 +8,51 @@ module RuboCop
#
# - Checks for existence of `desc`
# - Checks if size of `desc` > 80
- # - Checks if `desc` begins with an article
- # - Checks for correct usage of `command-line` in `desc`
- # - Checks if `desc` contains the formula name
- class Desc < FormulaCop
+ class DescLength < FormulaCop
def audit_formula(_node, _class_node, _parent_class_node, body)
desc_call = find_node_method_by_name(body, :desc)
+ # Check if a formula's desc is present
if desc_call.nil?
problem "Formula should have a desc (Description)."
return
end
+ # Check if a formula's desc is too long
desc = parameters(desc_call).first
desc_length = "#{@formula_name}: #{string_content(desc)}".length
max_desc_length = 80
- if desc_length > max_desc_length
- problem <<-EOS.undent
- Description is too long. "name: desc" should be less than #{max_desc_length} characters.
- Length is calculated as #{@formula_name} + desc. (currently #{desc_length})
- EOS
- end
+ return if desc_length <= max_desc_length
+ problem <<-EOS.undent
+ Description is too long. "name: desc" should be less than #{max_desc_length} characters.
+ Length is calculated as #{@formula_name} + desc. (currently #{desc_length})
+ EOS
+ end
+ end
+
+ # This cop audits `desc` in Formulae
+ #
+ # - Checks if `desc` begins with an article
+ # - Checks for correct usage of `command-line` in `desc`
+ # - Checks description starts with a capital letter
+ # - Checks if `desc` contains the formula name
+ class Desc < FormulaCop
+ VALID_LOWERCASE_WORDS = %w[
+ ex
+ eXtensible
+ iOS
+ macOS
+ malloc
+ ooc
+ preexec
+ xUnit
+ ].freeze
+
+ def audit_formula(_node, _class_node, _parent_class_node, body)
+ desc_call = find_node_method_by_name(body, :desc)
+ return if desc_call.nil?
+
+ desc = parameters(desc_call).first
# Check if command-line is wrongly used in formula's desc
if match = regex_match_group(desc, /(command ?line)/i)
@@ -36,16 +60,41 @@ module RuboCop
problem "Description should use \"#{c}ommand-line\" instead of \"#{match}\""
end
+ # Check if a/an are used in a formula's desc
if match = regex_match_group(desc, /^(an?)\s/i)
- problem "Description shouldn't start with an indefinite article (#{match})"
+ problem "Description shouldn't start with an indefinite article i.e. \"#{match.to_s.strip}\""
end
- if regex_match_group(desc, /^[a-z]/)
+ # Check if invalid uppercase words are at the start of a
+ # formula's desc
+ if !VALID_LOWERCASE_WORDS.include?(string_content(desc).split.first) &&
+ regex_match_group(desc, /^[a-z]/)
problem "Description should start with a capital letter"
end
# Check if formula's name is used in formula's desc
- problem "Description shouldn't include the formula name" if regex_match_group(desc, /^#{@formula_name}\b/i)
+ return unless regex_match_group(desc, /(^|[^a-z])#{@formula_name}([^a-z]|$)/i)
+ problem "Description shouldn't include the formula name"
+ end
+
+ private
+
+ def autocorrect(node)
+ lambda do |corrector|
+ correction = node.source
+ first_word = string_content(node).split.first
+ unless VALID_LOWERCASE_WORDS.include?(first_word)
+ first_char = first_word.to_s.chars.first
+ correction.sub!(/^(['"]?)([a-z])/, "\\1#{first_char.upcase}")
+ end
+ correction.sub!(/^(['"]?)an?\s/i, "\\1")
+ correction.gsub!(/(ommand ?line)/i, "ommand-line")
+ correction.gsub!(/(^|[^a-z])#{@formula_name}([^a-z]|$)/i, "\\1\\2")
+ correction.gsub!(/^(['"]?)\s+/, "\\1")
+ correction.gsub!(/\s+(['"]?)$/, "\\1")
+ corrector.insert_before(node.source_range, correction)
+ corrector.remove(node.source_range)
+ end
end
end
end
diff --git a/Library/Homebrew/rubocops/homepage_cop.rb b/Library/Homebrew/rubocops/homepage_cop.rb
index a40c7b049..25c0e9c51 100644
--- a/Library/Homebrew/rubocops/homepage_cop.rb
+++ b/Library/Homebrew/rubocops/homepage_cop.rb
@@ -54,7 +54,7 @@ module RuboCop
problem "Please use https:// for #{homepage}"
when %r{^http://([^/]*)\.(sf|sourceforge)\.net(/|$)}
- problem "#{homepage} should be `https://#{$1}.sourceforge.io/`"
+ problem "#{homepage} should be `https://#{Regexp.last_match(1)}.sourceforge.io/`"
# There's an auto-redirect here, but this mistake is incredibly common too.
# Only applies to the homepage and subdomains for now, not the FTP URLs.
diff --git a/Library/Homebrew/shims/super/g++-7 b/Library/Homebrew/shims/super/g++-7
new file mode 120000
index 000000000..2652f5f42
--- /dev/null
+++ b/Library/Homebrew/shims/super/g++-7
@@ -0,0 +1 @@
+cc \ No newline at end of file
diff --git a/Library/Homebrew/shims/super/gcc-7 b/Library/Homebrew/shims/super/gcc-7
new file mode 120000
index 000000000..2652f5f42
--- /dev/null
+++ b/Library/Homebrew/shims/super/gcc-7
@@ -0,0 +1 @@
+cc \ No newline at end of file
diff --git a/Library/Homebrew/system_config.rb b/Library/Homebrew/system_config.rb
index 56826f62d..f89c79306 100644
--- a/Library/Homebrew/system_config.rb
+++ b/Library/Homebrew/system_config.rb
@@ -128,7 +128,7 @@ class SystemConfig
return "N/A" unless File.executable? "/usr/libexec/java_home"
java_xml = Utils.popen_read("/usr/libexec/java_home", "--xml", "--failfast")
- return "N/A" unless $?.success?
+ return "N/A" unless $CHILD_STATUS.success?
javas = []
REXML::XPath.each(REXML::Document.new(java_xml), "//key[text()='JVMVersion']/following-sibling::string") do |item|
javas << item.text
diff --git a/Library/Homebrew/tap.rb b/Library/Homebrew/tap.rb
index 66aa10158..0aabce6c3 100644
--- a/Library/Homebrew/tap.rb
+++ b/Library/Homebrew/tap.rb
@@ -43,8 +43,8 @@ class Tap
def self.from_path(path)
path.to_s =~ HOMEBREW_TAP_PATH_REGEX
- raise "Invalid tap path '#{path}'" unless $1
- fetch($1, $2)
+ raise "Invalid tap path '#{path}'" unless Regexp.last_match(1)
+ fetch(Regexp.last_match(1), Regexp.last_match(2))
rescue
# No need to error as a nil tap is sufficient to show failure.
nil
diff --git a/Library/Homebrew/test/.codecov.yml b/Library/Homebrew/test/.codecov.yml
index c53d9f9dd..9c75dfe6a 100644
--- a/Library/Homebrew/test/.codecov.yml
+++ b/Library/Homebrew/test/.codecov.yml
@@ -1,7 +1,4 @@
-comment: false
-coverage:
- fixes:
- - "::Library/Homebrew/"
- parsers:
- v1:
- include_full_missed_files: yes
+comment: off
+
+fixes:
+ - "::Library/Homebrew/"
diff --git a/Library/Homebrew/test/cask/artifact/suite_spec.rb b/Library/Homebrew/test/cask/artifact/suite_spec.rb
index 98ae93311..eca6b6f17 100644
--- a/Library/Homebrew/test/cask/artifact/suite_spec.rb
+++ b/Library/Homebrew/test/cask/artifact/suite_spec.rb
@@ -10,19 +10,6 @@ describe Hbc::Artifact::Suite, :cask do
InstallHelper.install_without_artifacts(cask)
end
- it "moves the suite to the proper directory" do
- skip("flaky test") # FIXME
-
- shutup do
- install_phase.call
- end
-
- expect(target_path).to be_a_directory
- expect(target_path).to be_a_symlink
- expect(target_path.readlink).to exist
- expect(source_path).not_to exist
- end
-
it "creates a suite containing the expected app" do
shutup do
install_phase.call
diff --git a/Library/Homebrew/test/cask/cli/audit_spec.rb b/Library/Homebrew/test/cask/cli/audit_spec.rb
index 412db1481..01f506c8c 100644
--- a/Library/Homebrew/test/cask/cli/audit_spec.rb
+++ b/Library/Homebrew/test/cask/cli/audit_spec.rb
@@ -1,5 +1,5 @@
describe Hbc::CLI::Audit, :cask do
- let(:cask) { double }
+ let(:cask) { double("cask", token: nil) }
describe "selection of Casks to audit" do
it "audits all Casks if no tokens are given" do
diff --git a/Library/Homebrew/test/cask/cli/cat_spec.rb b/Library/Homebrew/test/cask/cli/cat_spec.rb
index 28089b2f1..b726a0b36 100644
--- a/Library/Homebrew/test/cask/cli/cat_spec.rb
+++ b/Library/Homebrew/test/cask/cli/cat_spec.rb
@@ -34,9 +34,9 @@ describe Hbc::CLI::Cat, :cask do
end
it "raises an exception when the Cask does not exist" do
- expect {
- Hbc::CLI::Cat.run("notacask")
- }.to raise_error(Hbc::CaskUnavailableError)
+ expect { Hbc::CLI::Cat.run("notacask") }
+ .to output(/is unavailable/).to_stderr
+ .and raise_error(Hbc::CaskError, "Cat incomplete.")
end
describe "when no Cask is specified" do
diff --git a/Library/Homebrew/test/cask/cli/fetch_spec.rb b/Library/Homebrew/test/cask/cli/fetch_spec.rb
index 9f3056631..54bdfc0c8 100644
--- a/Library/Homebrew/test/cask/cli/fetch_spec.rb
+++ b/Library/Homebrew/test/cask/cli/fetch_spec.rb
@@ -54,7 +54,7 @@ describe Hbc::CLI::Fetch, :cask do
shutup do
Hbc::CLI::Fetch.run("notacask")
end
- }.to raise_error(Hbc::CaskUnavailableError)
+ }.to raise_error(Hbc::CaskError, "Fetch incomplete.")
end
describe "when no Cask is specified" do
diff --git a/Library/Homebrew/test/cask/cli/install_spec.rb b/Library/Homebrew/test/cask/cli/install_spec.rb
index b1b26c867..cf69b5d86 100644
--- a/Library/Homebrew/test/cask/cli/install_spec.rb
+++ b/Library/Homebrew/test/cask/cli/install_spec.rb
@@ -41,7 +41,7 @@ describe Hbc::CLI::Install, :cask do
expect {
Hbc::CLI::Install.run("local-transmission")
- }.to output(/Warning: A Cask for local-transmission is already installed./).to_stderr
+ }.to output(/Warning: Cask 'local-transmission' is already installed./).to_stderr
end
it "allows double install with --force" do
@@ -70,7 +70,7 @@ describe Hbc::CLI::Install, :cask do
shutup do
Hbc::CLI::Install.run("notacask")
end
- }.to raise_error(Hbc::CaskError)
+ }.to raise_error(Hbc::CaskError, "Install incomplete.")
end
it "returns a suggestion for a misspelled Cask" do
@@ -80,7 +80,7 @@ describe Hbc::CLI::Install, :cask do
rescue Hbc::CaskError
nil
end
- }.to output(/No available Cask for localcaffeine\. Did you mean:\nlocal-caffeine/).to_stderr
+ }.to output(/Cask 'localcaffeine' is unavailable: No Cask with this name exists\. Did you mean:\nlocal-caffeine/).to_stderr
end
it "returns multiple suggestions for a Cask fragment" do
@@ -90,7 +90,7 @@ describe Hbc::CLI::Install, :cask do
rescue Hbc::CaskError
nil
end
- }.to output(/No available Cask for local-caf\. Did you mean one of:\nlocal-caffeine/).to_stderr
+ }.to output(/Cask 'local-caf' is unavailable: No Cask with this name exists\. Did you mean one of:\nlocal-caffeine/).to_stderr
end
describe "when no Cask is specified" do
diff --git a/Library/Homebrew/test/cask/cli/style_spec.rb b/Library/Homebrew/test/cask/cli/style_spec.rb
index 7d250c166..640eca5f4 100644
--- a/Library/Homebrew/test/cask/cli/style_spec.rb
+++ b/Library/Homebrew/test/cask/cli/style_spec.rb
@@ -1,4 +1,3 @@
-require "English"
require "open3"
require "rubygems"
@@ -108,7 +107,7 @@ describe Hbc::CLI::Style, :cask do
end
it "tries to find paths for all tokens" do
- expect(Hbc::CaskLoader).to receive(:path).twice
+ expect(Hbc::CaskLoader).to receive(:load).twice.and_return(double("cask", sourcefile_path: nil))
subject
end
end
diff --git a/Library/Homebrew/test/cask/cli/uninstall_spec.rb b/Library/Homebrew/test/cask/cli/uninstall_spec.rb
index bc1f52613..cc640fad7 100644
--- a/Library/Homebrew/test/cask/cli/uninstall_spec.rb
+++ b/Library/Homebrew/test/cask/cli/uninstall_spec.rb
@@ -17,15 +17,15 @@ describe Hbc::CLI::Uninstall, :cask do
end
it "shows an error when a bad Cask is provided" do
- expect {
- Hbc::CLI::Uninstall.run("notacask")
- }.to raise_error(Hbc::CaskUnavailableError)
+ expect { Hbc::CLI::Uninstall.run("notacask") }
+ .to output(/is unavailable/).to_stderr
+ .and raise_error(Hbc::CaskError, "Uninstall incomplete.")
end
it "shows an error when a Cask is provided that's not installed" do
- expect {
- Hbc::CLI::Uninstall.run("local-caffeine")
- }.to raise_error(Hbc::CaskNotInstalledError)
+ expect { Hbc::CLI::Uninstall.run("local-caffeine") }
+ .to output(/is not installed/).to_stderr
+ .and raise_error(Hbc::CaskError, "Uninstall incomplete.")
end
it "tries anyway on a non-present Cask when --force is given" do
@@ -89,11 +89,9 @@ describe Hbc::CLI::Uninstall, :cask do
Hbc.appdir.join("MyFancyApp.app").rmtree
- expect {
- shutup do
- Hbc::CLI::Uninstall.run("with-uninstall-script-app")
- end
- }.to raise_error(Hbc::CaskError, /does not exist/)
+ expect { shutup { Hbc::CLI::Uninstall.run("with-uninstall-script-app") } }
+ .to output(/does not exist/).to_stderr
+ .and raise_error(Hbc::CaskError, "Uninstall incomplete.")
expect(cask).to be_installed
diff --git a/Library/Homebrew/test/cask/cli/zap_spec.rb b/Library/Homebrew/test/cask/cli/zap_spec.rb
index f3af0e66f..e39ca61f8 100644
--- a/Library/Homebrew/test/cask/cli/zap_spec.rb
+++ b/Library/Homebrew/test/cask/cli/zap_spec.rb
@@ -1,8 +1,8 @@
describe Hbc::CLI::Zap, :cask do
it "shows an error when a bad Cask is provided" do
- expect {
- Hbc::CLI::Zap.run("notacask")
- }.to raise_error(Hbc::CaskUnavailableError)
+ expect { Hbc::CLI::Zap.run("notacask") }
+ .to output(/is unavailable/).to_stderr
+ .and raise_error(Hbc::CaskError, "Zap incomplete.")
end
it "can zap and unlink multiple Casks at once" do
diff --git a/Library/Homebrew/test/cask/cli_spec.rb b/Library/Homebrew/test/cask/cli_spec.rb
index 569b831de..51258c580 100644
--- a/Library/Homebrew/test/cask/cli_spec.rb
+++ b/Library/Homebrew/test/cask/cli_spec.rb
@@ -1,10 +1,10 @@
describe Hbc::CLI, :cask do
it "lists the taps for Casks that show up in two taps" do
- listing = Hbc::CLI.nice_listing(%w[
- caskroom/cask/adium
- caskroom/cask/google-chrome
- passcod/homebrew-cask/adium
- ])
+ listing = described_class.nice_listing(%w[
+ caskroom/cask/adium
+ caskroom/cask/google-chrome
+ passcod/homebrew-cask/adium
+ ])
expect(listing).to eq(%w[
caskroom/cask/adium
@@ -13,6 +13,13 @@ describe Hbc::CLI, :cask do
])
end
+ it "ignores the `--language` option, which is handled in `OS::Mac`" do
+ cli = described_class.new("--language=en")
+ expect(cli).to receive(:detect_command_and_arguments).with(no_args)
+ expect(cli).to receive(:exit).with(1)
+ shutup { cli.run }
+ end
+
context "when no option is specified" do
it "--binaries is true by default" do
command = Hbc::CLI::Install.new("some-cask")
@@ -41,8 +48,8 @@ describe Hbc::CLI, :cask do
end
it "prints help output when subcommand receives `--help` flag" do
- command = Hbc::CLI.new("noop", "--help")
- expect(described_class).to receive(:run_command).with("help")
+ command = described_class.new("noop", "--help")
+ expect(described_class).to receive(:run_command).with("help", "noop")
command.run
expect(command.help?).to eq(true)
end
@@ -56,7 +63,7 @@ describe Hbc::CLI, :cask do
it "exits with a status of 1 when something goes wrong" do
allow(described_class).to receive(:lookup_command).and_raise(Hbc::CaskError)
- command = Hbc::CLI.new("noop")
+ command = described_class.new("noop")
expect(command).to receive(:exit).with(1)
command.run
end
diff --git a/Library/Homebrew/test/cask/dsl_spec.rb b/Library/Homebrew/test/cask/dsl_spec.rb
index 7eeabcf49..5849f581b 100644
--- a/Library/Homebrew/test/cask/dsl_spec.rb
+++ b/Library/Homebrew/test/cask/dsl_spec.rb
@@ -57,7 +57,7 @@ describe Hbc::DSL, :cask do
it "raises an error" do
expect {
cask
- }.to raise_error(Hbc::CaskTokenDoesNotMatchError, /Bad header line:.*does not match file name/)
+ }.to raise_error(Hbc::CaskTokenMismatchError, /header line does not match the file name/)
end
end
diff --git a/Library/Homebrew/test/cask/installer_spec.rb b/Library/Homebrew/test/cask/installer_spec.rb
index 0ae7c14a5..8ef82c1d5 100644
--- a/Library/Homebrew/test/cask/installer_spec.rb
+++ b/Library/Homebrew/test/cask/installer_spec.rb
@@ -37,45 +37,6 @@ describe Hbc::Installer, :cask do
expect(Hbc.appdir.join("container")).to be_a_file
end
- it "works with cab-based Casks" do
- skip("cabextract not installed") if which("cabextract").nil?
- asset = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/container-cab.rb")
-
- allow(asset).to receive(:depends_on).and_return(empty_depends_on_stub)
-
- shutup do
- Hbc::Installer.new(asset).install
- end
-
- expect(Hbc.caskroom.join("container-cab", asset.version)).to be_a_directory
- expect(Hbc.appdir.join("container")).to be_a_file
- end
-
- it "works with Adobe AIR-based Casks" do
- skip("Adobe AIR not installed") unless Hbc::Container::Air.installer_exist?
- asset = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/container-air.rb")
-
- shutup do
- Hbc::Installer.new(asset).install
- end
-
- expect(Hbc.caskroom.join("container-air", asset.version)).to be_a_directory
- expect(Hbc.appdir.join("container.app")).to be_a_directory
- end
-
- it "works with 7z-based Casks" do
- skip("unar not installed") if which("unar").nil?
- asset = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/container-7z.rb")
-
- allow(asset).to receive(:depends_on).and_return(empty_depends_on_stub)
- shutup do
- Hbc::Installer.new(asset).install
- end
-
- expect(Hbc.caskroom.join("container-7z", asset.version)).to be_a_directory
- expect(Hbc.appdir.join("container")).to be_a_file
- end
-
it "works with xar-based Casks" do
asset = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/container-xar.rb")
@@ -87,32 +48,6 @@ describe Hbc::Installer, :cask do
expect(Hbc.appdir.join("container")).to be_a_file
end
- it "works with Stuffit-based Casks" do
- skip("unar not installed") if which("unar").nil?
- asset = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/container-sit.rb")
-
- allow(asset).to receive(:depends_on).and_return(empty_depends_on_stub)
- shutup do
- Hbc::Installer.new(asset).install
- end
-
- expect(Hbc.caskroom.join("container-sit", asset.version)).to be_a_directory
- expect(Hbc.appdir.join("container")).to be_a_file
- end
-
- it "works with RAR-based Casks" do
- skip("unar not installed") if which("unar").nil?
- asset = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/container-rar.rb")
-
- allow(asset).to receive(:depends_on).and_return(empty_depends_on_stub)
- shutup do
- Hbc::Installer.new(asset).install
- end
-
- expect(Hbc.caskroom.join("container-rar", asset.version)).to be_a_directory
- expect(Hbc.appdir.join("container")).to be_a_file
- end
-
it "works with pure bzip2-based Casks" do
asset = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/container-bzip2.rb")
@@ -135,45 +70,6 @@ describe Hbc::Installer, :cask do
expect(Hbc.appdir.join("container")).to be_a_file
end
- it "works with pure xz-based Casks" do
- skip("unxz not installed") if which("unxz").nil?
- asset = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/container-xz.rb")
-
- allow(asset).to receive(:depends_on).and_return(empty_depends_on_stub)
- shutup do
- Hbc::Installer.new(asset).install
- end
-
- expect(Hbc.caskroom.join("container-xz", asset.version)).to be_a_directory
- expect(Hbc.appdir.join("container-xz--#{asset.version}")).to be_a_file
- end
-
- it "works with lzma-based Casks" do
- skip("unlzma not installed") if which("unlzma").nil?
- asset = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/container-lzma.rb")
-
- allow(asset).to receive(:depends_on).and_return(empty_depends_on_stub)
- shutup do
- Hbc::Installer.new(asset).install
- end
-
- expect(Hbc.caskroom.join("container-lzma", asset.version)).to be_a_directory
- expect(Hbc.appdir.join("container-lzma--#{asset.version}")).to be_a_file
- end
-
- it "works with gpg-based Casks" do
- skip("gpg not installed") if which("gpg").nil?
- asset = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/container-gpg.rb")
-
- allow(asset).to receive(:depends_on).and_return(empty_depends_on_stub)
- shutup do
- Hbc::Installer.new(asset).install
- end
-
- expect(Hbc.caskroom.join("container-gpg", asset.version)).to be_a_directory
- expect(Hbc.appdir.join("container")).to be_a_file
- end
-
it "blows up on a bad checksum" do
bad_checksum = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/bad-checksum.rb")
expect {
@@ -249,22 +145,6 @@ describe Hbc::Installer, :cask do
expect(with_macosx_dir.staged_path.join("__MACOSX")).not_to be_a_directory
end
- it "installer method raises an exception when already-installed Casks which auto-update are attempted" do
- with_auto_updates = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/auto-updates.rb")
-
- expect(with_auto_updates).not_to be_installed
-
- installer = Hbc::Installer.new(with_auto_updates)
-
- shutup do
- installer.install
- end
-
- expect {
- installer.install
- }.to raise_error(Hbc::CaskAlreadyInstalledAutoUpdatesError)
- end
-
it "allows already-installed Casks which auto-update to be installed if force is provided" do
with_auto_updates = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/auto-updates.rb")
diff --git a/Library/Homebrew/test/cask/verify/checksum_spec.rb b/Library/Homebrew/test/cask/verify/checksum_spec.rb
index 55c0e5f44..4b8543d2b 100644
--- a/Library/Homebrew/test/cask/verify/checksum_spec.rb
+++ b/Library/Homebrew/test/cask/verify/checksum_spec.rb
@@ -1,5 +1,5 @@
describe Hbc::Verify::Checksum, :cask do
- let(:cask) { double("cask") }
+ let(:cask) { double("cask", token: "cask") }
let(:downloaded_path) { double("downloaded_path") }
let(:verification) { described_class.new(cask, downloaded_path) }
diff --git a/Library/Homebrew/test/cmd/cask_spec.rb b/Library/Homebrew/test/cmd/cask_spec.rb
index fcd7e6a16..3bba5fbf4 100644
--- a/Library/Homebrew/test/cmd/cask_spec.rb
+++ b/Library/Homebrew/test/cmd/cask_spec.rb
@@ -1,4 +1,4 @@
-describe "brew cask", :integration_test, :needs_macos, :needs_official_cmd_taps do
+describe "brew cask", :integration_test, :needs_macos, :needs_network do
describe "list" do
it "returns a list of installed Casks" do
setup_remote_tap("caskroom/cask")
diff --git a/Library/Homebrew/test/cmd/services_spec.rb b/Library/Homebrew/test/cmd/services_spec.rb
index c456fea17..669e84e5f 100644
--- a/Library/Homebrew/test/cmd/services_spec.rb
+++ b/Library/Homebrew/test/cmd/services_spec.rb
@@ -1,4 +1,4 @@
-describe "brew services", :integration_test, :needs_macos, :needs_official_cmd_taps do
+describe "brew services", :integration_test, :needs_macos, :needs_network do
it "allows controlling services" do
setup_remote_tap "homebrew/services"
diff --git a/Library/Homebrew/test/gpg_spec.rb b/Library/Homebrew/test/gpg_spec.rb
deleted file mode 100644
index 160e55379..000000000
--- a/Library/Homebrew/test/gpg_spec.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-require "gpg"
-
-describe Gpg do
- subject { described_class }
-
- describe "::create_test_key" do
- it "creates a test key in the home directory" do
- skip "GPG Unavailable" unless subject.available?
-
- mktmpdir do |dir|
- ENV["HOME"] = dir
-
- shutup do
- subject.create_test_key(dir)
- end
-
- if subject.version == Version.create("2.0")
- expect(dir/".gnupg/secring.gpg").to be_a_file
- else
- expect(dir/".gnupg/pubring.kbx").to be_a_file
- end
- end
- end
- end
-end
diff --git a/Library/Homebrew/test/os/mac/diagnostic_spec.rb b/Library/Homebrew/test/os/mac/diagnostic_spec.rb
index 787f80fec..d6186e46b 100644
--- a/Library/Homebrew/test/os/mac/diagnostic_spec.rb
+++ b/Library/Homebrew/test/os/mac/diagnostic_spec.rb
@@ -45,4 +45,17 @@ describe Homebrew::Diagnostic::Checks do
expect(subject.check_homebrew_prefix)
.to match("Your Homebrew's prefix is not /usr/local.")
end
+
+ specify "#check_ruby_version" do
+ allow(MacOS).to receive(:version).and_return(OS::Mac::Version.new("10.13"))
+ stub_const("RUBY_VERSION", "2.3.3p222")
+
+ expect(subject.check_ruby_version)
+ .to match <<-EOS.undent
+ Ruby version 2.3.3p222 is unsupported on 10.13. Homebrew
+ is developed and tested on Ruby 2.0, and may not work correctly
+ on other Rubies. Patches are accepted as long as they don't cause breakage
+ on supported Rubies.
+ EOS
+ end
end
diff --git a/Library/Homebrew/test/rubocops/formula_desc_cop_spec.rb b/Library/Homebrew/test/rubocops/formula_desc_cop_spec.rb
index f6436d6a3..4e684be46 100644
--- a/Library/Homebrew/test/rubocops/formula_desc_cop_spec.rb
+++ b/Library/Homebrew/test/rubocops/formula_desc_cop_spec.rb
@@ -3,7 +3,7 @@ require "rubocop/rspec/support"
require_relative "../../extend/string"
require_relative "../../rubocops/formula_desc_cop"
-describe RuboCop::Cop::FormulaAuditStrict::Desc do
+describe RuboCop::Cop::FormulaAuditStrict::DescLength do
subject(:cop) { described_class.new }
context "When auditing formula desc" do
@@ -31,7 +31,7 @@ describe RuboCop::Cop::FormulaAuditStrict::Desc do
source = <<-EOS.undent
class Foo < Formula
url 'http://example.com/foo-1.0.tgz'
- desc '#{"bar" * 30}'
+ desc 'Bar#{"bar" * 29}'
end
EOS
@@ -55,7 +55,7 @@ describe RuboCop::Cop::FormulaAuditStrict::Desc do
source = <<-EOS.undent
class Foo < Formula
url 'http://example.com/foo-1.0.tgz'
- desc '#{"bar" * 10}'\
+ desc 'Bar#{"bar" * 9}'\
'#{"foo" * 21}'
end
EOS
@@ -75,7 +75,13 @@ describe RuboCop::Cop::FormulaAuditStrict::Desc do
expect_offense(expected, actual)
end
end
+ end
+end
+describe RuboCop::Cop::FormulaAuditStrict::Desc do
+ subject(:cop) { described_class.new }
+
+ context "When auditing formula desc" do
it "When wrong \"command-line\" usage in desc" do
source = <<-EOS.undent
class Foo < Formula
@@ -104,7 +110,27 @@ describe RuboCop::Cop::FormulaAuditStrict::Desc do
end
EOS
- expected_offenses = [{ message: "Description shouldn't start with an indefinite article (An )",
+ expected_offenses = [{ message: "Description shouldn't start with an indefinite article i.e. \"An\"",
+ severity: :convention,
+ line: 3,
+ column: 8,
+ source: source }]
+
+ inspect_source(cop, source)
+ expected_offenses.zip(cop.offenses).each do |expected, actual|
+ expect_offense(expected, actual)
+ end
+ end
+
+ it "When an lowercase letter starts a desc" do
+ source = <<-EOS.undent
+ class Foo < Formula
+ url 'http://example.com/foo-1.0.tgz'
+ desc 'bar'
+ end
+ EOS
+
+ expected_offenses = [{ message: "Description should start with a capital letter",
severity: :convention,
line: 3,
column: 8,
@@ -136,11 +162,22 @@ describe RuboCop::Cop::FormulaAuditStrict::Desc do
end
end
- def expect_offense(expected, actual)
- expect(actual.message).to eq(expected[:message])
- expect(actual.severity).to eq(expected[:severity])
- expect(actual.line).to eq(expected[:line])
- expect(actual.column).to eq(expected[:column])
+ it "autocorrects all rules" do
+ source = <<-EOS.undent
+ class Foo < Formula
+ url 'http://example.com/foo-1.0.tgz'
+ desc ' an bar: commandline foo '
+ end
+ EOS
+ correct_source = <<-EOS.undent
+ class Foo < Formula
+ url 'http://example.com/foo-1.0.tgz'
+ desc 'an bar: command-line'
+ end
+ EOS
+
+ corrected_source = autocorrect_source(cop, source)
+ expect(corrected_source).to eq(correct_source)
end
end
end
diff --git a/Library/Homebrew/test/spec_helper.rb b/Library/Homebrew/test/spec_helper.rb
index e193b91a0..03b14720b 100644
--- a/Library/Homebrew/test/spec_helper.rb
+++ b/Library/Homebrew/test/spec_helper.rb
@@ -23,6 +23,7 @@ require "test/support/helper/shutup"
require "test/support/helper/fixtures"
require "test/support/helper/formula"
require "test/support/helper/mktmpdir"
+require "test/support/helper/rubocop"
require "test/support/helper/spec/shared_context/homebrew_cask" if OS.mac?
require "test/support/helper/spec/shared_context/integration_test"
@@ -44,6 +45,7 @@ RSpec.configure do |config|
config.include(Test::Helper::Fixtures)
config.include(Test::Helper::Formula)
config.include(Test::Helper::MkTmpDir)
+ config.include(Test::Helper::RuboCop)
config.before(:each, :needs_compat) do
skip "Requires compatibility layer." if ENV["HOMEBREW_NO_COMPAT"]
diff --git a/Library/Homebrew/test/support/fixtures/bottles/testball_bottle-0.1.high_sierra.bottle.tar.gz b/Library/Homebrew/test/support/fixtures/bottles/testball_bottle-0.1.high_sierra.bottle.tar.gz
new file mode 120000
index 000000000..3e989830b
--- /dev/null
+++ b/Library/Homebrew/test/support/fixtures/bottles/testball_bottle-0.1.high_sierra.bottle.tar.gz
@@ -0,0 +1 @@
+testball_bottle-0.1.yosemite.bottle.tar.gz \ No newline at end of file
diff --git a/Library/Homebrew/test/support/fixtures/cask/Casks/container-air.rb b/Library/Homebrew/test/support/fixtures/cask/Casks/container-air.rb
deleted file mode 100644
index 5aaf3d53e..000000000
--- a/Library/Homebrew/test/support/fixtures/cask/Casks/container-air.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-cask 'container-air' do
- version '0.1'
- sha256 '554472e163f8a028629b12b468e29acda9f16b223dff74fcd218bba73cc2365a'
-
- url "file://#{TEST_FIXTURE_DIR}/cask/container.air"
- homepage 'https://example.com/container-air'
-
- app 'container.app'
-end
diff --git a/Library/Homebrew/test/support/fixtures/cask/Casks/container-gpg.rb b/Library/Homebrew/test/support/fixtures/cask/Casks/container-gpg.rb
deleted file mode 100644
index 630527ce2..000000000
--- a/Library/Homebrew/test/support/fixtures/cask/Casks/container-gpg.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-cask 'container-gpg' do
- version '1.2.3'
- sha256 :no_check
-
- url "file://#{TEST_FIXTURE_DIR}/cask/container.tar.xz.gpg"
- gpg :embedded, key_id: 'B0976E51E5C047AD0FD051294E402EBF7C3C6A71'
-
- homepage 'https://example.com/container-gpg'
- depends_on formula: 'gpg'
-
- app 'container'
-end
diff --git a/Library/Homebrew/test/support/fixtures/cask/Casks/container-lzma.rb b/Library/Homebrew/test/support/fixtures/cask/Casks/container-lzma.rb
deleted file mode 100644
index 92d2c253e..000000000
--- a/Library/Homebrew/test/support/fixtures/cask/Casks/container-lzma.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-cask 'container-lzma' do
- version '1.2.3'
- sha256 '9d7edb32d02ab9bd9749a5bde8756595ea4cfcb1da02ca11c30fb591d4c1ed85'
-
- url "file://#{TEST_FIXTURE_DIR}/cask/container.lzma"
- homepage 'https://example.com/container-lzma'
-
- depends_on formula: 'lzma'
-
- app 'container-lzma--1.2.3'
-end
diff --git a/Library/Homebrew/test/support/fixtures/cask/Casks/container-rar.rb b/Library/Homebrew/test/support/fixtures/cask/Casks/container-rar.rb
deleted file mode 100644
index 33ea670d1..000000000
--- a/Library/Homebrew/test/support/fixtures/cask/Casks/container-rar.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-cask 'container-rar' do
- version '1.2.3'
- sha256 '419af7864c0e1f125515c49b08bd22e0f7de39f5285897c440fe03c714871763'
-
- url "file://#{TEST_FIXTURE_DIR}/cask/container.rar"
- homepage 'https://example.com/container-rar'
-
- depends_on formula: 'unar'
-
- app 'container'
-end
diff --git a/Library/Homebrew/test/support/fixtures/cask/Casks/container-sit.rb b/Library/Homebrew/test/support/fixtures/cask/Casks/container-sit.rb
deleted file mode 100644
index 5715795a7..000000000
--- a/Library/Homebrew/test/support/fixtures/cask/Casks/container-sit.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-cask 'container-sit' do
- version '1.2.3'
- sha256 '0d21a64dce625044345c8ecca888e5439feaf254dac7f884917028a744f93cf3'
-
- url "file://#{TEST_FIXTURE_DIR}/cask/container.sit"
- homepage 'https://example.com/container-sit'
-
- depends_on formula: 'unar'
-
- app 'container'
-end
diff --git a/Library/Homebrew/test/support/fixtures/cask/Casks/container-xz.rb b/Library/Homebrew/test/support/fixtures/cask/Casks/container-xz.rb
deleted file mode 100644
index 3f844af04..000000000
--- a/Library/Homebrew/test/support/fixtures/cask/Casks/container-xz.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-cask 'container-xz' do
- version '1.2.3'
- sha256 '839263f474edde1d54a9101606e6f0dc9d963acc93f6dcc5af8d10ebc3187c02'
-
- url "file://#{TEST_FIXTURE_DIR}/cask/container.xz"
- homepage 'https://example.com/container-xz'
-
- depends_on formula: 'xz'
-
- app 'container-xz--1.2.3'
-end
diff --git a/Library/Homebrew/test/support/helper/rubocop.rb b/Library/Homebrew/test/support/helper/rubocop.rb
new file mode 100644
index 000000000..351f2ad82
--- /dev/null
+++ b/Library/Homebrew/test/support/helper/rubocop.rb
@@ -0,0 +1,13 @@
+module Test
+ module Helper
+ module RuboCop
+ def expect_offense(expected, actual)
+ expect(actual).to_not be_nil
+ expect(actual.message).to eq(expected[:message])
+ expect(actual.severity).to eq(expected[:severity])
+ expect(actual.line).to eq(expected[:line])
+ expect(actual.column).to eq(expected[:column])
+ end
+ end
+ end
+end
diff --git a/Library/Homebrew/test/utils/popen_spec.rb b/Library/Homebrew/test/utils/popen_spec.rb
index e3704a876..63bbc7b18 100644
--- a/Library/Homebrew/test/utils/popen_spec.rb
+++ b/Library/Homebrew/test/utils/popen_spec.rb
@@ -4,7 +4,7 @@ describe Utils do
describe "::popen_read" do
it "reads the standard output of a given command" do
expect(subject.popen_read("sh", "-c", "echo success").chomp).to eq("success")
- expect($?).to be_a_success
+ expect($CHILD_STATUS).to be_a_success
end
it "can be given a block to manually read from the pipe" do
@@ -13,7 +13,7 @@ describe Utils do
pipe.read.chomp
end,
).to eq("success")
- expect($?).to be_a_success
+ expect($CHILD_STATUS).to be_a_success
end
end
@@ -22,7 +22,7 @@ describe Utils do
subject.popen_write("grep", "-q", "success") do |pipe|
pipe.write("success\n")
end
- expect($?).to be_a_success
+ expect($CHILD_STATUS).to be_a_success
end
end
end
diff --git a/Library/Homebrew/utils.rb b/Library/Homebrew/utils.rb
index cde2ee306..529f3492d 100644
--- a/Library/Homebrew/utils.rb
+++ b/Library/Homebrew/utils.rb
@@ -15,6 +15,14 @@ require "utils/svn"
require "utils/tty"
require "time"
+def require?(path)
+ return false if path.nil?
+ require path
+rescue LoadError => e
+ # we should raise on syntax errors but not if the file doesn't exist.
+ raise unless e.message.include?(path)
+end
+
def ohai(title, *sput)
title = Tty.truncate(title) if $stdout.tty? && !ARGV.verbose?
puts Formatter.headline(title, color: :blue)
@@ -76,7 +84,7 @@ def odeprecated(method, replacement = nil, disable: false, disable_on: nil, call
tap_message = nil
caller_message = backtrace.detect do |line|
next unless line =~ %r{^#{Regexp.escape(HOMEBREW_LIBRARY)}/Taps/([^/]+/[^/]+)/}
- tap = Tap.fetch $1
+ tap = Tap.fetch Regexp.last_match(1)
tap_message = "\nPlease report this to the #{tap} tap!"
true
end
@@ -151,9 +159,9 @@ def interactive_shell(f = nil)
Process.wait fork { exec ENV["SHELL"] }
- return if $?.success?
- raise "Aborted due to non-zero exit status (#{$?.exitstatus})" if $?.exited?
- raise $?.inspect
+ return if $CHILD_STATUS.success?
+ raise "Aborted due to non-zero exit status (#{$CHILD_STATUS.exitstatus})" if $CHILD_STATUS.exited?
+ raise $CHILD_STATUS.inspect
end
module Homebrew
@@ -171,7 +179,7 @@ module Homebrew
exit! 1 # never gets here unless exec failed
end
Process.wait(pid)
- $?.success?
+ $CHILD_STATUS.success?
end
def system(cmd, *args)
@@ -328,21 +336,16 @@ def which_all(cmd, path = ENV["PATH"])
end
def which_editor
- editor = ENV.values_at("HOMEBREW_EDITOR", "HOMEBREW_VISUAL").compact.reject(&:empty?).first
- return editor unless editor.nil?
-
- # Find Textmate, BBEdit / TextWrangler, or vim
- %w[mate edit vim].each do |candidate|
- editor = candidate if which(candidate, ENV["HOMEBREW_PATH"])
+ editor = ENV.values_at("HOMEBREW_EDITOR", "HOMEBREW_VISUAL")
+ .compact
+ .reject(&:empty?)
+ .first
+ return editor if editor
+
+ # Find Atom, Sublime Text, Textmate, BBEdit / TextWrangler, or vim
+ editor = %w[atom subl mate edit vim].find do |candidate|
+ candidate if which(candidate, ENV["HOMEBREW_PATH"])
end
-
- # Find Textmate
- editor = which("mate", ENV["HOMEBREW_PATH"])
- # Find BBEdit/TextWrangler
- editor ||= which("edit", ENV["HOMEBREW_PATH"])
- # Find vim
- editor ||= which("vim", ENV["HOMEBREW_PATH"])
- # Default to standard vim
editor ||= "/usr/bin/vim"
opoo <<-EOS.undent
diff --git a/Library/Homebrew/utils/analytics.rb b/Library/Homebrew/utils/analytics.rb
index 7dd54d3f1..23000f8dd 100644
--- a/Library/Homebrew/utils/analytics.rb
+++ b/Library/Homebrew/utils/analytics.rb
@@ -61,22 +61,15 @@ module Utils
ev: value)
end
- def report_exception(exception, options = {})
- if exception.is_a?(BuildError) &&
- exception.formula.tap &&
- exception.formula.tap.installed? &&
- !exception.formula.tap.private?
- report_event("BuildError", exception.formula.full_name)
+ def report_build_error(exception)
+ return unless exception.formula.tap
+ return unless exception.formula.tap.installed?
+ return if exception.formula.tap.private?
+ action = exception.formula.full_name
+ if (options = exception.options)
+ action = "#{action} #{options}".strip
end
-
- fatal = options.fetch(:fatal, true) ? "1" : "0"
- report(:exception,
- exd: exception.class.name,
- exf: fatal)
- end
-
- def report_screenview(screen_name)
- report(:screenview, cd: screen_name)
+ report_event("BuildError", action)
end
end
end
diff --git a/Library/Homebrew/utils/analytics.sh b/Library/Homebrew/utils/analytics.sh
index 8d5cf2ff7..00527fd9f 100644
--- a/Library/Homebrew/utils/analytics.sh
+++ b/Library/Homebrew/utils/analytics.sh
@@ -66,56 +66,3 @@ setup-analytics() {
export HOMEBREW_ANALYTICS_ID
export HOMEBREW_ANALYTICS_USER_UUID
}
-
-report-analytics-screenview-command() {
- [[ -n "$HOMEBREW_NO_ANALYTICS" || -n "$HOMEBREW_NO_ANALYTICS_THIS_RUN" ]] && return
-
- # Don't report commands that are invoked as part of other commands.
- [[ "$HOMEBREW_COMMAND_DEPTH" != 1 ]] && return
-
- # Don't report non-official commands.
- if ! [[ "$HOMEBREW_COMMAND" = "bundle" ||
- "$HOMEBREW_COMMAND" = "services" ||
- -f "$HOMEBREW_LIBRARY/Homebrew/cmd/$HOMEBREW_COMMAND.rb" ||
- -f "$HOMEBREW_LIBRARY/Homebrew/cmd/$HOMEBREW_COMMAND.sh" ||
- -f "$HOMEBREW_LIBRARY/Homebrew/dev-cmd/$HOMEBREW_COMMAND.rb" ||
- -f "$HOMEBREW_LIBRARY/Homebrew/dev-cmd/$HOMEBREW_COMMAND.sh" ]]
- then
- return
- fi
-
- # Don't report commands used mostly by our scripts and not users.
- case "$HOMEBREW_COMMAND" in
- --prefix|analytics|command|commands)
- return
- ;;
- esac
-
- local args=(
- --max-time 3
- --user-agent "$HOMEBREW_USER_AGENT_CURL"
- --data v=1
- --data aip=1
- --data t=screenview
- --data tid="$HOMEBREW_ANALYTICS_ID"
- --data cid="$HOMEBREW_ANALYTICS_USER_UUID"
- --data an="$HOMEBREW_PRODUCT"
- --data av="$HOMEBREW_VERSION"
- --data cd="$HOMEBREW_COMMAND"
- )
-
- # Send analytics. Don't send or store any personally identifiable information.
- # http://docs.brew.sh/Analytics.html
- # https://developers.google.com/analytics/devguides/collection/protocol/v1/devguide#screenView
- # https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters
- if [[ -z "$HOMEBREW_ANALYTICS_DEBUG" ]]
- then
- "$HOMEBREW_CURL" https://www.google-analytics.com/collect \
- "${args[@]}" \
- --silent --output /dev/null &>/dev/null & disown
- else
- local url="https://www.google-analytics.com/debug/collect"
- echo "$HOMEBREW_CURL $url ${args[*]}"
- "$HOMEBREW_CURL" "$url" "${args[@]}"
- fi
-}
diff --git a/Library/Homebrew/utils/fork.rb b/Library/Homebrew/utils/fork.rb
index 35a55980e..92f5bf899 100644
--- a/Library/Homebrew/utils/fork.rb
+++ b/Library/Homebrew/utils/fork.rb
@@ -37,8 +37,8 @@ module Utils
read.close
Process.wait(pid) unless socket.nil?
raise Marshal.load(data) unless data.nil? || data.empty?
- raise Interrupt if $?.exitstatus == 130
- raise "Suspicious failure" unless $?.success?
+ raise Interrupt if $CHILD_STATUS.exitstatus == 130
+ raise "Suspicious failure" unless $CHILD_STATUS.success?
end
end
end
diff --git a/Library/Homebrew/utils/tty.rb b/Library/Homebrew/utils/tty.rb
index 642a33b91..e872e6460 100644
--- a/Library/Homebrew/utils/tty.rb
+++ b/Library/Homebrew/utils/tty.rb
@@ -6,7 +6,10 @@ module Tty
end
def width
- (`/bin/stty size`.split[1] || 80).to_i
+ width = `/bin/stty size 2>/dev/null`.split[1]
+ width ||= `/usr/bin/tput cols 2>/dev/null`.split[0]
+ width ||= 80
+ width.to_i
end
def truncate(string)
diff --git a/README.md b/README.md
index 76434beae..57cc5f6d4 100644
--- a/README.md
+++ b/README.md
@@ -67,6 +67,8 @@ Our Xserve ESXi boxes for CI are hosted by [MacStadium](https://www.macstadium.c
Our Jenkins CI installation is hosted by [DigitalOcean](https://m.do.co/c/7e39c35d5581).
+![DigitalOcean](https://cloud.githubusercontent.com/assets/125011/26827038/4b7b5ade-4ab3-11e7-811b-fed3ab0e934d.png)
+
Our bottles (binary packages) are hosted by [Bintray](https://bintray.com/homebrew).
[![Downloads by Bintray](https://bintray.com/docs/images/downloads_by_bintray_96.png)](https://bintray.com/homebrew)
diff --git a/completions/zsh/_brew b/completions/zsh/_brew
index 970b4f899..61dc26b42 100644
--- a/completions/zsh/_brew
+++ b/completions/zsh/_brew
@@ -676,8 +676,7 @@ _brew_test_bot() {
}
# brew tests [-v] [--coverage] [--generic] [--no-compat]
-# [--only=test_script:test_method] [--seed seed] [--trace] [--online]
-# [--official-cmd-taps]:
+# [--only=test_script:test_method] [--seed seed] [--trace] [--online]:
_brew_tests() {
_arguments \
'(-v)-v' \
@@ -687,8 +686,7 @@ _brew_tests() {
'(--only)--only=-:test_method: ' \
'(--seed)--seed:seed: ' \
'(--trace)--trace' \
- '(--online)--online' \
- '(--official-cmd-taps)--official-cmd-taps'
+ '(--online)--online'
}
# brew uninstall, rm, remove [--force] formula:
diff --git a/docs/Acceptable-Formulae.md b/docs/Acceptable-Formulae.md
index d59129ecc..0773d12d9 100644
--- a/docs/Acceptable-Formulae.md
+++ b/docs/Acceptable-Formulae.md
@@ -40,9 +40,6 @@ There are exceptions:
| openssl | macOS's openssl is deprecated & outdated |
| libxml2 | Historically, macOS's libxml2 has been buggy |
-We also maintain [a tap](https://github.com/Homebrew/homebrew-dupes) that
-contains many duplicates not otherwise found in Homebrew.
-
### We don’t like tools that upgrade themselves
Software that can upgrade itself does not integrate well with Homebrew's own
upgrade functionality.
diff --git a/docs/Analytics.md b/docs/Analytics.md
index 69ab0b58f..15fa6fc93 100644
--- a/docs/Analytics.md
+++ b/docs/Analytics.md
@@ -18,14 +18,12 @@ Homebrew's analytics record some shared information for every event:
- If the Google Analytics anonymous IP setting is enabled, i.e. `1` (https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#aip)
- The Homebrew application name, e.g. `Homebrew` (https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#an)
- The Homebrew application version, e.g. `0.9.9` (https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#av)
-- The Homebrew analytics hit type, e.g. `screenview` (https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#t)
+- The Homebrew analytics hit type, e.g. `event` (https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#t)
Homebrew's analytics records the following different events:
-- a `screenview` hit type with the official Homebrew command you have run (with arguments stripped), e.g. `brew list` (not `brew list foo` or any external commands except `bundle` and `services`)
- an `event` hit type with the `install` event category and the Homebrew formula from a non-private GitHub tap you have requested to install plus any used options, e.g. `wget --with-pcre` as the action and an event label e.g. `macOS 10.12, non-/usr/local, CI` to indicate the OS version, non-standard installation location and invocation as part of CI. This allows us to identify the formulae that need fixing and where more easily.
- an `event` hit type with the `BuildError` event category and the Homebrew formula that failed to install, e.g. `wget` as the action and an event label e.g. `macOS 10.12`
-- an `exception` hit type with the `exception` event category and exception description of the exception name, e.g. `FormulaUnavailableError` and whether the exception was fatal e.g. `1`
You can also view all the information that is sent by Homebrew's analytics by setting `HOMEBREW_ANALYTICS_DEBUG=1` in your environment. Please note this will also stop any analytics from being sent.
diff --git a/docs/Manpage.md b/docs/Manpage.md
index 523eaf289..b679bd581 100644
--- a/docs/Manpage.md
+++ b/docs/Manpage.md
@@ -599,8 +599,7 @@ With `--verbose` or `-v`, many commands print extra debugging information. Note
Display the location in the cellar where `formula` is or would be installed.
* `--repository`:
- Display where Homebrew's `.git` directory is located. For standard installs,
- the `prefix` and `repository` are the same directory.
+ Display where Homebrew's `.git` directory is located.
* `--repository` `user``/``repo`:
Display where tap `user``/``repo`'s directory is located.
@@ -845,10 +844,8 @@ With `--verbose` or `-v`, many commands print extra debugging information. Note
If `--no-compat` is passed, do not load the compatibility layer when
running tests.
- If `--online` is passed, include tests that use the GitHub API.
-
- If `--official-cmd-taps` is passed, include tests that use any of the
- taps for official external commands.
+ If `--online` is passed, include tests that use the GitHub API and tests
+ that use any of the taps for official external commands.
* `update-test` [`--commit=``commit`] [`--before=``date`] [`--to-tag`] [`--keep-tmp`]:
Runs a test of `brew update` with a new repository clone.
diff --git a/docs/Python-for-Formula-Authors.md b/docs/Python-for-Formula-Authors.md
index ea86cf84c..8b4bc2cb4 100644
--- a/docs/Python-for-Formula-Authors.md
+++ b/docs/Python-for-Formula-Authors.md
@@ -98,14 +98,12 @@ def install
venv = virtualenv_create(libexec)
# Install all of the resources declared on the formula into the virtualenv.
venv.pip_install resources
- # `link_scripts` takes a look at the virtualenv's bin directory before and
- # after executing the block which is passed into it. If the block caused any
- # new scripts to be written to the virtualenv's bin directory, link_scripts
- # will symlink those scripts into the path given as its argument (here, the
- # formula's `bin` directory in the Cellar.)
- # `pip_install buildpath` will install the package that the formula points to,
- # because buildpath is the location where the formula's tarball was unpacked.
- venv.link_scripts(bin) { venv.pip_install buildpath }
+ # `pip_install_and_link` takes a look at the virtualenv's bin directory
+ # before and after installing its argument. New scripts will be symlinked
+ # into `bin`. `pip_install_and_link buildpath` will install the package
+ # that the formula points to, because buildpath is the location where the
+ # formula's tarball was unpacked.
+ venv.pip_install_and_link buildpath
end
```
diff --git a/docs/Xcode.md b/docs/Xcode.md
index 7c2cca5c8..21ad66f95 100644
--- a/docs/Xcode.md
+++ b/docs/Xcode.md
@@ -12,7 +12,7 @@ Tools available for your platform:
| 10.9 | 6.2 | 6.2 |
| 10.10 | 7.2.1 | 7.2 |
| 10.11 | 8.2.1 | 8.2 |
-| 10.12 | 8.3.2 | 8.3 |
+| 10.12 | 8.3.3 | 8.3 |
## Compiler version database
@@ -72,6 +72,7 @@ Tools available for your platform:
| 8.3 | β€” | β€” | β€” | β€” | 8.1 (802.0.38) | β€” |
| 8.3.1 | β€” | β€” | β€” | β€” | 8.1 (802.0.41) | β€” |
| 8.3.2 | β€” | β€” | β€” | β€” | 8.1 (802.0.42) | β€” |
+| 8.3.3 | β€” | β€” | β€” | β€” | 8.1 (802.0.42) | β€” |
## References to Xcode and compiler versions in code
When a new Xcode release is made, the following things need to be
diff --git a/manpages/brew.1 b/manpages/brew.1
index 5aa07a460..b16867186 100644
--- a/manpages/brew.1
+++ b/manpages/brew.1
@@ -624,7 +624,7 @@ Display the location in the cellar where \fIformula\fR is or would be installed\
.
.TP
\fB\-\-repository\fR
-Display where Homebrew\'s \fB\.git\fR directory is located\. For standard installs, the \fBprefix\fR and \fBrepository\fR are the same directory\.
+Display where Homebrew\'s \fB\.git\fR directory is located\.
.
.TP
\fB\-\-repository\fR \fIuser\fR\fB/\fR\fIrepo\fR
@@ -879,10 +879,7 @@ If \fB\-\-generic\fR is passed, only run OS\-agnostic tests\.
If \fB\-\-no\-compat\fR is passed, do not load the compatibility layer when running tests\.
.
.IP
-If \fB\-\-online\fR is passed, include tests that use the GitHub API\.
-.
-.IP
-If \fB\-\-official\-cmd\-taps\fR is passed, include tests that use any of the taps for official external commands\.
+If \fB\-\-online\fR is passed, include tests that use the GitHub API and tests that use any of the taps for official external commands\.
.
.TP
\fBupdate\-test\fR [\fB\-\-commit=\fR\fIcommit\fR] [\fB\-\-before=\fR\fIdate\fR] [\fB\-\-to\-tag\fR] [\fB\-\-keep\-tmp\fR]