90 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| require "hbc/artifact/relocated"
 | |
| 
 | |
| module Hbc
 | |
|   module Artifact
 | |
|     class Moved < Relocated
 | |
|       def self.english_description
 | |
|         "#{artifact_english_name}s"
 | |
|       end
 | |
| 
 | |
|       def install_phase
 | |
|         each_artifact do |artifact|
 | |
|           load_specification(artifact)
 | |
|           next unless preflight_checks
 | |
|           delete if Utils.path_occupied?(target) && force
 | |
|           move
 | |
|         end
 | |
|       end
 | |
| 
 | |
|       def uninstall_phase
 | |
|         each_artifact do |artifact|
 | |
|           load_specification(artifact)
 | |
|           next unless File.exist?(target)
 | |
|           delete
 | |
|         end
 | |
|       end
 | |
| 
 | |
|       private
 | |
| 
 | |
|       def each_artifact
 | |
|         # the sort is for predictability between Ruby versions
 | |
|         @cask.artifacts[self.class.artifact_dsl_key].sort.each do |artifact|
 | |
|           yield artifact
 | |
|         end
 | |
|       end
 | |
| 
 | |
|       def move
 | |
|         ohai "Moving #{self.class.artifact_english_name} '#{source.basename}' to '#{target}'"
 | |
|         target.dirname.mkpath
 | |
|         FileUtils.move(source, target)
 | |
|         add_altname_metadata target, source.basename.to_s
 | |
|       end
 | |
| 
 | |
|       def preflight_checks
 | |
|         if Utils.path_occupied?(target)
 | |
|           if force
 | |
|             ohai(warning_target_exists { |s| s << "overwriting." })
 | |
|           else
 | |
|             ohai(warning_target_exists { |s| s << "not moving." })
 | |
|             return false
 | |
|           end
 | |
|         end
 | |
|         unless source.exist?
 | |
|           message = "It seems the #{self.class.artifact_english_name} source is not there: '#{source}'"
 | |
|           raise CaskError, message
 | |
|         end
 | |
|         true
 | |
|       end
 | |
| 
 | |
|       def warning_target_exists
 | |
|         message_parts = [
 | |
|           "It seems there is already #{self.class.artifact_english_article} #{self.class.artifact_english_name} at '#{target}'",
 | |
|         ]
 | |
|         yield(message_parts) if block_given?
 | |
|         message_parts.join("; ")
 | |
|       end
 | |
| 
 | |
|       def delete
 | |
|         ohai "Removing #{self.class.artifact_english_name}: '#{target}'"
 | |
|         raise CaskError, "Cannot remove undeletable #{self.class.artifact_english_name}" if MacOS.undeletable?(target)
 | |
| 
 | |
|         if force
 | |
|           Utils.gain_permissions_remove(target, command: @command)
 | |
|         else
 | |
|           target.rmtree
 | |
|         end
 | |
|       end
 | |
| 
 | |
|       def summarize_artifact(artifact_spec)
 | |
|         load_specification artifact_spec
 | |
| 
 | |
|         if target.exist?
 | |
|           "#{printable_target} (#{target.abv})"
 | |
|         else
 | |
|           Formatter.error(printable_target, label: "Missing #{self.class.artifact_english_name}")
 | |
|         end
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| end
 | 
