file (RubiGen::Commands::Create)

    # 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