Clean up code style and remove .rubocop_todo.yml.

This commit is contained in:
Markus Reiter 2017-10-07 00:31:28 +02:00
parent 91ab116ace
commit 175ca909ee
44 changed files with 296 additions and 421 deletions

View File

@ -1,6 +1,5 @@
inherit_from:
- ../.rubocop.yml
- .rubocop_todo.yml
AllCops:
Include:
@ -26,9 +25,26 @@ Lint/NestedMethodDefinition:
Lint/ParenthesesAsGroupedExpression:
Enabled: true
Metrics/BlockNesting:
Max: 5
Metrics/ModuleLength:
Max: 360
Metrics/ParameterLists:
CountKeywordArgs: false
# we won't change backward compatible method names
Naming/MethodName:
Exclude:
- 'compat/**/*'
# we won't change backward compatible predicate names
Naming/PredicateName:
Exclude:
- 'compat/**/*'
NameWhitelist: is_32_bit?, is_64_bit?
Style/BlockDelimiters:
Exclude:
- '**/*_spec.rb'
@ -41,14 +57,3 @@ Style/GuardClause:
# hash-rockets preferred for formulae, a: 1 preferred elsewhere
Style/HashSyntax:
EnforcedStyle: ruby19_no_mixed_keys
# we won't change backward compatible method names
Naming/MethodName:
Exclude:
- 'compat/**/*'
# we won't change backward compatible predicate names
Naming/PredicateName:
Exclude:
- 'compat/**/*'
NameWhitelist: is_32_bit?, is_64_bit?

View File

@ -1,138 +0,0 @@
# This configuration was generated by
# `rubocop --auto-gen-config --exclude-limit 100`
# on 2017-01-27 21:44:55 +0000 using RuboCop version 0.47.1.
# The point is for the user to remove these configuration records
# one by one as the offenses are removed from the code base.
# Note that changes in the inspected code, or installation of new
# versions of RuboCop, may require this file to be generated again.
# Offense count: 17
Lint/HandleExceptions:
Exclude:
- 'cmd/install.rb'
- 'cmd/reinstall.rb'
- 'cmd/tap.rb'
- 'cmd/update-report.rb'
- 'cmd/upgrade.rb'
- 'cmd/uses.rb'
- 'descriptions.rb'
- 'diagnostic.rb'
- 'extend/ENV/super.rb'
- 'extend/pathname.rb'
- 'formula.rb'
- 'formula_versions.rb'
- 'test/ENV_test.rb'
# Offense count: 3
Lint/IneffectiveAccessModifier:
Exclude:
- 'formula.rb'
- 'version.rb'
# Offense count: 1
Lint/Loop:
Exclude:
- 'patch.rb'
# Offense count: 28
Lint/RescueException:
Exclude:
- 'brew.rb'
- 'build.rb'
- 'cmd/fetch.rb'
- 'cmd/reinstall.rb'
- 'cmd/update-report.rb'
- 'debrew.rb'
- 'dev-cmd/pull.rb'
- 'dev-cmd/test.rb'
- 'formula.rb'
- 'formula_installer.rb'
- 'migrator.rb'
- 'postinstall.rb'
- 'readall.rb'
- 'test.rb'
- 'test/ENV_test.rb'
- 'utils/fork.rb'
# Offense count: 1
Lint/ShadowedException:
Exclude:
- 'utils/fork.rb'
# Offense count: 13
# Configuration parameters: CountBlocks.
Metrics/BlockNesting:
Max: 5
# Offense count: 19
# Configuration parameters: CountComments.
Metrics/ModuleLength:
Max: 400
# Offense count: 1
# Configuration parameters: CountKeywordArgs.
Metrics/ParameterLists:
Max: 6
# Offense count: 2
Security/MarshalLoad:
Exclude:
- 'dependency.rb'
- 'utils/fork.rb'
# Offense count: 1
Naming/AccessorMethodName:
Exclude:
- 'extend/ENV/super.rb'
# Offense count: 6
Style/ClassVars:
Exclude:
- 'dev-cmd/audit.rb'
- 'formula_installer.rb'
- 'test/support/helper/fs_leak_logger.rb'
# Offense count: 13
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
# SupportedStyles: compact, expanded
Style/EmptyMethod:
Exclude:
- 'debrew/irb.rb'
- 'download_strategy.rb'
- 'extend/ENV/super.rb'
- 'formula.rb'
- 'patch.rb'
# Offense count: 13
# Configuration parameters: AllowedVariables.
Style/GlobalVars:
Exclude:
- 'diagnostic.rb'
- 'utils.rb'
# Offense count: 1
# Configuration parameters: EnforcedStyle, SupportedStyles.
# SupportedStyles: module_function, extend_self
Style/ModuleFunction:
Exclude:
- 'os/mac/xcode.rb'
# Offense count: 8
Style/MultilineBlockChain:
Exclude:
- 'cmd/search.rb'
- 'dev-cmd/aspell-dictionaries.rb'
- 'dev-cmd/audit.rb'
- 'dev-cmd/man.rb'
- 'diagnostic.rb'
- 'test/patching_test.rb'
# Offense count: 4
# Cop supports --auto-correct.
Style/MutableConstant:
Exclude:
- 'dependency_collector.rb'
- 'formulary.rb'
- 'tab.rb'
- 'tap.rb'

View File

@ -146,7 +146,7 @@ rescue MethodDeprecatedError => e
$stderr.puts " #{Formatter.url(e.issues_url)}"
end
exit 1
rescue Exception => e
rescue Exception => e # rubocop:disable Lint/RescueException
onoe e
if internal_cmd && defined?(OS::ISSUES_URL) &&
!ENV["HOMEBREW_NO_AUTO_UPDATE"]

View File

@ -190,7 +190,7 @@ begin
options = Options.create(ARGV.flags_only)
build = Build.new(formula, options)
build.install
rescue Exception => e
rescue Exception => e # rubocop:disable Lint/RescueException
Marshal.dump(e, error_pipe)
error_pipe.close
exit! 1

View File

@ -49,8 +49,10 @@ module Homebrew
if fetch_bottle?(f)
begin
fetch_formula(f.bottle)
rescue Exception => e
raise if ARGV.homebrew_developer? || e.is_a?(Interrupt)
rescue Interrupt
raise
rescue => e
raise if ARGV.homebrew_developer?
fetched_bottle = false
onoe e.message
opoo "Bottle fetch failed: fetching the source."

View File

@ -339,6 +339,7 @@ module Homebrew
rescue FormulaInstallationAlreadyAttemptedError
# We already attempted to install f as part of the dependency tree of
# another formula. In that case, don't generate an error, just move on.
return
rescue CannotInstallFormulaError => e
ofail e.message
end

View File

@ -47,8 +47,8 @@ module Homebrew
fi.install
fi.finish
rescue FormulaInstallationAlreadyAttemptedError
# next
rescue Exception
return
rescue Exception # rubocop:disable Lint/RescueException
ignore_interrupts { restore_backup(keg, keg_was_linked) }
raise
else

View File

@ -117,6 +117,7 @@ module Homebrew
case output_type
when :print
args << "--debug" if ARGV.debug?
args << "--display-cop-names" if ARGV.include? "--display-cop-names"
args << "--format" << "simple" if files
system(cache_env, "rubocop", "_#{HOMEBREW_RUBOCOP_VERSION}_", *args)

View File

@ -54,8 +54,7 @@ module Homebrew
quiet: ARGV.quieter?
rescue TapRemoteMismatchError => e
odie e
rescue TapAlreadyTappedError, TapAlreadyUnshallowError
# Do nothing.
rescue TapAlreadyTappedError, TapAlreadyUnshallowError # rubocop:disable Lint/HandleExceptions
end
end
end

View File

@ -372,7 +372,7 @@ class Reporter
new_version = formula.pkg_version
old_version = FormulaVersions.new(formula).formula_at_revision(@initial_revision, &:pkg_version)
next if new_version == old_version
rescue Exception => e
rescue Exception => e # rubocop:disable Lint/RescueException
onoe "#{e.message}\n#{e.backtrace.join "\n"}" if ARGV.homebrew_developer?
end
@report[:M] << tap.formula_file_to_name(src)
@ -460,7 +460,7 @@ class Reporter
unless Formulary.factory(new_full_name).keg_only?
system HOMEBREW_BREW_FILE, "link", new_full_name, "--overwrite"
end
rescue Exception => e
rescue Exception => e # rubocop:disable Lint/RescueException
onoe "#{e.message}\n#{e.backtrace.join "\n"}" if ARGV.homebrew_developer?
end
next
@ -521,7 +521,7 @@ class Reporter
begin
f = Formulary.factory(new_full_name)
rescue Exception => e
rescue Exception => e # rubocop:disable Lint/RescueException
onoe "#{e.message}\n#{e.backtrace.join "\n"}" if ARGV.homebrew_developer?
next
end

View File

@ -150,6 +150,7 @@ module Homebrew
rescue FormulaInstallationAlreadyAttemptedError
# We already attempted to upgrade f as part of the dependency tree of
# another formula. In that case, don't generate an error, just move on.
return
rescue CannotInstallFormulaError => e
ofail e
rescue BuildError => e

View File

@ -74,12 +74,13 @@ module Homebrew
end
end
dep_formulae = deps.map do |dep|
dep_formulae = deps.flat_map do |dep|
begin
dep.to_formula
rescue
[]
end
end.compact
end
reqs_by_formula = ([f] + dep_formulae).flat_map do |formula|
formula.requirements.map { |req| [formula, req] }
@ -118,6 +119,7 @@ module Homebrew
rescue FormulaUnavailableError
# Silently ignore this case as we don't care about things used in
# taps that aren't currently tapped.
next
end
end
end

View File

@ -9,7 +9,7 @@ module Debrew
module Raise
def raise(*)
super
rescue Exception => e
rescue Exception => e # rubocop:disable Lint/RescueException
e.extend(Ignorable)
super(e) unless Debrew.debug(e) == :ignore
end
@ -92,7 +92,7 @@ module Debrew
yield
rescue SystemExit
original_raise
rescue Exception => e
rescue Exception => e # rubocop:disable Lint/RescueException
debug(e)
ensure
@active = false
@ -119,7 +119,7 @@ module Debrew
if e.is_a?(Ignorable)
menu.choice(:irb) do
puts "When you exit this IRB session, execution will continue."
set_trace_func proc { |event, _, _, id, binding, klass|
set_trace_func proc { |event, _, _, id, binding, klass| # rubocop:disable Metrics/ParameterLists
if klass == Raise && id == :raise && event == "return"
set_trace_func(nil)
synchronize { IRB.start_within(binding) }

View File

@ -4,8 +4,7 @@ module IRB
@setup_done = false
extend Module.new {
def parse_opts
end
def parse_opts; end
def start_within(binding)
unless @setup_done

View File

@ -64,7 +64,7 @@ class Dependency
end
def self._load(marshaled)
new(*Marshal.load(marshaled))
new(*Marshal.load(marshaled)) # rubocop:disable Security/MarshalLoad
end
class << self

View File

@ -4,6 +4,7 @@ require "ld64_dependency"
require "requirement"
require "requirements"
require "set"
require "extend/cachable"
## A dependency is a formula that another formula needs to install.
## A requirement is something other than a formula that another formula
@ -16,17 +17,13 @@ require "set"
# This class is used by `depends_on` in the formula DSL to turn dependency
# specifications into the proper kinds of dependencies and requirements.
class DependencyCollector
extend Cachable
# Define the languages that we can handle as external dependencies.
LANGUAGE_MODULES = Set[
:lua, :lua51, :perl, :python, :python3, :ruby
].freeze
CACHE = {}
def self.clear_cache
CACHE.clear
end
attr_reader :deps, :requirements
def initialize
@ -45,7 +42,7 @@ class DependencyCollector
end
def fetch(spec)
CACHE.fetch(cache_key(spec)) { |key| CACHE[key] = build(spec) }
self.class.cache.fetch(cache_key(spec)) { |key| self.class.cache[key] = build(spec) }
end
def cache_key(spec)

View File

@ -78,10 +78,10 @@ class Descriptions
formula_names.each do |name|
begin
desc = Formulary.factory(name).desc
@cache[name] = Formulary.factory(name).desc
rescue FormulaUnavailableError, *FormulaVersions::IGNORED_EXCEPTIONS
@cache.delete(name)
end
@cache[name] = desc
end
save_cache if options[:save]
end

View File

@ -27,13 +27,12 @@ module Homebrew
end
end
languages.inject([]) do |resources, (lang, path)|
languages.each do |lang, path|
r = Resource.new(lang)
r.owner = Formulary.factory("aspell")
r.url "#{dict_url}/#{path}"
r.mirror "#{dict_mirror}/#{path}"
resources << r
end.each(&:fetch).each do |r|
r.fetch
puts <<-EOS
option "with-lang-#{r.name}", "Install #{r.name} dictionary"
resource "#{r.name}" do

View File

@ -53,7 +53,7 @@ module Homebrew
module_function
def audit
Homebrew.inject_dump_stats!(FormulaAuditor, /^audit_/) if ARGV.switch? "D"
inject_dump_stats!(FormulaAuditor, /^audit_/) if ARGV.switch? "D"
Homebrew.auditing = true
formula_count = 0
@ -387,8 +387,10 @@ class FormulaAuditor
end
end
# core aliases + tap alias names + tap alias full name
@@aliases ||= Formula.aliases + Formula.tap_aliases
def self.aliases
# core aliases + tap alias names + tap alias full name
@aliases ||= Formula.aliases + Formula.tap_aliases
end
def audit_formula_name
return unless @strict
@ -442,7 +444,7 @@ class FormulaAuditor
problem "Dependency '#{dep.name}' was renamed; use new name '#{dep_f.name}'."
end
if @@aliases.include?(dep.name) &&
if self.class.aliases.include?(dep.name) &&
(dep_f.core_formula? || !dep_f.versioned_formula?)
problem "Dependency '#{dep.name}' is an alias; use the canonical name '#{dep.to_formula.full_name}'."
end
@ -453,16 +455,16 @@ class FormulaAuditor
problem "Dependency '#{dep.name}' may be unnecessary as it is provided by macOS; try to build this formula without it."
end
dep.options.reject do |opt|
next true if dep_f.option_defined?(opt)
dep_f.requirements.detect do |r|
dep.options.each do |opt|
next if dep_f.option_defined?(opt)
next if dep_f.requirements.detect do |r|
if r.recommended?
opt.name == "with-#{r.name}"
elsif r.optional?
opt.name == "without-#{r.name}"
end
end
end.each do |opt|
problem "Dependency #{dep} does not define option #{opt.name.inspect}"
end

View File

@ -75,7 +75,7 @@ module Homebrew
@put_filenames ||= []
return if @put_filenames.include? filename
return if @put_filenames.include?(filename)
puts Formatter.error(filename.to_s)
@put_filenames << filename
@ -84,8 +84,7 @@ module Homebrew
result = false
keg.each_unique_file_matching(string) do |file|
# skip document file.
next if Metafiles::EXTENSIONS.include? file.extname
next if Metafiles::EXTENSIONS.include?(file.extname) # Skip document files.
linked_libraries = Keg.file_linked_libraries(file, string)
result ||= !linked_libraries.empty?
@ -156,9 +155,7 @@ module Homebrew
return ofail "Formula not installed or up-to-date: #{f.full_name}"
end
tap = f.tap
unless tap
unless tap = f.tap
unless ARGV.include?("--force-core-tap")
return ofail "Formula not from core or any taps: #{f.full_name}"
end

View File

@ -48,12 +48,9 @@ module Homebrew
def path_glob_commands(glob)
Pathname.glob(glob)
.sort_by { |source_file| sort_key_for_path(source_file) }
.map do |source_file|
source_file.read.lines
.grep(/^#:/)
.map { |line| line.slice(2..-1) }
.join
end.reject { |s| s.strip.empty? || s.include?("@hide_from_man_page") }
.map(&:read).map(&:lines)
.map { |lines| lines.grep(/^#:/).map { |line| line.slice(2..-1) }.join }
.reject { |s| s.strip.empty? || s.include?("@hide_from_man_page") }
end
def build_man_page

View File

@ -154,8 +154,8 @@ module Homebrew
begin
f = Formula[name]
# Make sure we catch syntax errors.
rescue Exception
rescue Exception # rubocop:disable Lint/RescueException
# Make sure we catch syntax errors.
next
end

View File

@ -84,7 +84,7 @@ module Homebrew
rescue ::Test::Unit::AssertionFailedError => e
ofail "#{f.full_name}: failed"
puts e.message
rescue Exception => e
rescue Exception => e # rubocop:disable Lint/RescueException
ofail "#{f.full_name}: failed"
puts e, e.backtrace
ensure

View File

@ -151,8 +151,10 @@ module Homebrew
return unless File.directory?(dir)
files = Dir.chdir(dir) do
Dir[pattern].select { |f| File.file?(f) && !File.symlink?(f) } - Dir.glob(white_list)
end.map { |file| File.join(dir, file) }
(Dir.glob(pattern) - Dir.glob(white_list))
.select { |f| File.file?(f) && !File.symlink?(f) }
.map { |f| File.join(dir, f) }
end
return if files.empty?
inject_file_list(files, message)
@ -427,15 +429,15 @@ module Homebrew
end
def check_user_path_1
$seen_prefix_bin = false
$seen_prefix_sbin = false
@seen_prefix_bin = false
@seen_prefix_sbin = false
message = ""
paths(ENV["HOMEBREW_PATH"]).each do |p|
case p
when "/usr/bin"
unless $seen_prefix_bin
unless @seen_prefix_bin
# only show the doctor message if there are any conflicts
# rationale: a default install should not trigger any brew doctor messages
conflicts = Dir["#{HOMEBREW_PREFIX}/bin/*"]
@ -458,9 +460,9 @@ module Homebrew
end
end
when "#{HOMEBREW_PREFIX}/bin"
$seen_prefix_bin = true
@seen_prefix_bin = true
when "#{HOMEBREW_PREFIX}/sbin"
$seen_prefix_sbin = true
@seen_prefix_sbin = true
end
end
@ -468,7 +470,7 @@ module Homebrew
end
def check_user_path_2
return if $seen_prefix_bin
return if @seen_prefix_bin
<<-EOS.undent
Homebrew's bin was not found in your PATH.
@ -478,7 +480,7 @@ module Homebrew
end
def check_user_path_3
return if $seen_prefix_sbin
return if @seen_prefix_sbin
# Don't complain about sbin not being in the path if it doesn't exist
sbin = HOMEBREW_PREFIX/"sbin"
@ -952,6 +954,7 @@ module Homebrew
Putting non-prefixed coreutils in your path can cause gmp builds to fail.
EOS
rescue FormulaUnavailableError
return
end
def check_for_non_prefixed_findutils
@ -966,6 +969,7 @@ module Homebrew
Putting non-prefixed findutils in your path can cause python builds to fail.
EOS
rescue FormulaUnavailableError
return
end
def check_for_pydistutils_cfg_in_home

View File

@ -18,8 +18,7 @@ class AbstractDownloadStrategy
end
# Download and cache the resource as {#cached_location}.
def fetch
end
def fetch; end
# Suppress output
def shutup!
@ -37,13 +36,11 @@ class AbstractDownloadStrategy
# Unpack {#cached_location} into the current working directory, and possibly
# chdir into the newly-unpacked directory.
# Unlike {Resource#stage}, this does not take a block.
def stage
end
def stage; end
# @!attribute [r] cached_location
# The path to the cached file or directory associated with the resource.
def cached_location
end
def cached_location; end
# @!attribute [r]
# return most recent modified time for all files in the current working directory after stage.
@ -204,14 +201,11 @@ class VCSDownloadStrategy < AbstractDownloadStrategy
true
end
def clone_repo
end
def clone_repo; end
def update
end
def update; end
def current_revision
end
def current_revision; end
def extract_ref(specs)
key = REF_TYPES.find { |type| specs.key?(type) }

View File

@ -24,8 +24,7 @@ module Superenv
end
# @private
def self.bin
end
def self.bin; end
def reset
super
@ -324,11 +323,9 @@ module Superenv
end
end
def set_x11_env_if_installed
end
def set_x11_env_if_installed; end
def set_cpu_flags(*)
end
def set_cpu_flags(_, _ = "", _ = {}); end
end
require "extend/os/extend/ENV/super"

View File

@ -0,0 +1,9 @@
module Cachable
def cache
@cache ||= {}
end
def clear_cache
cache.clear
end
end

View File

@ -186,7 +186,7 @@ class Pathname
begin
tf.chown(uid, gid)
tf.chmod(old_stat.mode)
rescue Errno::EPERM
rescue Errno::EPERM # rubocop:disable Lint/HandleExceptions
end
File.rename(tf.path, self)

View File

@ -1041,14 +1041,14 @@ class Formula
# keg's formula is deleted.
begin
keg = Keg.for(path)
rescue NotAKegError, Errno::ENOENT
rescue NotAKegError, Errno::ENOENT # rubocop:disable Lint/HandleExceptions
# file doesn't belong to any keg.
else
tab_tap = Tab.for_keg(keg).tap
return false if tab_tap.nil? # this keg doesn't below to any core/tap formula, most likely coming from a DIY install.
begin
Formulary.factory(keg.name)
rescue FormulaUnavailableError
rescue FormulaUnavailableError # rubocop:disable Lint/HandleExceptions
# formula for this keg is deleted, so defer to whitelist
rescue TapFormulaAmbiguityError, TapFormulaWithOldnameAmbiguityError
return false # this keg belongs to another formula
@ -1379,12 +1379,13 @@ class Formula
# An array of all installed {Formula}
# @private
def self.installed
@installed ||= racks.map do |rack|
@installed ||= racks.flat_map do |rack|
begin
Formulary.from_rack(rack)
rescue FormulaUnavailableError, TapFormulaAmbiguityError, TapFormulaWithOldnameAmbiguityError
[]
end
end.compact.uniq(&:name)
end.uniq(&:name)
end
def self.installed_with_alias_path(alias_path)
@ -1642,7 +1643,7 @@ class Formula
with_logging("test") do
test
end
rescue Exception
rescue Exception # rubocop:disable Lint/RescueException
staging.retain! if ARGV.debug?
raise
end
@ -1667,8 +1668,7 @@ class Formula
end
# @private
def test
end
def test; end
# @private
def test_fixtures(file)
@ -1683,8 +1683,7 @@ class Formula
# system "./configure", "--prefix=#{prefix}"
# system "make", "install"
# end</pre>
def install
end
def install; end
protected
@ -1932,29 +1931,29 @@ class Formula
end
end
def self.method_added(method)
case method
when :brew
raise "You cannot override Formula#brew in class #{name}"
when :test
define_method(:test_defined?) { true }
when :options
instance = allocate
specs.each do |spec|
instance.options.each do |opt, desc|
spec.option(opt[/^--(.+)$/, 1], desc)
end
end
remove_method(:options)
end
end
# The methods below define the formula DSL.
class << self
include BuildEnvironment::DSL
def method_added(method)
case method
when :brew
raise "You cannot override Formula#brew in class #{name}"
when :test
define_method(:test_defined?) { true }
when :options
instance = allocate
specs.each do |spec|
instance.options.each do |opt, desc|
spec.option(opt[/^--(.+)$/, 1], desc)
end
end
remove_method(:options)
end
end
# The reason for why this software is not linked (by default) to
# {::HOMEBREW_PREFIX}.
# @private

View File

@ -58,13 +58,14 @@ class FormulaInstaller
@options = Options.new
@invalid_option_names = []
@requirement_messages = []
@@attempted ||= Set.new
@poured_bottle = false
@pour_failed = false
end
def self.attempted
@attempted ||= Set.new
end
# When no build tools are available and build flags are passed through ARGV,
# it's necessary to interrupt the user before any sort of installation
# can proceed. Only invoked when the user has no developer tools.
@ -145,7 +146,7 @@ class FormulaInstaller
end
def check_install_sanity
raise FormulaInstallationAlreadyAttemptedError, formula if @@attempted.include?(formula)
raise FormulaInstallationAlreadyAttemptedError, formula if self.class.attempted.include?(formula)
return if ignore_deps?
@ -287,12 +288,12 @@ class FormulaInstaller
end
end
@@attempted << formula
self.class.attempted << formula
if pour_bottle?(warn: true)
begin
pour
rescue Exception => e
rescue Exception => e # rubocop:disable Lint/RescueException
# any exceptions must leave us with nothing installed
ignore_interrupts do
formula.prefix.rmtree if formula.prefix.directory?
@ -567,7 +568,7 @@ class FormulaInstaller
oh1 "Installing #{formula.full_name} dependency: #{Formatter.identifier(dep.name)}"
fi.install
fi.finish
rescue Exception
rescue Exception # rubocop:disable Lint/RescueException
ignore_interrupts do
tmp_keg.rename(installed_keg) if tmp_keg && !installed_keg.directory?
linked_keg.link if keg_was_linked
@ -723,7 +724,7 @@ class FormulaInstaller
if !formula.prefix.directory? || Keg.new(formula.prefix).empty_installation?
raise "Empty installation"
end
rescue Exception => e
rescue Exception => e # rubocop:disable Lint/RescueException
e.options = display_options(formula) if e.is_a?(BuildError)
ignore_interrupts do
# any exceptions must leave us with nothing installed
@ -784,7 +785,7 @@ class FormulaInstaller
puts " brew link #{formula.name}"
@show_summary_heading = true
Homebrew.failed = true
rescue Exception => e
rescue Exception => e # rubocop:disable Lint/RescueException
onoe "An unexpected error occurred during the `brew link` step"
puts "The formula built, but is not symlinked into #{HOMEBREW_PREFIX}"
puts e
@ -815,7 +816,7 @@ class FormulaInstaller
formula.plist_path.chmod 0644
log = formula.var/"log"
log.mkpath if formula.plist.include? log.to_s
rescue Exception => e
rescue Exception => e # rubocop:disable Lint/RescueException
onoe "Failed to install plist file"
ohai e, e.backtrace if debug?
Homebrew.failed = true
@ -823,7 +824,7 @@ class FormulaInstaller
def fix_dynamic_linkage(keg)
keg.fix_dynamic_linkage
rescue Exception => e
rescue Exception => e # rubocop:disable Lint/RescueException
onoe "Failed to fix install linkage"
puts "The formula built, but you may encounter issues using it or linking other"
puts "formula against it."
@ -835,7 +836,7 @@ class FormulaInstaller
def clean
ohai "Cleaning" if verbose?
Cleaner.new(formula).clean
rescue Exception => e
rescue Exception => e # rubocop:disable Lint/RescueException
opoo "The cleaning step did not complete successfully"
puts "Still, the installation was successful, so we will link it into your prefix"
ohai e, e.backtrace if debug?
@ -845,7 +846,7 @@ class FormulaInstaller
def post_install
Homebrew.run_post_install(formula)
rescue Exception => e
rescue Exception => e # rubocop:disable Lint/RescueException
opoo "The post-install step did not complete successfully"
puts "You can try again using `brew postinstall #{formula.full_name}`"
ohai e, e.backtrace if debug?
@ -905,27 +906,31 @@ class FormulaInstaller
super
end
def self.locked
@locked ||= []
end
private
attr_predicate :hold_locks?
def lock
return unless (@@locked ||= []).empty?
return unless self.class.locked.empty?
unless ignore_deps?
formula.recursive_dependencies.each do |dep|
@@locked << dep.to_formula
self.class.locked << dep.to_formula
end
end
@@locked.unshift(formula)
@@locked.uniq!
@@locked.each(&:lock)
self.class.locked.unshift(formula)
self.class.locked.uniq!
self.class.locked.each(&:lock)
@hold_locks = true
end
def unlock
return unless hold_locks?
@@locked.each(&:unlock)
@@locked.clear
self.class.locked.each(&:unlock)
self.class.locked.clear
@hold_locks = false
end

View File

@ -44,7 +44,7 @@ class FormulaVersions
# continue walking the history
ohai "#{e} in #{name} at revision #{rev}", e.backtrace if ARGV.debug?
rescue FormulaUnavailableError
# Suppress this error
return
ensure
Homebrew.raise_deprecation_exceptions = false
end

View File

@ -1,18 +1,19 @@
require "digest/md5"
require "tap"
require "extend/cachable"
# The Formulary is responsible for creating instances of Formula.
# It is not meant to be used directly from formulae.
module Formulary
FORMULAE = {}
extend Cachable
def self.formula_class_defined?(path)
FORMULAE.key?(path)
cache.key?(path)
end
def self.formula_class_get(path)
FORMULAE.fetch(path)
cache.fetch(path)
end
def self.load_formula(name, path, contents, namespace)
@ -44,7 +45,7 @@ module Formulary
contents = path.open("r") { |f| ensure_utf8_encoding(f).read }
namespace = "FormulaNamespace#{Digest::MD5.hexdigest(path.to_s)}"
klass = load_formula(name, path, contents, namespace)
FORMULAE[path] = klass
cache[path] = klass
end
if IO.method_defined?(:set_encoding)

View File

@ -100,7 +100,7 @@ class Migrator
begin
migrator = Migrator.new(formula)
migrator.migrate
rescue Exception => e
rescue => e
onoe e
end
end
@ -196,7 +196,7 @@ class Migrator
update_tabs
rescue Interrupt
ignore_interrupts { backup_oldname }
rescue Exception => e
rescue Exception => e # rubocop:disable Lint/RescueException
onoe "Error occurred while migrating."
puts e
puts e.backtrace if ARGV.debug?
@ -304,7 +304,7 @@ class Migrator
puts
puts "You can try again using:"
puts " brew link #{formula.name}"
rescue Exception => e
rescue Exception => e # rubocop:disable Lint/RescueException
onoe "An unexpected error occurred during linking"
puts e
puts e.backtrace if ARGV.debug?

View File

@ -183,7 +183,7 @@ module OS
end
module CLT
extend self
module_function
STANDALONE_PKG_ID = "com.apple.pkg.DeveloperToolsCLILeo".freeze
FROM_XCODE_PKG_ID = "com.apple.pkg.DeveloperToolsCLI".freeze

View File

@ -60,8 +60,7 @@ class EmbeddedPatch
false
end
def contents
end
def contents; end
def apply
data = contents.gsub("HOMEBREW_PREFIX", HOMEBREW_PREFIX)
@ -87,10 +86,13 @@ class DATAPatch < EmbeddedPatch
def contents
data = ""
path.open("rb") do |f|
begin
loop do
line = f.gets
end until line.nil? || line =~ /^__END__$/
data << line while line = f.gets
break if line.nil? || line =~ /^__END__$/
end
while line = f.gets
data << line
end
end
data
end

View File

@ -14,7 +14,7 @@ begin
formula = ARGV.resolved_formulae.first
formula.extend(Debrew::Formula) if ARGV.debug?
formula.run_post_install
rescue Exception => e
rescue Exception => e # rubocop:disable Lint/RescueException
Marshal.dump(e, error_pipe)
error_pipe.close
exit! 1

View File

@ -52,7 +52,7 @@ module Readall
Formulary.factory(file)
rescue Interrupt
raise
rescue Exception => e
rescue Exception => e # rubocop:disable Lint/RescueException
onoe "Invalid formula: #{file}"
puts e
failed = true

View File

@ -3,18 +3,16 @@ require "ostruct"
require "options"
require "json"
require "development_tools"
require "extend/cachable"
# Inherit from OpenStruct to gain a generic initialization method that takes a
# hash and creates an attribute for each key and value. `Tab.new` probably
# should not be called directly, instead use one of the class methods like
# `Tab.create`.
class Tab < OpenStruct
FILENAME = "INSTALL_RECEIPT.json".freeze
CACHE = {}
extend Cachable
def self.clear_cache
CACHE.clear
end
FILENAME = "INSTALL_RECEIPT.json".freeze
# Instantiates a Tab for a new installation of a formula.
def self.create(formula, compiler, stdlib)
@ -57,7 +55,7 @@ class Tab < OpenStruct
# Returns the Tab for an install receipt at `path`.
# Results are cached.
def self.from_file(path)
CACHE.fetch(path) { |p| CACHE[p] = from_file_content(File.read(p), p) }
cache.fetch(path) { |p| cache[p] = from_file_content(File.read(p), p) }
end
# Like Tab.from_file, but bypass the cache.
@ -343,7 +341,7 @@ class Tab < OpenStruct
# will no longer be valid.
Formula.clear_installed_formulae_cache unless tabfile.exist?
CACHE[tabfile] = self
self.class.cache[tabfile] = self
tabfile.atomic_write(to_json)
end

View File

@ -1,4 +1,5 @@
require "extend/string"
require "extend/cachable"
require "readall"
# a {Tap} is used to extend the formulae provided by Homebrew core.
@ -8,14 +9,10 @@ require "readall"
# {#user} represents Github username and {#repo} represents repository
# name without leading `homebrew-`.
class Tap
extend Cachable
TAP_DIRECTORY = HOMEBREW_LIBRARY/"Taps"
CACHE = {}
def self.clear_cache
CACHE.clear
end
def self.fetch(*args)
case args.length
when 1
@ -38,7 +35,7 @@ class Tap
end
cache_key = "#{user}/#{repo}".downcase
CACHE.fetch(cache_key) { |key| CACHE[key] = Tap.new(user, repo) }
cache.fetch(cache_key) { |key| cache[key] = Tap.new(user, repo) }
end
def self.from_path(path)

View File

@ -27,7 +27,7 @@ begin
Timeout.timeout TEST_TIMEOUT_SECONDS do
raise "test returned false" if formula.run_test == false
end
rescue Exception => e
rescue Exception => e # rubocop:disable Lint/RescueException
Marshal.dump(e, error_pipe)
error_pipe.close
exit! 1

View File

@ -107,7 +107,7 @@ describe FormulaInstaller do
end
EOS
Formulary::FORMULAE.delete(dep_path)
Formulary.cache.delete(dep_path)
dependency = Formulary.factory(dep_name)
dependent = formula do

View File

@ -229,10 +229,9 @@ module Homebrew
EOS
end
# Hash of Module => Set(method_names)
@injected_dump_stat_modules = {}
# rubocop:disable Style/GlobalVars
def inject_dump_stats!(the_module, pattern)
@injected_dump_stat_modules ||= {}
@injected_dump_stat_modules[the_module] ||= []
injected_methods = @injected_dump_stat_modules[the_module]
the_module.module_eval do
@ -260,6 +259,7 @@ module Homebrew
end
end
end
# rubocop:enable Style/GlobalVars
end
def with_system_path

View File

@ -14,7 +14,7 @@ module Utils
read.close
write.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC)
yield
rescue Exception => e
rescue Exception => e # rubocop:disable Lint/RescueException
Marshal.dump(e, write)
write.close
exit!
@ -26,8 +26,11 @@ module Utils
ignore_interrupts(:quietly) do # the child will receive the interrupt and marshal it back
begin
socket = server.accept_nonblock
# rubocop:disable Lint/ShadowedException
# FIXME: https://github.com/bbatsov/rubocop/issues/4843
rescue Errno::EAGAIN, Errno::EWOULDBLOCK, Errno::ECONNABORTED, Errno::EPROTO, Errno::EINTR
retry unless Process.waitpid(pid, Process::WNOHANG)
# rubocop:enable Lint/ShadowedException
else
socket.send_io(write)
socket.close
@ -36,7 +39,7 @@ module Utils
data = read.read
read.close
Process.wait(pid) unless socket.nil?
raise Marshal.load(data) unless data.nil? || data.empty?
raise Marshal.load(data) unless data.nil? || data.empty? # rubocop:disable Security/MarshalLoad
raise Interrupt if $CHILD_STATUS.exitstatus == 130
raise "Forked child process failed: #{$CHILD_STATUS}" unless $CHILD_STATUS.success?
end

View File

@ -213,110 +213,6 @@ class Version
end
end
def initialize(val)
unless val.respond_to?(:to_str)
raise TypeError, "Version value must be a string; got a #{val.class} (#{val})"
end
@version = val.to_str
end
def detected_from_url?
false
end
def head?
false
end
def null?
false
end
def <=>(other)
# Needed to retain API compatibility with older string comparisons
# for compiler versions, etc.
other = Version.new(other) if other.is_a? String
# Used by the *_build_version comparisons, which formerly returned Fixnum
other = Version.new(other.to_s) if other.is_a? Integer
return 1 if other.nil?
return unless other.is_a?(Version)
return 0 if version == other.version
return 1 if head? && !other.head?
return -1 if !head? && other.head?
return 0 if head? && other.head?
ltokens = tokens
rtokens = other.tokens
max = max(ltokens.length, rtokens.length)
l = r = 0
while l < max
a = ltokens[l] || NULL_TOKEN
b = rtokens[r] || NULL_TOKEN
if a == b
l += 1
r += 1
next
elsif a.numeric? && b.numeric?
return a <=> b
elsif a.numeric?
return 1 if a > NULL_TOKEN
l += 1
elsif b.numeric?
return -1 if b > NULL_TOKEN
r += 1
else
return a <=> b
end
end
0
end
alias eql? ==
def hash
version.hash
end
def to_f
version.to_f
end
def to_s
version.dup
end
alias to_str to_s
protected
attr_reader :version
def tokens
@tokens ||= tokenize
end
private
def max(a, b)
(a > b) ? a : b
end
def tokenize
version.scan(SCAN_PATTERN).map! do |token|
case token
when /\A#{AlphaToken::PATTERN}\z/o then AlphaToken
when /\A#{BetaToken::PATTERN}\z/o then BetaToken
when /\A#{RCToken::PATTERN}\z/o then RCToken
when /\A#{PreToken::PATTERN}\z/o then PreToken
when /\A#{PatchToken::PATTERN}\z/o then PatchToken
when /\A#{NumericToken::PATTERN}\z/o then NumericToken
when /\A#{StringToken::PATTERN}\z/o then StringToken
end.new(token)
end
end
def self.parse(spec)
version = _parse(spec)
version.nil? ? NULL : new(version)
@ -461,6 +357,112 @@ class Version
m = /[-.vV]?((?:\d+\.)+\d+(?:[-_.]?(?i:alpha|beta|pre|rc)\.?\d{,2})?)/.match(spec_s)
return m.captures.first unless m.nil?
end
private_class_method :_parse
def initialize(val)
unless val.respond_to?(:to_str)
raise TypeError, "Version value must be a string; got a #{val.class} (#{val})"
end
@version = val.to_str
end
def detected_from_url?
false
end
def head?
false
end
def null?
false
end
def <=>(other)
# Needed to retain API compatibility with older string comparisons
# for compiler versions, etc.
other = Version.new(other) if other.is_a? String
# Used by the *_build_version comparisons, which formerly returned Fixnum
other = Version.new(other.to_s) if other.is_a? Integer
return 1 if other.nil?
return unless other.is_a?(Version)
return 0 if version == other.version
return 1 if head? && !other.head?
return -1 if !head? && other.head?
return 0 if head? && other.head?
ltokens = tokens
rtokens = other.tokens
max = max(ltokens.length, rtokens.length)
l = r = 0
while l < max
a = ltokens[l] || NULL_TOKEN
b = rtokens[r] || NULL_TOKEN
if a == b
l += 1
r += 1
next
elsif a.numeric? && b.numeric?
return a <=> b
elsif a.numeric?
return 1 if a > NULL_TOKEN
l += 1
elsif b.numeric?
return -1 if b > NULL_TOKEN
r += 1
else
return a <=> b
end
end
0
end
alias eql? ==
def hash
version.hash
end
def to_f
version.to_f
end
def to_s
version.dup
end
alias to_str to_s
protected
attr_reader :version
def tokens
@tokens ||= tokenize
end
private
def max(a, b)
(a > b) ? a : b
end
def tokenize
version.scan(SCAN_PATTERN).map! do |token|
case token
when /\A#{AlphaToken::PATTERN}\z/o then AlphaToken
when /\A#{BetaToken::PATTERN}\z/o then BetaToken
when /\A#{RCToken::PATTERN}\z/o then RCToken
when /\A#{PreToken::PATTERN}\z/o then PreToken
when /\A#{PatchToken::PATTERN}\z/o then PatchToken
when /\A#{NumericToken::PATTERN}\z/o then NumericToken
when /\A#{StringToken::PATTERN}\z/o then StringToken
end.new(token)
end
end
end
class HeadVersion < Version