brew/Library/Homebrew/cmd/upgrade.rb

96 lines
2.7 KiB
Ruby
Raw Normal View History

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
if ARGV.named.empty?
require 'cmd/outdated'
upgrade_pinned = false
outdated = Homebrew.outdated_brews
else
upgrade_pinned = true
outdated = ARGV.formulae.select do |f|
if f.installed?
onoe "#{f}-#{f.installed_version} already installed"
elsif not f.rack.directory? or f.rack.subdirs.empty?
onoe "#{f} not installed"
else
true
end
end
exit 1 if outdated.empty?
end
unless upgrade_pinned
pinned = outdated.select { |f| f.pinned? }
outdated -= pinned
end
if outdated.length > 0
oh1 "Upgrading #{outdated.length} outdated package#{outdated.length.plural_s}, with result:"
puts outdated.map{ |f| "#{f.name} #{f.version}" } * ", "
end
if not upgrade_pinned and pinned.length > 0
oh1 "Not upgrading #{pinned.length} pinned package#{outdated.length.plural_s}:"
puts pinned.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)
installer.tab = tab
installer.show_header = false
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
# If the formula was pinned, and we were force-upgrading it, unpin and
# pin it again to get a symlink pointing to the correct keg.
if f.pinned?
f.unpin
f.pin
end
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.
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