| 
									
										
										
										
											2012-07-03 07:24:35 -07:00
										 |  |  | # Cleans a newly installed keg. | 
					
						
							|  |  |  | # By default: | 
					
						
							|  |  |  | # * removes .la files | 
					
						
							|  |  |  | # * removes empty directories | 
					
						
							|  |  |  | # * sets permissions on executables | 
					
						
							| 
									
										
										
										
											2014-02-23 21:18:09 -08:00
										 |  |  | # * removes unresolved symlinks | 
					
						
							| 
									
										
										
										
											2010-08-21 11:06:02 -07:00
										 |  |  | class Cleaner | 
					
						
							| 
									
										
										
										
											2012-07-03 07:24:35 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-23 11:07:37 -08:00
										 |  |  |   # Create a cleaner for the given formula | 
					
						
							| 
									
										
										
										
											2010-08-21 11:06:02 -07:00
										 |  |  |   def initialize f | 
					
						
							| 
									
										
										
										
											2013-06-23 12:48:45 -07:00
										 |  |  |     @f = f | 
					
						
							| 
									
										
										
										
											2014-02-23 11:07:37 -08:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # Clean the keg of formula @f | 
					
						
							|  |  |  |   def clean | 
					
						
							|  |  |  |     ObserverPathnameExtension.reset_counts! | 
					
						
							| 
									
										
										
										
											2014-02-23 17:39:01 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Many formulae include 'lib/charset.alias', but it is not strictly needed | 
					
						
							|  |  |  |     # and will conflict if more than one formula provides it | 
					
						
							|  |  |  |     alias_path = @f.lib/'charset.alias' | 
					
						
							|  |  |  |     alias_path.extend(ObserverPathnameExtension).unlink if alias_path.exist? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-23 11:07:37 -08:00
										 |  |  |     [@f.bin, @f.sbin, @f.lib].select{ |d| d.exist? }.each{ |d| clean_dir d } | 
					
						
							| 
									
										
										
										
											2010-08-21 11:23:54 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-23 11:07:37 -08:00
										 |  |  |     # Get rid of any info 'dir' files, so they don't conflict at the link stage | 
					
						
							|  |  |  |     info_dir_file = @f.info + 'dir' | 
					
						
							|  |  |  |     if info_dir_file.file? and not @f.skip_clean? info_dir_file | 
					
						
							| 
									
										
										
										
											2014-02-22 09:20:09 -08:00
										 |  |  |       puts "rm #{info_dir_file}" if ARGV.verbose? | 
					
						
							|  |  |  |       info_dir_file.unlink | 
					
						
							| 
									
										
										
										
											2010-08-21 11:23:54 -07:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-21 23:28:04 -06:00
										 |  |  |     prune | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   private | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-23 21:18:09 -08:00
										 |  |  |   # Removes any empty directories in the formula's prefix subtree | 
					
						
							|  |  |  |   # Keeps any empty directions projected by skip_clean | 
					
						
							| 
									
										
										
										
											2013-12-21 23:28:04 -06:00
										 |  |  |   def prune | 
					
						
							|  |  |  |     dirs = [] | 
					
						
							|  |  |  |     symlinks = [] | 
					
						
							|  |  |  |     @f.prefix.find do |path| | 
					
						
							|  |  |  |       if @f.skip_clean? path | 
					
						
							|  |  |  |         Find.prune | 
					
						
							|  |  |  |       elsif path.symlink? | 
					
						
							|  |  |  |         symlinks << path | 
					
						
							|  |  |  |       elsif path.directory? | 
					
						
							|  |  |  |         dirs << path | 
					
						
							| 
									
										
										
										
											2013-01-08 21:27:18 -08:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-23 21:18:09 -08:00
										 |  |  |     # Remove directories opposite from traversal, so that a subtree with no | 
					
						
							|  |  |  |     # actual files gets removed correctly. | 
					
						
							| 
									
										
										
										
											2013-12-21 23:28:04 -06:00
										 |  |  |     dirs.reverse_each do |d| | 
					
						
							|  |  |  |       if d.children.empty? | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |         puts "rmdir: #{d} (empty)" if ARGV.verbose? | 
					
						
							|  |  |  |         d.rmdir | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2010-08-21 11:06:02 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-23 21:18:09 -08:00
										 |  |  |     # Remove unresolved symlinks | 
					
						
							| 
									
										
										
										
											2013-12-21 23:28:04 -06:00
										 |  |  |     symlinks.reverse_each do |s| | 
					
						
							|  |  |  |       s.unlink unless s.resolved_path_exists? | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2010-11-09 13:00:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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? | 
					
						
							| 
									
										
										
										
											2013-12-21 23:28:03 -06:00
										 |  |  |       old_perms = path.stat.mode & 0777
 | 
					
						
							| 
									
										
										
										
											2013-02-10 08:55:09 -08:00
										 |  |  |       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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-23 17:41:32 -08:00
										 |  |  |   # Removes .la files and fixes file permissions for a directory tree, keeping | 
					
						
							|  |  |  |   # existing files and permissions if instructed to by the formula | 
					
						
							| 
									
										
										
										
											2010-08-21 11:06:02 -07:00
										 |  |  |   def clean_dir d | 
					
						
							|  |  |  |     d.find do |path| | 
					
						
							| 
									
										
										
										
											2013-12-22 13:43:51 -06:00
										 |  |  |       path.extend(ObserverPathnameExtension) | 
					
						
							| 
									
										
										
										
											2012-09-18 16:25:44 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-22 13:43:50 -06:00
										 |  |  |       Find.prune if @f.skip_clean? path | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if path.symlink? or path.directory? | 
					
						
							| 
									
										
										
										
											2010-08-21 11:06:02 -07:00
										 |  |  |         next | 
					
						
							| 
									
										
										
										
											2010-11-09 13:00:33 +00:00
										 |  |  |       elsif path.extname == '.la' | 
					
						
							| 
									
										
										
										
											2013-12-22 13:43:50 -06:00
										 |  |  |         path.unlink | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         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 |