diff options
| author | Baptiste Fontaine | 2015-12-29 12:57:48 +0100 |
|---|---|---|
| committer | Baptiste Fontaine | 2016-01-04 13:17:21 +0100 |
| commit | 9bdd6619e23f498320c3d3a6be8bd8d095a6d521 (patch) | |
| tree | 0883233991f02205056d00abcb7fd356194379e1 /Library/Homebrew/cmd | |
| parent | d7b6230aed1a277905605632d91868d89543af1a (diff) | |
| download | brew-9bdd6619e23f498320c3d3a6be8bd8d095a6d521.tar.bz2 | |
cleanup: move code away from cmd/
Closes Homebrew/homebrew#47484.
Signed-off-by: Baptiste Fontaine <batifon@yahoo.fr>
Diffstat (limited to 'Library/Homebrew/cmd')
| -rw-r--r-- | Library/Homebrew/cmd/cleanup.rb | 189 | ||||
| -rw-r--r-- | Library/Homebrew/cmd/upgrade.rb | 6 |
2 files changed, 9 insertions, 186 deletions
diff --git a/Library/Homebrew/cmd/cleanup.rb b/Library/Homebrew/cmd/cleanup.rb index e01a809b5..7d891787a 100644 --- a/Library/Homebrew/cmd/cleanup.rb +++ b/Library/Homebrew/cmd/cleanup.rb @@ -1,31 +1,16 @@ -require "formula" -require "keg" -require "bottles" -require "thread" +require "cleanup" require "utils" module Homebrew - @@disk_cleanup_size = 0 - - def update_disk_cleanup_size(path_size) - @@disk_cleanup_size += path_size - end - def cleanup if ARGV.named.empty? - cleanup_cellar - cleanup_cache - cleanup_logs - unless ARGV.dry_run? - cleanup_lockfiles - rm_DS_Store - end + Cleanup.cleanup else - ARGV.resolved_formulae.each { |f| cleanup_formula(f) } + ARGV.resolved_formulae.each { |f| Cleanup.cleanup_formula f } end - if @@disk_cleanup_size > 0 - disk_space = disk_usage_readable(@@disk_cleanup_size) + if Cleanup.disk_cleanup_size > 0 + disk_space = disk_usage_readable(Cleanup.disk_cleanup_size) if ARGV.dry_run? ohai "This operation would free approximately #{disk_space} of disk space." else @@ -33,168 +18,4 @@ module Homebrew end end end - - def cleanup_logs - return unless HOMEBREW_LOGS.directory? - HOMEBREW_LOGS.subdirs.each do |dir| - cleanup_path(dir) { dir.rmtree } if prune?(dir, :days_default => 14) - end - end - - def cleanup_cellar - Formula.installed.each do |formula| - cleanup_formula formula - end - end - - def cleanup_formula(f) - if f.installed? - eligible_kegs = f.installed_kegs.select { |k| f.pkg_version > k.version } - if eligible_kegs.any? && eligible_for_cleanup?(f) - eligible_kegs.each { |keg| cleanup_keg(keg) } - else - eligible_kegs.each { |keg| opoo "Skipping (old) keg-only: #{keg}" } - end - elsif f.installed_prefixes.any? && !f.pinned? - # If the cellar only has one version installed, don't complain - # that we can't tell which one to keep. Don't complain at all if the - # only installed version is a pinned formula. - opoo "Skipping #{f.full_name}: most recent version #{f.pkg_version} not installed" - end - end - - def cleanup_keg(keg) - if keg.linked? - opoo "Skipping (old) #{keg} due to it being linked" - else - cleanup_path(keg) { keg.uninstall } - end - end - - def cleanup_cache - return unless HOMEBREW_CACHE.directory? - HOMEBREW_CACHE.children.each do |path| - if path.to_s.end_with? ".incomplete" - cleanup_path(path) { path.unlink } - next - end - if path.basename.to_s == "java_cache" && path.directory? - cleanup_path(path) { FileUtils.rm_rf path } - next - end - if prune?(path) - if path.file? - cleanup_path(path) { path.unlink } - elsif path.directory? && path.to_s.include?("--") - cleanup_path(path) { FileUtils.rm_rf path } - end - next - end - - next unless path.file? - file = path - - if Pathname::BOTTLE_EXTNAME_RX === file.to_s - version = bottle_resolve_version(file) rescue file.version - else - version = file.version - end - next unless version - next unless (name = file.basename.to_s[/(.*)-(?:#{Regexp.escape(version)})/, 1]) - - next unless HOMEBREW_CELLAR.directory? - - begin - f = Formulary.from_rack(HOMEBREW_CELLAR/name) - rescue FormulaUnavailableError, TapFormulaAmbiguityError, TapFormulaWithOldnameAmbiguityError - next - end - - file_is_stale = if PkgVersion === version - f.pkg_version > version - else - f.version > version - end - - if file_is_stale || ARGV.switch?("s") && !f.installed? || bottle_file_outdated?(f, file) - cleanup_path(file) { file.unlink } - end - end - end - - def cleanup_path(path) - if ARGV.dry_run? - puts "Would remove: #{path} (#{path.abv})" - else - puts "Removing: #{path}... (#{path.abv})" - yield - end - update_disk_cleanup_size(path.disk_usage) - end - - def cleanup_lockfiles - return unless HOMEBREW_CACHE_FORMULA.directory? - candidates = HOMEBREW_CACHE_FORMULA.children - lockfiles = candidates.select { |f| f.file? && f.extname == ".brewing" } - lockfiles.each do |file| - next unless file.readable? - file.open.flock(File::LOCK_EX | File::LOCK_NB) && file.unlink - end - end - - def rm_DS_Store - paths = Queue.new - %w[Cellar Frameworks Library bin etc include lib opt sbin share var]. - map { |p| HOMEBREW_PREFIX/p }.each { |p| paths << p if p.exist? } - workers = (0...Hardware::CPU.cores).map do - Thread.new do - begin - while p = paths.pop(true) - quiet_system "find", p, "-name", ".DS_Store", "-delete" - end - rescue ThreadError # ignore empty queue error - end - end - end - workers.map(&:join) - end - - def prune?(path, options = {}) - @time ||= Time.now - - path_modified_time = path.mtime - days_default = options[:days_default] - - prune = ARGV.value "prune" - - return true if prune == "all" - - prune_time = if prune - @time - 60 * 60 * 24 * prune.to_i - elsif days_default - @time - 60 * 60 * 24 * days_default.to_i - end - - return false unless prune_time - - path_modified_time < prune_time - end - - def eligible_for_cleanup?(formula) - # It used to be the case that keg-only kegs could not be cleaned up, because - # older brews were built against the full path to the keg-only keg. Then we - # introduced the opt symlink, and built against that instead. So provided - # no brew exists that was built against an old-style keg-only keg, we can - # remove it. - if !formula.keg_only? || ARGV.force? - true - elsif formula.opt_prefix.directory? - # SHA records were added to INSTALL_RECEIPTS the same day as opt symlinks - Formula.installed.select do |f| - f.deps.any? do |d| - d.to_formula.full_name == formula.full_name rescue d.name == formula.name - end - end.all? { |f| f.installed_prefixes.all? { |keg| Tab.for_keg(keg).HEAD } } - end - end end diff --git a/Library/Homebrew/cmd/upgrade.rb b/Library/Homebrew/cmd/upgrade.rb index 9c71d4057..62ef0bf81 100644 --- a/Library/Homebrew/cmd/upgrade.rb +++ b/Library/Homebrew/cmd/upgrade.rb @@ -1,5 +1,5 @@ require "cmd/install" -require "cmd/cleanup" +require "cleanup" module Homebrew def upgrade @@ -44,7 +44,9 @@ module Homebrew outdated.each do |f| upgrade_formula(f) - cleanup_formula(f) if ARGV.include?("--cleanup") && f.installed? + next unless ARGV.include?("--cleanup") + next unless f.installed? + Homebrew::Cleanup.cleanup_formula f end end |
