From 4759ffb88f4d4715f99cbf8431ebf8b1f1aab630 Mon Sep 17 00:00:00 2001 From: Mike McQuaid Date: Fri, 24 May 2019 16:46:54 +0100 Subject: [PATCH] reinstall: handle remove/rename permission errors. --- Library/Homebrew/formula_installer.rb | 9 ++++++++- Library/Homebrew/keg.rb | 2 +- Library/Homebrew/reinstall.rb | 18 ++++++++++++++++-- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/Library/Homebrew/formula_installer.rb b/Library/Homebrew/formula_installer.rb index b549b762d6..e861f38c78 100644 --- a/Library/Homebrew/formula_installer.rb +++ b/Library/Homebrew/formula_installer.rb @@ -289,7 +289,14 @@ class FormulaInstaller rescue Exception => e # rubocop:disable Lint/RescueException # any exceptions must leave us with nothing installed ignore_interrupts do - formula.prefix.rmtree if formula.prefix.directory? + begin + formula.prefix.rmtree if formula.prefix.directory? + rescue Errno::EACCES, Errno::ENOTEMPTY + odie <<~EOS + Could not remove #{formula.prefix.basename} keg! Do so manually: + sudo rm -rf #{formula.prefix} + EOS + end formula.rack.rmdir_if_possible end raise if ARGV.homebrew_developer? || diff --git a/Library/Homebrew/keg.rb b/Library/Homebrew/keg.rb index 48d6feff09..bafea64514 100644 --- a/Library/Homebrew/keg.rb +++ b/Library/Homebrew/keg.rb @@ -310,7 +310,7 @@ class Keg remove_opt_record if optlinked? remove_old_aliases remove_oldname_opt_record - rescue Errno::ENOTEMPTY + rescue Errno::EACCES, Errno::ENOTEMPTY odie <<~EOS Could not remove #{name} keg! Do so manually: sudo rm -rf #{path} diff --git a/Library/Homebrew/reinstall.rb b/Library/Homebrew/reinstall.rb index 015fc8a468..51862302a1 100644 --- a/Library/Homebrew/reinstall.rb +++ b/Library/Homebrew/reinstall.rb @@ -45,12 +45,26 @@ module Homebrew ignore_interrupts { restore_backup(keg, keg_was_linked) } raise else - backup_path(keg).rmtree if backup_path(keg).exist? + begin + backup_path(keg).rmtree if backup_path(keg).exist? + rescue Errno::EACCES, Errno::ENOTEMPTY + odie <<~EOS + Could not remove #{backup_path(keg).parent.basename} backup keg! Do so manually: + sudo rm -rf #{backup_path(keg)} + EOS + end end def backup(keg) keg.unlink - keg.rename backup_path(keg) + begin + keg.rename backup_path(keg) + rescue Errno::EACCES, Errno::ENOTEMPTY + odie <<~EOS + Could not rename #{keg.name} keg! Check/fix its permissions: + sudo chown -R $(whoami) #{keg} + EOS + end end def restore_backup(keg, keg_was_linked)