Sha256: 375296410d073130bf0fd38eef06892263523cf32c4c4de14d89a94b9dc1e953

Contents?: true

Size: 1.11 KB

Versions: 4

Compression:

Stored size: 1.11 KB

Contents

require 'forwardable'

module Dandelion
  class Diff
    extend Forwardable
    include Enumerable

    def_delegator :@target, :empty?
    def_delegator :@target, :each

    attr_reader :from_commit, :to_commit

    def initialize(from_commit, to_commit)
      @from_commit = from_commit
      @to_commit = to_commit

      if from_commit.nil?
        @target = FullDiff.new(to_commit.diff(nil))
      else
        @target = PartialDiff.new(from_commit.diff(to_commit))
      end
    end
  end

private

  class PartialDiff
    def initialize(diff)
      @deltas = diff.deltas
    end

    def empty?
      @deltas.empty?
    end

    def each
      deletes, writes = @deltas.partition(&:deleted?)
      deletes.each { |delta| yield Change.new(delta.old_file[:path], :delete) }
      writes.each { |delta| yield Change.new(delta.new_file[:path], :write) }
    end
  end

  class FullDiff
    def initialize(diff)
      @deltas = diff.patches.map(&:delta)
    end

    def empty?
      @deltas.empty?
    end

    def each
      @deltas.each do |delta|
        yield Change.new(delta.new_file[:path], :write)
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
dandelion-0.5.2 lib/dandelion/diff.rb
dandelion-0.5.1 lib/dandelion/diff.rb
dandelion-0.5.0 lib/dandelion/diff.rb
dandelion-0.4.17 lib/dandelion/diff.rb