Class: Diff::LCS::Hunk

Inherits:
Object
  • Object
show all
Defined in:
lib/diff/lcs/hunk.rb

Overview

A Hunk is a group of Blocks which overlap because of the context surrounding each block. (So if we’re not using context, every hunk will contain one block.) Used in the diff program (bin/diff).

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(data_old, data_new, piece, context, file_length_difference) ⇒ Hunk

Create a hunk using references to both the old and new data, as well as the piece of data



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
# File 'lib/diff/lcs/hunk.rb', line 9

def initialize(data_old, data_new, piece, context, file_length_difference)
    # At first, a hunk will have just one Block in it
  @blocks = [ Diff::LCS::Block.new(piece) ]
  @data_old = data_old
  @data_new = data_new

  before = after = file_length_difference
  after += @blocks[0].diff_size
  @file_length_difference = after # The caller must get this manually

    # Save the start & end of each array. If the array doesn't exist
    # (e.g., we're only adding items in this block), then figure out the
    # line number based on the line number of the other file and the
    # current difference in file lengths.
  if @blocks[0].remove.empty?
    a1 = a2 = nil
  else
    a1 = @blocks[0].remove[0].position
    a2 = @blocks[0].remove[-1].position
  end

  if @blocks[0].insert.empty?
    b1 = b2 = nil
  else
    b1 = @blocks[0].insert[0].position
    b2 = @blocks[0].insert[-1].position
  end

  @start_old = a1 || (b1 - before)
  @start_new = b1 || (a1 + before)
  @end_old   = a2 || (b2 - after)
  @end_new   = b2 || (a2 + after)

  self.flag_context = context
end

Instance Attribute Details

#blocksObject (readonly)

Returns the value of attribute blocks.



45
46
47
# File 'lib/diff/lcs/hunk.rb', line 45

def blocks
  @blocks
end

#end_newObject (readonly)

Returns the value of attribute end_new.



47
48
49
# File 'lib/diff/lcs/hunk.rb', line 47

def end_new
  @end_new
end

#end_oldObject (readonly)

Returns the value of attribute end_old.



47
48
49
# File 'lib/diff/lcs/hunk.rb', line 47

def end_old
  @end_old
end

#file_length_differenceObject (readonly)

Returns the value of attribute file_length_difference.



48
49
50
# File 'lib/diff/lcs/hunk.rb', line 48

def file_length_difference
  @file_length_difference
end

#flag_contextObject

Change the “start” and “end” fields to note that context should be added to this hunk



52
53
54
# File 'lib/diff/lcs/hunk.rb', line 52

def flag_context
  @flag_context
end

#start_newObject (readonly)

Returns the value of attribute start_new.



46
47
48
# File 'lib/diff/lcs/hunk.rb', line 46

def start_new
  @start_new
end

#start_oldObject (readonly)

Returns the value of attribute start_old.



46
47
48
# File 'lib/diff/lcs/hunk.rb', line 46

def start_old
  @start_old
end

Instance Method Details

#diff(format) ⇒ Object



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/diff/lcs/hunk.rb', line 86

def diff(format)
  case format
  when :old
    old_diff
  when :unified
    unified_diff
  when :context
    context_diff
  when :ed
    self
  when :reverse_ed, :ed_finish
    ed_diff(format)
  else
    raise "Unknown diff format #{format}."
  end
end

#each_old(block) ⇒ Object



103
104
105
# File 'lib/diff/lcs/hunk.rb', line 103

def each_old(block)
  @data_old[@start_old .. @end_old].each { |e| yield e }
end

#overlaps?(hunk = nil) ⇒ Boolean

Is there an overlap between hunk arg0 and old hunk arg1? Note: if end of old hunk is one less than beginning of second, they overlap

Returns:

  • (Boolean)


78
79
80
81
82
83
84
# File 'lib/diff/lcs/hunk.rb', line 78

def overlaps?(hunk = nil)
  return nil if hunk.nil?

  a = (@start_old - hunk.end_old) <= 1
  b = (@start_new - hunk.end_new) <= 1
  return (a or b)
end

#unshift(hunk) ⇒ Object



70
71
72
73
74
# File 'lib/diff/lcs/hunk.rb', line 70

def unshift(hunk)
  @start_old = hunk.start_old
  @start_new = hunk.start_new
  blocks.unshift(*hunk.blocks)
end