# File lib/rubigen/commands.rb, line 220
      def file(relative_source, relative_destination, file_options = {}, &block)
        # Determine full paths for source and destination files.
        source              = source_path(relative_source)
        destination         = destination_path(relative_destination)
        destination_exists  = File.exist?(destination)

        # If source and destination are identical then we're done.
        if destination_exists and identical?(source, destination, &block)
          return logger.identical(relative_destination)
        end

        # Check for and resolve file collisions.
        if destination_exists

          # Make a choice whether to overwrite the file.  :force and
          # :skip already have their mind made up, but give :ask a shot.
          choice = case (file_options[:collision] || options[:collision]).to_sym #|| :ask
            when :ask   then force_file_collision?(relative_destination, source, destination, file_options, &block)
            when :force then :force
            when :skip  then :skip
            else raise "Invalid collision option: #{options[:collision].inspect}"
          end

          # Take action based on our choice.  Bail out if we chose to
          # skip the file; otherwise, log our transgression and continue.
          case choice
            when :force then logger.force(relative_destination)
            when :skip  then return(logger.skip(relative_destination))
            else raise "Invalid collision choice: #{choice}.inspect"
          end

        # File doesn't exist so log its unbesmirched creation.
        else
          logger.create relative_destination
        end

        # If we're pretending, back off now.
        return if options[:pretend]

        # Write destination file with optional shebang.  Yield for content
        # if block given so templaters may render the source file.  If a
        # shebang is requested, replace the existing shebang or insert a
        # new one.
        File.open(destination, 'wb') do |dest|
          dest.write render_file(source, file_options, &block)
        end

        # Optionally change permissions.
        if file_options[:chmod]
          FileUtils.chmod(file_options[:chmod], destination)
        end

        # Optionally add file to subversion or git
        system("svn add #{destination}") if options[:svn]
      end