
The code was sucking. To the extent that maintenance was hard. It's a lot easier to work with code that is sensibly split at sensible boundaries. So now it is more like that. But the refactor is minimal. Because we don't want you to have more merge hell than absolutely necessary. If you merge you will need to pay attention to brew.h.rb (as it is deleted) and bin/brew (as command logic is gone). It will be painful, but you will just have to help git out by moving any changes around manually. Note compatibility.rb. It ensures that any function renames or removals don't break anything. We're pretty serious about backwards compatibility. And that's because we encourage you to hack around with the innards. And we couldn't do that if we would then just make stuff disappear behind your back.
80 lines
2.1 KiB
Ruby
80 lines
2.1 KiB
Ruby
class Cleaner
|
|
def initialize f
|
|
@f=f
|
|
[f.bin, f.sbin, f.lib].select{|d|d.exist?}.each{|d|clean_dir d}
|
|
|
|
unless ENV['HOMEBREW_KEEP_INFO'].nil?
|
|
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 "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 `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 /script 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' and not @f.skip_clean? path
|
|
# *.la files are stupid
|
|
path.unlink
|
|
elsif not path.symlink?
|
|
clean_file path
|
|
end
|
|
end
|
|
end
|
|
end
|