Sha256: 560ac7e5e1bb01b10c72a8bfe8a26c8ed61ac2f35ab87270f08b8326dc75c3c5

Contents?: true

Size: 1.97 KB

Versions: 42

Compression:

Stored size: 1.97 KB

Contents

require 'tempfile'

# Provide a diff between two strings.
module Puppet::Util::Diff
  include Puppet::Util::Execution
  require 'tempfile'

  def diff(old, new)
    return '' unless diff_cmd = Puppet[:diff] and diff_cmd != ""

    command = [diff_cmd]
    if args = Puppet[:diff_args] and args != ""
      command << args
    end
    command << old << new
    Puppet::Util::Execution.execute(command, :failonfail => false, :combine => false)
  end

  module_function :diff

  # return diff string of two input strings
  # format defaults to unified
  # context defaults to 3 lines
  def lcs_diff(data_old, data_new, format=:unified, context_lines=3)
    unless Puppet.features.diff?
      Puppet.warning "Cannot provide diff without the diff/lcs Ruby library"
      return ""
    end
    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

  def string_file_diff(path, string)
    tempfile = Tempfile.new("puppet-diffing")
    tempfile.open
    tempfile.print string
    tempfile.close
    notice "\n" + diff(path, tempfile.path)
    tempfile.delete
  end
end

Version data entries

42 entries across 42 versions & 2 rubygems

Version Path
puppet-3.5.1 lib/puppet/util/diff.rb
puppet-3.5.1-x86-mingw32 lib/puppet/util/diff.rb
puppet-3.5.1.rc1 lib/puppet/util/diff.rb
puppet-3.5.1.rc1-x86-mingw32 lib/puppet/util/diff.rb
puppet-3.5.0.rc3 lib/puppet/util/diff.rb
puppet-3.5.0.rc3-x86-mingw32 lib/puppet/util/diff.rb
puppet-3.5.0.rc2 lib/puppet/util/diff.rb
puppet-3.5.0.rc2-x86-mingw32 lib/puppet/util/diff.rb
puppet-3.5.0.rc1 lib/puppet/util/diff.rb
puppet-3.5.0.rc1-x86-mingw32 lib/puppet/util/diff.rb
puppet-3.4.3 lib/puppet/util/diff.rb
puppet-3.4.2 lib/puppet/util/diff.rb
puppet-3.4.1 lib/puppet/util/diff.rb
puppet-3.4.0 lib/puppet/util/diff.rb
puppet-3.4.0.rc2 lib/puppet/util/diff.rb
puppet-3.4.0.rc1 lib/puppet/util/diff.rb
puppet-3.3.2 lib/puppet/util/diff.rb
puppet-3.3.1 lib/puppet/util/diff.rb
puppet-3.3.1.rc3 lib/puppet/util/diff.rb
puppet-3.3.1.rc2 lib/puppet/util/diff.rb