Sha256: 0a7e8c5d12649259d666dd6008466405e848d1eafbbf7edc3ed002138aacd9fe

Contents?: true

Size: 1.98 KB

Versions: 19

Compression:

Stored size: 1.98 KB

Contents

require 'inch/utils/shell_helper'

module Inch
  module API
    # Returns a Compare::Codebases object for two revisions of the same
    # codebase
    class Diff
      include Utils::ShellHelper

      attr_reader :codebase_old
      attr_reader :codebase_new
      attr_reader :comparer
      attr_reader :work_dir

      # @param dir [String] the working directory of the codebase
      # @param before_rev [String] the 'before' revision
      # @param after_rev [String,nil] the 'after' revision that the 'before'
      #   one is compared against
      def initialize(dir, before_rev, after_rev = nil)
        @work_dir = dir
        @codebase_old = codebase_for(before_rev)
        @codebase_new = if after_rev.nil?
            Codebase.parse(work_dir)
          else
            codebase_for(after_rev)
          end
        @comparer = API::Compare::Codebases.new(@codebase_old, @codebase_new)
      end

      private

      def codebase_for(revision)
        if cached = codebase_from_cache(revision)
          cached
        else
          codebase = codebase_from_copy(work_dir, revision)
          filename = Codebase::Serializer.filename(revision)
          Codebase::Serializer.save(codebase, filename)
          codebase
        end
      end

      def codebase_from_cache(revision)
        filename = Codebase::Serializer.filename(revision)
        if File.exist?(filename)
          Codebase::Serializer.load(filename)
        end
      end

      def codebase_from_copy(original_dir, revision)
        codebase = nil
        Dir.mktmpdir do |tmp_dir|
          new_dir = copy_work_dir(original_dir, tmp_dir)
          git_reset(new_dir, revision)
          codebase = Codebase.parse(new_dir)
        end
        codebase
      end

      def copy_work_dir(original_dir, tmp_dir)
        git tmp_dir, "clone #{original_dir} --quiet"
        File.join(tmp_dir, File.basename(original_dir))
      end

      def git_reset(dir, revision = nil)
        git dir, "reset --hard #{revision}"
      end

    end
  end
end

Version data entries

19 entries across 19 versions & 1 rubygems

Version Path
inch-0.5.0.rc3 lib/inch/api/diff.rb
inch-0.5.0.rc2 lib/inch/api/diff.rb
inch-0.5.0.rc1 lib/inch/api/diff.rb
inch-0.4.6 lib/inch/api/diff.rb
inch-0.4.5 lib/inch/api/diff.rb
inch-0.4.4 lib/inch/api/diff.rb
inch-0.4.4.rc4 lib/inch/api/diff.rb
inch-0.4.4.rc3 lib/inch/api/diff.rb
inch-0.4.4.rc2 lib/inch/api/diff.rb
inch-0.4.4.rc1 lib/inch/api/diff.rb
inch-0.4.3 lib/inch/api/diff.rb
inch-0.4.3.rc2 lib/inch/api/diff.rb
inch-0.4.3.rc1 lib/inch/api/diff.rb
inch-0.4.2 lib/inch/api/diff.rb
inch-0.4.1 lib/inch/api/diff.rb
inch-0.4.0 lib/inch/api/diff.rb
inch-0.4.0.rc3 lib/inch/api/diff.rb
inch-0.4.0.rc2 lib/inch/api/diff.rb
inch-0.4.0.rc1 lib/inch/api/diff.rb