From ecb1075390a49e292c6add3495504c24e3ec1572 Mon Sep 17 00:00:00 2001 From: Alyssa Ross Date: Wed, 28 Sep 2016 19:21:47 +0100 Subject: [PATCH] uninstall: check for dependents even with --force --- Library/Homebrew/cmd/uninstall.rb | 26 ++++++++++++++----------- Library/Homebrew/test/test_uninstall.rb | 8 ++++++++ 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/Library/Homebrew/cmd/uninstall.rb b/Library/Homebrew/cmd/uninstall.rb index 2d7bb90e4f..5ab9f116f3 100644 --- a/Library/Homebrew/cmd/uninstall.rb +++ b/Library/Homebrew/cmd/uninstall.rb @@ -15,14 +15,27 @@ module Homebrew raise KegUnspecifiedError if ARGV.named.empty? kegs_by_rack = if ARGV.force? - ARGV.named.map do |name| + Hash[ARGV.named.map do |name| rack = Formulary.to_rack(name) [rack, rack.subdirs.map { |d| Keg.new(d) }] - end + end] else ARGV.kegs.group_by(&:rack) end + kegs = kegs_by_rack.values.flatten(1) + + kegs.each do |keg| + dependents = keg.installed_dependents - kegs + if dependents.any? + dependents_output = dependents.map { |k| "#{k.name} #{k.version}" }.join(", ") + conjugation = dependents.count == 1 ? "is" : "are" + ofail "Refusing to uninstall #{keg} because it is required by #{dependents_output}, which #{conjugation} currently installed." + # puts "You can override this and force removal with `brew uninstall --force #{keg.name}`." + next + end + end + kegs_by_rack.each do |rack, kegs| if ARGV.force? name = rack.basename @@ -38,15 +51,6 @@ module Homebrew rm_pin rack else kegs.each do |keg| - dependents = keg.installed_dependents - ARGV.kegs - if dependents.any? - dependents_output = dependents.map { |k| "#{k.name} #{k.version}" }.join(", ") - conjugation = dependents.count == 1 ? "is" : "are" - ofail "Refusing to uninstall #{keg} because it is required by #{dependents_output}, which #{conjugation} currently installed." - puts "You can override this and force removal with `brew uninstall --force #{keg.name}`." - next - end - keg.lock do puts "Uninstalling #{keg}... (#{keg.abv})" keg.unlink diff --git a/Library/Homebrew/test/test_uninstall.rb b/Library/Homebrew/test/test_uninstall.rb index fe14a79c21..dde736624e 100644 --- a/Library/Homebrew/test/test_uninstall.rb +++ b/Library/Homebrew/test/test_uninstall.rb @@ -29,6 +29,14 @@ class IntegrationCommandTestUninstall < IntegrationCommandTestCase cmd("uninstall", "testball_f2") end + def test_uninstall_force_leaving_dependents + cmd("install", "testball_f2") + assert_match "Refusing to uninstall", + cmd_fail("uninstall", "testball_f1", "--force") + assert_match "Uninstalling testball_f2", + cmd("uninstall", "testball_f2", "--force") + end + def test_uninstall_dependent_first cmd("install", "testball_f2") assert_match "Uninstalling #{Formulary.factory(@f1_path).rack}",