Sha256: ae34d5b4d36c94e0477ce84b903a657c5c7ffb14a1f33f2ed8e2588d694213c9

Contents?: true

Size: 1.92 KB

Versions: 3

Compression:

Stored size: 1.92 KB

Contents

# frozen_string_literal: true

module Nanoc::Int
  # @api private
  class ItemRepWriter
    TMP_TEXT_ITEMS_DIR = 'text_items'

    def write_all(item_rep, snapshot_repo)
      written_paths = Set.new

      item_rep.snapshot_defs.map(&:name).each do |snapshot_name|
        write(item_rep, snapshot_repo, snapshot_name, written_paths)
      end
    end

    def write(item_rep, snapshot_repo, snapshot_name, written_paths)
      item_rep.raw_paths.fetch(snapshot_name, []).each do |raw_path|
        write_single(item_rep, snapshot_repo, snapshot_name, raw_path, written_paths)
      end
    end

    def write_single(item_rep, snapshot_repo, snapshot_name, raw_path, written_paths)
      # Don’t write twice
      # TODO: test written_paths behavior
      return if written_paths.include?(raw_path)
      written_paths << raw_path

      # Create parent directory
      FileUtils.mkdir_p(File.dirname(raw_path))

      # Check if file will be created
      is_created = !File.file?(raw_path)

      # Notify
      Nanoc::Int::NotificationCenter.post(
        :rep_write_started, item_rep, raw_path
      )

      content = snapshot_repo.get(item_rep, snapshot_name)
      if content.binary?
        temp_path = content.filename
      else
        temp_path = temp_filename
        File.write(temp_path, content.string)
      end

      # Check whether content was modified
      is_modified = is_created || !FileUtils.identical?(raw_path, temp_path)

      # Write
      if is_modified
        begin
          FileUtils.ln(temp_path, raw_path, force: true)
        rescue Errno::EXDEV
          FileUtils.cp(temp_path, raw_path)
        end
      end

      item_rep.modified = is_modified

      # Notify
      Nanoc::Int::NotificationCenter.post(
        :rep_write_ended, item_rep, content.binary?, raw_path, is_created, is_modified
      )
    end

    def temp_filename
      Nanoc::Int::TempFilenameFactory.instance.create(TMP_TEXT_ITEMS_DIR)
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
nanoc-4.9.4 lib/nanoc/base/services/item_rep_writer.rb
nanoc-4.9.3 lib/nanoc/base/services/item_rep_writer.rb
nanoc-4.9.2 lib/nanoc/base/services/item_rep_writer.rb