
Usually, the "foo-version already installed" error is printed by FormulaInstaller. However, if an up-to-date formula that has outdated deps is passed on the command line, we proceed to upgrade the deps and then print a message saying that the formulae given on the command line is already installed. Catch this earlier, when the outdated list is being populated, print an appropriate message, and skip the up-to-date formula. Signed-off-by: Jack Nagel <jacknagel@gmail.com>
85 lines
2.5 KiB
Ruby
85 lines
2.5 KiB
Ruby
require 'cmd/install'
|
|
|
|
class Fixnum
|
|
def plural_s
|
|
if self > 1 then "s" else "" end
|
|
end
|
|
end
|
|
|
|
module Homebrew extend self
|
|
def upgrade
|
|
if Process.uid.zero? and not File.stat(HOMEBREW_BREW_FILE).uid.zero?
|
|
# note we only abort if Homebrew is *not* installed as sudo and the user
|
|
# calls brew as root. The fix is to chown brew to root.
|
|
abort "Cowardly refusing to `sudo brew upgrade'"
|
|
end
|
|
|
|
Homebrew.perform_preinstall_checks
|
|
|
|
outdated = if ARGV.named.empty?
|
|
require 'cmd/outdated'
|
|
Homebrew.outdated_brews
|
|
else
|
|
ARGV.formulae.select do |f|
|
|
if f.installed?
|
|
onoe "#{f}-#{f.installed_version} already installed"
|
|
elsif not f.rack.exist? or f.rack.children.empty?
|
|
onoe "#{f} not installed"
|
|
else
|
|
true
|
|
end
|
|
end
|
|
end
|
|
|
|
# Expand the outdated list to include outdated dependencies then sort and
|
|
# reduce such that dependencies are installed first and installation is not
|
|
# attempted twice. Sorting is implicit the way `recursive_deps` returns
|
|
# root dependencies at the head of the list and `uniq` keeps the first
|
|
# element it encounters and discards the rest.
|
|
ARGV.filter_for_dependencies do
|
|
outdated.map!{ |f| f.recursive_deps.reject{ |d| d.installed? } << f }
|
|
outdated.flatten!
|
|
outdated.uniq!
|
|
end unless ARGV.ignore_deps?
|
|
|
|
if outdated.length > 1
|
|
oh1 "Upgrading #{outdated.length} outdated package#{outdated.length.plural_s}, with result:"
|
|
puts outdated.map{ |f| "#{f.name} #{f.version}" } * ", "
|
|
end
|
|
|
|
outdated.each do |f|
|
|
upgrade_formula f
|
|
end
|
|
end
|
|
|
|
def upgrade_formula f
|
|
tab = Tab.for_formula(f)
|
|
outdated_keg = Keg.new(f.linked_keg.realpath) rescue nil
|
|
|
|
installer = FormulaInstaller.new(f, tab)
|
|
installer.show_header = false
|
|
installer.install_bottle = install_bottle?(f) and tab.used_options.empty?
|
|
|
|
oh1 "Upgrading #{f.name}"
|
|
|
|
# first we unlink the currently active keg for this formula otherwise it is
|
|
# possible for the existing build to interfere with the build we are about to
|
|
# do! Seriously, it happens!
|
|
outdated_keg.unlink if outdated_keg
|
|
|
|
installer.install
|
|
installer.caveats
|
|
installer.finish
|
|
rescue CannotInstallFormulaError => e
|
|
ofail e
|
|
rescue BuildError => e
|
|
e.dump
|
|
puts
|
|
Homebrew.failed = true
|
|
ensure
|
|
# restore previous installation state if build failed
|
|
outdated_keg.link if outdated_keg and not f.installed? rescue nil
|
|
end
|
|
|
|
end
|