brew/Library/Homebrew/cleaner.rb
Jack Nagel a23357372e cleaner: remove lib/charset.alias files
This file is installed by a number of packages, but it really shouldn't
be. It is meant to be updated by packages that use it, but this is
broken (1) by software that doesn't do this correctly and (2) by the
symlink being overwritten by Homebrew's linking code.

It's presence can cause issues with tools that use libiconv/gettext.

Instead let's follow MacPorts' example and just remove it during the
clean stage.

Signed-off-by: Jack Nagel <jacknagel@gmail.com>
2012-02-19 16:53:37 -06:00

89 lines
2.4 KiB
Ruby

class Cleaner
def initialize f
@f = Formula.factory f
[f.bin, f.sbin, f.lib].select{ |d| d.exist? }.each{ |d| clean_dir d }
if ENV['HOMEBREW_KEEP_INFO']
# Get rid of the directory file, so it no longer bother us at link stage.
info_dir_file = f.info + 'dir'
if info_dir_file.file? and not f.skip_clean? info_dir_file
puts "rm #{info_dir_file}" if ARGV.verbose?
info_dir_file.unlink
end
else
f.info.rmtree if f.info.directory? and not f.skip_clean? f.info
end
# Hunt for empty folders and nuke them unless they are protected by
# f.skip_clean? We want post-order traversal, so put the dirs in a stack
# and then pop them off later.
paths = []
f.prefix.find do |path|
paths << path if path.directory?
end
paths.each do |d|
if d.children.empty? and not f.skip_clean? d
puts "rmdir: #{d} (empty)" if ARGV.verbose?
d.rmdir
end
end
end
private
def strip path, args=''
return if @f.skip_clean? path
puts "strip #{path}" if ARGV.verbose?
path.chmod 0644 # so we can strip
unless path.stat.nlink > 1
system "/usr/bin/strip", *(args+path)
else
path = path.to_s.gsub ' ', '\\ '
# strip unlinks the file and recreates it, thus breaking hard links!
# is this expected behaviour? patch does it too… still, this fixes it
tmp = `/usr/bin/mktemp -t homebrew_strip`.chomp
begin
`/usr/bin/strip #{args} -o #{tmp} #{path}`
`/bin/cat #{tmp} > #{path}`
ensure
FileUtils.rm tmp
end
end
end
def clean_file path
perms = 0444
case `/usr/bin/file -h '#{path}'`
when /Mach-O dynamically linked shared library/
# Stripping libraries is causing no end of trouble. Lets just give up,
# and try to do it manually in instances where it makes sense.
#strip path, '-SxX'
when /Mach-O [^ ]* ?executable/
strip path
perms = 0555
when /text executable/
perms = 0555
end
path.chmod perms
end
def clean_dir d
d.find do |path|
if path.directory?
Find.prune if @f.skip_clean? path
elsif not path.file?
next
elsif path.extname == '.la'
# *.la files are stupid
path.unlink unless @f.skip_clean? path
elsif path == @f.lib+'charset.alias'
path.unlink unless @f.skip_clean? path
elsif not path.symlink?
clean_file path
end
end
end
end