brew/Library/Homebrew/cmd/upgrade.rb
Jack Nagel c6b3cd7cf4 Don't lie about upgrading up-to-date formulae
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>
2012-08-18 19:33:39 -05:00

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