Parent

Diff::LCS::Hunk

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).

Attributes

blocks[R]
end_new[R]
end_old[R]
file_length_difference[R]
flag_context[RW]

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

start_new[R]
start_old[R]

Public Class Methods

new(data_old, data_new, piece, context, file_length_difference) click to toggle source

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

# 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

Public Instance Methods

diff(format) click to toggle source
# 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) click to toggle source
# 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) click to toggle source

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

# 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) click to toggle source
# 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

[Validate]

Generated with the Darkfish Rdoc Generator 2.