File: diff_as_string.rb

package info (click to toggle)
ruby-compass 1.0.3~dfsg-4
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 8,184 kB
  • ctags: 1,789
  • sloc: ruby: 12,904; makefile: 100; perl: 43; xml: 14; sh: 4
file content (48 lines) | stat: -rw-r--r-- 1,264 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
require 'diff/lcs'
require 'diff/lcs/hunk'

module DiffAsString
  #stole this from rspec who stole this from the gem
  def diff_as_string(data_old, data_new)
    data_old = data_old.split(/\n/).map! { |e| e.chomp }
    data_new = data_new.split(/\n/).map! { |e| e.chomp }
    output = ""
    diffs = ::Diff::LCS.diff(data_old, data_new)
    return output if diffs.empty?
    oldhunk = hunk = nil  
    file_length_difference = 0
    diffs.each do |piece|
      begin
        hunk = ::Diff::LCS::Hunk.new(
          data_old, data_new, piece, context_lines, file_length_difference
        )
        file_length_difference = hunk.file_length_difference      
        next unless oldhunk      
        # Hunks may overlap, which is why we need to be careful when our
        # diff includes lines of context. Otherwise, we might print
        # redundant lines.
        if (context_lines > 0) and hunk.overlaps?(oldhunk)
          hunk.unshift(oldhunk)
        else
          output << oldhunk.diff(format)
        end
      ensure
        oldhunk = hunk
        output << "\n"
      end
    end  
    #Handle the last remaining hunk
    output << oldhunk.diff(format) << "\n"
  end

  protected

  def format
    :unified
  end

  def context_lines
    3
  end

end