| 
									
										
										
										
											2012-07-03 07:24:35 -07:00
										 |  |  | # Cleans a newly installed keg. | 
					
						
							|  |  |  | # By default: | 
					
						
							|  |  |  | # * removes info files | 
					
						
							|  |  |  | # * removes .la files | 
					
						
							|  |  |  | # * removes empty directories | 
					
						
							|  |  |  | # * sets permissions on executables | 
					
						
							| 
									
										
										
										
											2010-08-21 11:06:02 -07:00
										 |  |  | class Cleaner | 
					
						
							| 
									
										
										
										
											2012-07-03 07:24:35 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-23 12:48:45 -07:00
										 |  |  |   # Create a cleaner for the given formula and clean its keg | 
					
						
							| 
									
										
										
										
											2010-08-21 11:06:02 -07:00
										 |  |  |   def initialize f | 
					
						
							| 
									
										
										
										
											2013-06-23 12:48:45 -07:00
										 |  |  |     @f = f | 
					
						
							| 
									
										
										
										
											2010-11-09 13:00:33 +00:00
										 |  |  |     [f.bin, f.sbin, f.lib].select{ |d| d.exist? }.each{ |d| clean_dir d } | 
					
						
							| 
									
										
										
										
											2010-08-21 11:23:54 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-01-21 00:51:20 +01:00
										 |  |  |     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 | 
					
						
							| 
									
										
										
										
											2010-08-21 11:23:54 -07:00
										 |  |  |       f.info.rmtree if f.info.directory? and not f.skip_clean? f.info | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-03 07:24:35 -07:00
										 |  |  |     # Remove empty folders. | 
					
						
							|  |  |  |     # We want post-order traversal, so use a stack. | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |     paths = [] | 
					
						
							|  |  |  |     f.prefix.find do |path| | 
					
						
							| 
									
										
										
										
											2013-01-08 21:27:18 -08:00
										 |  |  |       if path.directory? | 
					
						
							|  |  |  |         if f.skip_clean? path | 
					
						
							|  |  |  |           Find.prune | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |           paths << path | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-08 20:52:52 -05:00
										 |  |  |     paths.reverse_each do |d| | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |       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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-03 07:24:35 -07:00
										 |  |  |   # Set permissions for executables and non-executables | 
					
						
							|  |  |  |   def clean_file_permissions path | 
					
						
							|  |  |  |     perms = if path.mach_o_executable? || path.text_executable? | 
					
						
							|  |  |  |       0555
 | 
					
						
							| 
									
										
										
										
											2010-08-21 11:06:02 -07:00
										 |  |  |     else | 
					
						
							| 
									
										
										
										
											2012-07-03 07:24:35 -07:00
										 |  |  |       0444
 | 
					
						
							| 
									
										
										
										
											2010-08-21 11:06:02 -07:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2013-02-10 08:55:09 -08:00
										 |  |  |     if ARGV.debug? | 
					
						
							|  |  |  |       old_perms = path.stat.mode | 
					
						
							|  |  |  |       if perms != old_perms | 
					
						
							|  |  |  |         puts "Fixing #{path} permissions from #{old_perms.to_s(8)} to #{perms.to_s(8)}" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2010-08-21 11:06:02 -07:00
										 |  |  |     path.chmod perms | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-03 07:24:35 -07:00
										 |  |  |   # Clean a single folder (non-recursively) | 
					
						
							| 
									
										
										
										
											2010-08-21 11:06:02 -07:00
										 |  |  |   def clean_dir d | 
					
						
							|  |  |  |     d.find do |path| | 
					
						
							| 
									
										
										
										
											2013-03-18 00:11:49 -05:00
										 |  |  |       path.extend(NoisyPathname) if ARGV.verbose? | 
					
						
							| 
									
										
										
										
											2012-09-18 16:25:44 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-21 11:06:02 -07:00
										 |  |  |       if path.directory? | 
					
						
							| 
									
										
										
										
											2012-07-03 07:24:35 -07:00
										 |  |  |         # Stop cleaning this subtree if protected | 
					
						
							| 
									
										
										
										
											2010-08-21 11:06:02 -07:00
										 |  |  |         Find.prune if @f.skip_clean? path | 
					
						
							|  |  |  |       elsif not path.file? | 
					
						
							| 
									
										
										
										
											2012-07-03 07:24:35 -07:00
										 |  |  |         # Sanity? | 
					
						
							| 
									
										
										
										
											2010-08-21 11:06:02 -07:00
										 |  |  |         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 | 
					
						
							| 
									
										
										
										
											2012-03-09 12:37:23 -06:00
										 |  |  |       elsif path == @f.lib+'charset.alias' | 
					
						
							| 
									
										
										
										
											2012-07-03 07:24:35 -07:00
										 |  |  |         # Many formulae symlink this file, but it is not strictly needed | 
					
						
							| 
									
										
										
										
											2012-03-09 12:37:23 -06:00
										 |  |  |         path.unlink unless @f.skip_clean? path | 
					
						
							| 
									
										
										
										
											2010-08-21 11:06:02 -07:00
										 |  |  |       elsif not path.symlink? | 
					
						
							| 
									
										
										
										
											2012-07-03 07:24:35 -07:00
										 |  |  |         # Fix permissions | 
					
						
							|  |  |  |         clean_file_permissions path | 
					
						
							| 
									
										
										
										
											2010-08-21 11:06:02 -07:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2012-07-03 07:24:35 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-21 11:06:02 -07:00
										 |  |  | end | 
					
						
							| 
									
										
										
										
											2012-09-18 16:25:44 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-18 00:11:49 -05:00
										 |  |  | module NoisyPathname | 
					
						
							| 
									
										
										
										
											2012-09-18 16:25:44 -04:00
										 |  |  |   def unlink | 
					
						
							|  |  |  |     puts "rm: #{self}" | 
					
						
							| 
									
										
										
										
											2013-03-18 00:11:49 -05:00
										 |  |  |     super | 
					
						
							| 
									
										
										
										
											2012-09-18 16:25:44 -04:00
										 |  |  |   end | 
					
						
							|  |  |  | end |