Fix issues with writable? detection in brew doctor

Closes Homebrew/homebrew#13689.

Signed-off-by: Max Howell <mxcl@me.com>

There are subtle distinctions between writable? and writable_real? we don't
understand precisely why we need this, but it fixes the bugs :/
This commit is contained in:
Brandon Black 2012-07-28 11:36:08 -07:00 committed by Max Howell
parent 1f62284384
commit bcde6432f3
6 changed files with 10 additions and 10 deletions

View File

@ -73,7 +73,7 @@ supplied, patches will also be downloaded and applied.
unpack_dir.mkpath unless unpack_dir.exist? unpack_dir.mkpath unless unpack_dir.exist?
end end
raise "Cannot write to #{unpack_dir}" unless unpack_dir.writable? raise "Cannot write to #{unpack_dir}" unless unpack_dir.writable_real?
formulae.each do |f| formulae.each do |f|
# Create a nice name for the stage folder. # Create a nice name for the stage folder.

View File

@ -84,7 +84,7 @@ chmods = %w( . bin etc include lib lib/pkgconfig Library sbin share var var/log
share/man/man5 share/man/man6 share/man/man7 share/man/man8 share/man/man5 share/man/man6 share/man/man7 share/man/man8
share/info share/doc share/aclocal ). share/info share/doc share/aclocal ).
map{ |d| "/usr/local/#{d}" }. map{ |d| "/usr/local/#{d}" }.
select{ |d| File.directory? d and not File.writable? d } select{ |d| File.directory? d and not File.writable_real? d }
chgrps = chmods.reject{ |d| File.stat(d).grpowned? } chgrps = chmods.reject{ |d| File.stat(d).grpowned? }
unless chmods.empty? unless chmods.empty?

View File

@ -279,7 +279,7 @@ def __check_subdir_access base
target.find do |d| target.find do |d|
next unless d.directory? next unless d.directory?
cant_read << d unless d.writable? cant_read << d unless d.writable_real?
end end
cant_read.sort! cant_read.sort!
@ -300,7 +300,7 @@ end
def check_access_usr_local def check_access_usr_local
return unless HOMEBREW_PREFIX.to_s == '/usr/local' return unless HOMEBREW_PREFIX.to_s == '/usr/local'
unless Pathname('/usr/local').writable? then <<-EOS.undent unless Pathname('/usr/local').writable_real? then <<-EOS.undent
The /usr/local directory is not writable. The /usr/local directory is not writable.
Even if this directory was writable when you installed Homebrew, other Even if this directory was writable when you installed Homebrew, other
software may change permissions on this directory. Some versions of the software may change permissions on this directory. Some versions of the
@ -322,7 +322,7 @@ end
def __check_folder_access base, msg def __check_folder_access base, msg
folder = HOMEBREW_PREFIX+base folder = HOMEBREW_PREFIX+base
if folder.exist? and not folder.writable? if folder.exist? and not folder.writable_real?
<<-EOS.undent <<-EOS.undent
#{folder} isn't writable. #{folder} isn't writable.
This can happen if you "sudo make install" software that isn't managed This can happen if you "sudo make install" software that isn't managed

View File

@ -33,8 +33,8 @@ module Homebrew extend self
end end
def check_writable_install_location def check_writable_install_location
raise "Cannot write to #{HOMEBREW_CELLAR}" if HOMEBREW_CELLAR.exist? and not HOMEBREW_CELLAR.writable? raise "Cannot write to #{HOMEBREW_CELLAR}" if HOMEBREW_CELLAR.exist? and not HOMEBREW_CELLAR.writable_real?
raise "Cannot write to #{HOMEBREW_PREFIX}" unless HOMEBREW_PREFIX.writable? or HOMEBREW_PREFIX.to_s == '/usr/local' raise "Cannot write to #{HOMEBREW_PREFIX}" unless HOMEBREW_PREFIX.writable_real? or HOMEBREW_PREFIX.to_s == '/usr/local'
end end
def check_xcode def check_xcode

View File

@ -353,7 +353,7 @@ class Pathname
To list all files that would be deleted: To list all files that would be deleted:
brew link -n formula_name brew link -n formula_name
EOS EOS
elsif !dirname.writable? elsif !dirname.writable_real?
raise <<-EOS.undent raise <<-EOS.undent
Could not symlink file: #{src.expand_path} Could not symlink file: #{src.expand_path}
#{dirname} is not writable. You should change its permissions. #{dirname} is not writable. You should change its permissions.
@ -375,7 +375,7 @@ class Pathname
def ensure_writable def ensure_writable
saved_perms = nil saved_perms = nil
unless writable? unless writable_real?
saved_perms = stat.mode saved_perms = stat.mode
chmod 0644 chmod 0644
end end

View File

@ -16,7 +16,7 @@ def cache
# we do this for historic reasons, however the cache *should* be the same # we do this for historic reasons, however the cache *should* be the same
# directory whichever user is used and whatever instance of brew is executed # directory whichever user is used and whatever instance of brew is executed
home_cache = Pathname.new("~/Library/Caches/Homebrew").expand_path home_cache = Pathname.new("~/Library/Caches/Homebrew").expand_path
if home_cache.directory? and home_cache.writable? if home_cache.directory? and home_cache.writable_real?
home_cache home_cache
else else
root_cache = Pathname.new("/Library/Caches/Homebrew") root_cache = Pathname.new("/Library/Caches/Homebrew")