update-report: refactoring

* Better variable/class name. `update-report` isn't response to actual
  update.
* Use abstraction offered by Reporter and ReproterHub class.
* Failure on one tap won't affect migration preformed by other taps.
* Simplify logic and prepare for core/formula separation.
This commit is contained in:
Xu Cheng 2016-02-25 16:41:34 +08:00
parent 95a6067702
commit 239c860863

View File

@ -9,25 +9,34 @@ module Homebrew
# migrate to new directories based tap structure
migrate_taps
report = Report.new
master_updater = Reporter.new(HOMEBREW_REPOSITORY)
master_updated = master_updater.updated?
if master_updated
initial_short = shorten_revision(master_updater.initial_revision)
current_short = shorten_revision(master_updater.current_revision)
puts "Updated Homebrew from #{initial_short} to #{current_short}."
hub = ReporterHub.new
begin
master_reporter = Reporter.new(CoreFormulaRepository.instance)
rescue Reporter::ReporterRevisionUnsetError => e
raise e if ARGV.homebrew_developer?
odie "update-report should not be called directly!"
end
if master_reporter.updated?
initial_short = shorten_revision(master_reporter.initial_revision)
current_short = shorten_revision(master_reporter.current_revision)
puts "Updated Homebrew from #{initial_short} to #{current_short}."
hub.add(master_reporter)
end
report.update(master_updater.report)
updated_taps = []
Tap.each do |tap|
next unless tap.git?
tap.path.cd do
updater = Reporter.new(tap.path)
updated_taps << tap.name if updater.updated?
report.update(updater.report) do |_key, oldval, newval|
oldval.concat(newval)
end
begin
reporter = Reporter.new(tap)
rescue Reporter::ReporterRevisionUnsetError => e
onoe e if ARGV.homebrew_developer?
next
end
if reporter.updated?
updated_taps << tap.name
hub.add(reporter)
end
end
unless updated_taps.empty?
@ -35,81 +44,24 @@ module Homebrew
"(#{updated_taps.join(", ")})."
end
if !master_updated && updated_taps.empty? && !ARGV.verbose?
if hub.reporters.empty?
puts "Already up-to-date."
elsif hub.empty?
puts "No changes to formulae."
else
hub.dump
hub.reporters.each(&:migrate_tap_migration)
hub.reporters.each(&:migrate_formula_rename)
Descriptions.update_cache(hub)
end
Tap.each(&:link_manpages)
# automatically tap any migrated formulae's new tap
report.select_formula(:D).each do |f|
next unless (dir = HOMEBREW_CELLAR/f).exist?
migration = TAP_MIGRATIONS[f]
next unless migration
tap = Tap.fetch(*migration.split("/"))
tap.install unless tap.installed?
# update tap for each Tab
tabs = dir.subdirs.map { |d| Tab.for_keg(Keg.new(d)) }
next if tabs.first.source["tap"] != "Homebrew/homebrew"
tabs.each { |tab| tab.source["tap"] = "#{tap.user}/homebrew-#{tap.repo}" }
tabs.each(&:write)
end if load_tap_migrations
load_formula_renames
report.update_renamed
# Migrate installed renamed formulae from core and taps.
report.select_formula(:R).each do |oldname, newname|
if oldname.include?("/")
user, repo, oldname = oldname.split("/", 3)
newname = newname.split("/", 3).last
else
user = "homebrew"
repo = "homebrew"
end
next unless (dir = HOMEBREW_CELLAR/oldname).directory? && !dir.subdirs.empty?
begin
f = Formulary.factory("#{user}/#{repo}/#{newname}")
# short term fix to prevent situation like https://github.com/Homebrew/homebrew/issues/45616
rescue Exception
end
next unless f
begin
migrator = Migrator.new(f)
migrator.migrate
rescue Migrator::MigratorDifferentTapsError
end
end
if report.empty?
puts "No changes to formulae." if master_updated || !updated_taps.empty?
else
report.dump
end
Descriptions.update_cache(report)
end
private
def shorten_revision(revision)
`git rev-parse --short #{revision}`.chomp
end
def load_tap_migrations
load "tap_migrations.rb"
rescue LoadError
false
end
def load_formula_renames
load "formula_renames.rb"
rescue LoadError
false
Utils.popen_read("git", "-C", HOMEBREW_REPOSITORY, "rev-parse", "--short", revision).chomp
end
end