Sha256: 1f10b745cc3832b6e870e831da69da461a0f1c66a3d27c1ce0ad08019010049a

Contents?: true

Size: 1.85 KB

Versions: 33

Compression:

Stored size: 1.85 KB

Contents

require 'fig/repository_error'

module Fig; end

# Stack of applied "include" statements.
#
# Keeps track of overrides and can produce package definition stack traces.
#
# Pushing and popping actually happens via instances being held/let go by
# recursive method calls on RuntimeEnvironment.
class Fig::IncludeBacktrace
  attr_reader :overrides

  def initialize(parent, descriptor)
    @parent     = parent
    @descriptor = descriptor
    @overrides  = {}
  end

  def add_override(statement)
    package_name = statement.package_name
    # Don't replace an existing override on the stack
    return if @parent && @parent.get_override(package_name)

    new_version = statement.version
    existing_version = @overrides[package_name]
    if existing_version && existing_version != new_version
      stacktrace = dump_to_string()
      raise Fig::RepositoryError.new(
        "Override #{package_name} version conflict (#{existing_version} vs #{new_version})#{statement.position_string}." + ( stacktrace.empty? ? '' : "\n#{stacktrace}" )
      )
    end

    @overrides[package_name] = new_version
  end

  # Returns a version.
  def get_override(package_name, default_version = nil)
    version = @overrides[package_name]
    return version if version

    return @parent.get_override(package_name, default_version) if @parent
    return default_version
  end

  # Prints a stack trace to the IO object.
  def dump(out)
    stack = []
    collect(stack)
    i = 0
    for descriptor in stack
      indent=''
      i.times { indent += '  ' }
      out.puts indent + descriptor.to_string(:use_default_config, :use_description)
      i += 1
    end
  end

  protected

  def dump_to_string()
    string_handle = StringIO.new
    dump(string_handle)
    return string_handle.string
  end

  def collect(stack)
    if @parent
      @parent.collect(stack)
    end

    stack << @descriptor
  end
end

Version data entries

33 entries across 33 versions & 1 rubygems

Version Path
fig-1.23.0 lib/fig/include_backtrace.rb
fig-1.22.1.beta.1 lib/fig/include_backtrace.rb
fig-1.22.0 lib/fig/include_backtrace.rb
fig-1.21.1.beta.2 lib/fig/include_backtrace.rb
fig-1.21.1.beta.1 lib/fig/include_backtrace.rb
fig-1.21.0 lib/fig/include_backtrace.rb
fig-1.20.1.beta.1 lib/fig/include_backtrace.rb
fig-1.20.0 lib/fig/include_backtrace.rb
fig-1.19.0 lib/fig/include_backtrace.rb
fig-1.18.0 lib/fig/include_backtrace.rb
fig-1.17.0 lib/fig/include_backtrace.rb
fig-1.16.1.beta.1 lib/fig/include_backtrace.rb
fig-1.16.0 lib/fig/include_backtrace.rb
fig-1.15.1.beta.2 lib/fig/include_backtrace.rb
fig-1.15.1.beta.1 lib/fig/include_backtrace.rb
fig-1.15.0 lib/fig/include_backtrace.rb
fig-1.14.0 lib/fig/include_backtrace.rb
fig-1.13.0 lib/fig/include_backtrace.rb
fig-1.12.0 lib/fig/include_backtrace.rb
fig-1.11.0 lib/fig/include_backtrace.rb