diff --git a/Library/Homebrew/cmd/prune.rb b/Library/Homebrew/cmd/prune.rb index dd479343c6..6fa47c11c4 100644 --- a/Library/Homebrew/cmd/prune.rb +++ b/Library/Homebrew/cmd/prune.rb @@ -36,7 +36,7 @@ module Homebrew end end - repair_taps(false) unless ARGV.dry_run? + migrate_taps :force => true unless ARGV.dry_run? if ObserverPathnameExtension.total.zero? puts "Nothing pruned" if ARGV.verbose? diff --git a/Library/Homebrew/cmd/tap.rb b/Library/Homebrew/cmd/tap.rb index 5e0554dbb6..8b38b8bb0f 100644 --- a/Library/Homebrew/cmd/tap.rb +++ b/Library/Homebrew/cmd/tap.rb @@ -5,7 +5,7 @@ module Homebrew puts "#{user.basename}/#{repo.basename.sub("homebrew-", "")}" if (repo/".git").directory? end elsif ARGV.first == "--repair" - repair_taps + migrate_taps :force => true else opoo "Already tapped!" unless install_tap(*tap_args) end @@ -26,7 +26,6 @@ module Homebrew files = [] tapd.find_formula { |file| files << file } - link_tap_formula(files) puts "Tapped #{files.length} formula#{plural(files.length, 'e')} (#{tapd.abv})" if private_tap?(repouser, repo) then puts <<-EOS.undent @@ -42,59 +41,12 @@ module Homebrew true end - def link_tap_formula(paths, warn_about_conflicts=true) - ignores = (HOMEBREW_LIBRARY/"Formula/.gitignore").read.split rescue [] - tapped = 0 - - paths.each do |path| - to = HOMEBREW_LIBRARY.join("Formula", path.basename) - - # Unexpected, but possible, lets proceed as if nothing happened - to.delete if to.symlink? && to.resolved_path == path - - begin - to.make_relative_symlink(path) - rescue SystemCallError - to = to.resolved_path if to.symlink? - opoo <<-EOS.undent if warn_about_conflicts - Could not create link for #{Tty.white}#{tap_ref(path)}#{Tty.reset}, as it - conflicts with #{Tty.white}#{tap_ref(to)}#{Tty.reset}. You will need to use the - fully-qualified name when referring this formula, e.g. - brew install #{tap_ref(path)} - EOS - else - ignores << path.basename.to_s - tapped += 1 - end - end - - HOMEBREW_LIBRARY.join("Formula/.gitignore").atomic_write(ignores.uniq.join("\n")) - - tapped - end - - def repair_taps(warn_about_conflicts=true) - count = 0 - # prune dead symlinks in Formula - Dir.glob("#{HOMEBREW_LIBRARY}/Formula/*.rb") do |fn| - if not File.exist? fn - File.delete fn - count += 1 - end - end - puts "Pruned #{count} dead formula#{plural(count, 'e')}" - - return unless HOMEBREW_REPOSITORY.join("Library/Taps").exist? - - count = 0 - # check symlinks are all set in each tap - each_tap do |user, repo| - files = [] - repo.find_formula { |file| files << file } - count += link_tap_formula(files, warn_about_conflicts) - end - - puts "Tapped #{count} formula#{plural(count, 'e')}" + # Migrate tapped formulae from symlink-based to directory-based structure. + def migrate_taps(options={}) + ignore = HOMEBREW_LIBRARY/"Formula/.gitignore" + return unless ignore.exist? || options.fetch(:force, false) + (HOMEBREW_LIBRARY/"Formula").children.select(&:symlink?).each(&:unlink) + ignore.unlink if ignore.exist? end private @@ -124,13 +76,4 @@ module Homebrew rescue GitHub::Error false end - - def tap_ref(path) - case path.to_s - when %r{^#{Regexp.escape(HOMEBREW_LIBRARY.to_s)}/Formula}o - "Homebrew/homebrew/#{path.basename(".rb")}" - when HOMEBREW_TAP_PATH_REGEX - "#{$1}/#{$2.sub("homebrew-", "")}/#{path.basename(".rb")}" - end - end end diff --git a/Library/Homebrew/cmd/untap.rb b/Library/Homebrew/cmd/untap.rb index b0044b24cc..37ed2a3f1d 100644 --- a/Library/Homebrew/cmd/untap.rb +++ b/Library/Homebrew/cmd/untap.rb @@ -21,29 +21,9 @@ module Homebrew files = [] tapd.find_formula { |file| files << file } - unlink_tap_formula(files) tapd.rmtree tapd.dirname.rmdir_if_possible puts "Untapped #{files.length} formula#{plural(files.length, 'e')}" end end - - def unlink_tap_formula paths - untapped = 0 - gitignores = (HOMEBREW_LIBRARY/"Formula/.gitignore").read.split rescue [] - - paths.each do |path| - link = HOMEBREW_LIBRARY.join("Formula", path.basename) - - if link.symlink? && (!link.exist? || link.resolved_path == path) - link.delete - gitignores.delete(path.basename.to_s) - untapped += 1 - end - end - - HOMEBREW_REPOSITORY.join("Library/Formula/.gitignore").atomic_write(gitignores * "\n") - - untapped - end end diff --git a/Library/Homebrew/cmd/update.rb b/Library/Homebrew/cmd/update.rb index 6e065b1991..67bc09d8bc 100644 --- a/Library/Homebrew/cmd/update.rb +++ b/Library/Homebrew/cmd/update.rb @@ -1,5 +1,4 @@ require 'cmd/tap' -require 'cmd/untap' module Homebrew def update @@ -16,20 +15,12 @@ module Homebrew cd HOMEBREW_REPOSITORY git_init_if_necessary - tapped_formulae = [] - HOMEBREW_LIBRARY.join("Formula").children.each do |path| - next unless path.symlink? - tapped_formulae << path.resolved_path - end - unlink_tap_formula(tapped_formulae) + # migrate to new directories based tap structure + migrate_taps report = Report.new master_updater = Updater.new(HOMEBREW_REPOSITORY) - begin - master_updater.pull! - ensure - link_tap_formula(tapped_formulae) - end + master_updater.pull! report.update(master_updater.report) # rename Taps directories @@ -52,10 +43,6 @@ module Homebrew end end - # we unlink first in case the formula has moved to another tap - Homebrew.unlink_tap_formula(report.removed_tapped_formula) - Homebrew.link_tap_formula(report.new_tapped_formula) - # automatically tap any migrated formulae's new tap report.select_formula(:D).each do |f| next unless (HOMEBREW_CELLAR/f).exist? @@ -95,7 +82,6 @@ module Homebrew end def rename_taps_dir_if_necessary - need_repair_taps = false Dir.glob("#{HOMEBREW_LIBRARY}/Taps/*/") do |tapd| begin tapd_basename = File.basename(tapd) @@ -107,7 +93,6 @@ module Homebrew FileUtils.mkdir_p("#{HOMEBREW_LIBRARY}/Taps/#{user.downcase}") FileUtils.mv(tapd, "#{HOMEBREW_LIBRARY}/Taps/#{user.downcase}/homebrew-#{repo.downcase}") - need_repair_taps = true if tapd_basename.count("-") >= 2 opoo "Homebrew changed the structure of Taps like /. "\ @@ -123,8 +108,6 @@ module Homebrew next # next tap directory end end - - repair_taps if need_repair_taps end def load_tap_migrations