Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve permissions errors #6164

Merged
merged 3 commits into from May 24, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion Library/Homebrew/cask/cmd/doctor.rb
Expand Up @@ -67,7 +67,7 @@ def check_staging_location

if path.exist? && !path.writable?
add_error "The staging path #{user_tilde(path.to_s)} is not writable by the current user."
add_error "To fix, run \'sudo chown -R ${USER}:staff #{user_tilde(path.to_s)}'"
add_error "To fix, run \'sudo chown -R $(whoami):staff #{user_tilde(path.to_s)}'"
end

puts user_tilde(path.to_s)
Expand Down
9 changes: 8 additions & 1 deletion Library/Homebrew/formula_installer.rb
Expand Up @@ -289,7 +289,14 @@ def install
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? ||
Expand Down
7 changes: 5 additions & 2 deletions Library/Homebrew/keg.rb
Expand Up @@ -310,8 +310,11 @@ def uninstall
remove_opt_record if optlinked?
remove_old_aliases
remove_oldname_opt_record
rescue Errno::ENOTEMPTY
ofail "Could not remove #{path}! Check its permissions."
rescue Errno::EACCES, Errno::ENOTEMPTY
odie <<~EOS
Could not remove #{name} keg! Do so manually:
sudo rm -rf #{path}
EOS
end

def unlink(mode = OpenStruct.new)
Expand Down
18 changes: 16 additions & 2 deletions Library/Homebrew/reinstall.rb
Expand Up @@ -45,12 +45,26 @@ def reinstall_formula(f, build_from_source: false)
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)
Expand Down
2 changes: 1 addition & 1 deletion docs/Gems,-Eggs-and-Perl-Modules.md
Expand Up @@ -116,7 +116,7 @@ If you ever did a `sudo gem`, etc. before then a lot of files will have
been created owned by root. Fix with:

```sh
sudo chown -R $USER /Library/Ruby /Library/Perl /Library/Python
sudo chown -R $(whoami) /Library/Ruby /Library/Perl /Library/Python
```

## Perl CPAN modules without sudo
Expand Down