| 
									
										
										
										
											2010-08-21 11:06:02 -07:00
										 |  |  | class Cleaner | 
					
						
							|  |  |  |   def initialize f | 
					
						
							| 
									
										
										
										
											2010-11-09 13:00:33 +00:00
										 |  |  |     @f = Formula.factory f | 
					
						
							|  |  |  |     [f.bin, f.sbin, f.lib].select{ |d| d.exist? }.each{ |d| clean_dir d } | 
					
						
							| 
									
										
										
										
											2010-08-21 11:23:54 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     unless ENV['HOMEBREW_KEEP_INFO'].nil? | 
					
						
							|  |  |  |       f.info.rmtree if f.info.directory? and not f.skip_clean? f.info | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # 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 | 
					
						
							| 
									
										
										
										
											2010-08-21 11:06:02 -07:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-09 13:00:33 +00:00
										 |  |  |   private | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-21 11:06:02 -07:00
										 |  |  |   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 | 
					
						
							| 
									
										
										
										
											2010-11-09 13:00:33 +00:00
										 |  |  |     perms = 0444
 | 
					
						
							| 
									
										
										
										
											2010-08-21 11:06:02 -07:00
										 |  |  |     case `file -h '#{path}'` | 
					
						
							|  |  |  |     when /Mach-O dynamically linked shared library/ | 
					
						
							| 
									
										
										
										
											2010-11-09 13:00:33 +00:00
										 |  |  |       # Stripping libraries is causing no end of trouble. Lets just give up, | 
					
						
							|  |  |  |       # and try to do it manually in instances where it makes sense. | 
					
						
							| 
									
										
										
										
											2010-08-21 11:06:02 -07:00
										 |  |  |       #strip path, '-SxX' | 
					
						
							|  |  |  |     when /Mach-O [^ ]* ?executable/ | 
					
						
							|  |  |  |       strip path | 
					
						
							| 
									
										
										
										
											2010-11-09 13:00:33 +00:00
										 |  |  |       perms = 0555
 | 
					
						
							| 
									
										
										
										
											2010-08-21 11:06:02 -07:00
										 |  |  |     when /script text executable/ | 
					
						
							| 
									
										
										
										
											2010-11-09 13:00:33 +00:00
										 |  |  |       perms = 0555
 | 
					
						
							| 
									
										
										
										
											2010-08-21 11:06:02 -07:00
										 |  |  |     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 | 
					
						
							| 
									
										
										
										
											2010-11-09 13:00:33 +00:00
										 |  |  |       elsif path.extname == '.la' | 
					
						
							| 
									
										
										
										
											2010-08-21 11:06:02 -07:00
										 |  |  |         # *.la files are stupid | 
					
						
							| 
									
										
										
										
											2010-11-09 13:00:33 +00:00
										 |  |  |         path.unlink unless @f.skip_clean? path | 
					
						
							| 
									
										
										
										
											2010-08-21 11:06:02 -07:00
										 |  |  |       elsif not path.symlink? | 
					
						
							|  |  |  |         clean_file path | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |