Class: Fig::Backtrace

Inherits:
Object
  • Object
show all
Defined in:
lib/fig/backtrace.rb

Overview

Keeps track of overrides and can produce package definition stack traces.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(parent, descriptor) ⇒ Backtrace

Returns a new instance of Backtrace.



9
10
11
12
13
# File 'lib/fig/backtrace.rb', line 9

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

Instance Attribute Details

#overridesObject (readonly)

Returns the value of attribute overrides.



7
8
9
# File 'lib/fig/backtrace.rb', line 7

def overrides
  @overrides
end

Instance Method Details

#add_override(statement) ⇒ Object



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/fig/backtrace.rb', line 15

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

#dump(out) ⇒ Object

Prints a stack trace to the IO object.



42
43
44
45
46
47
48
49
50
51
52
# File 'lib/fig/backtrace.rb', line 42

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)
    i += 1
  end
end

#get_override(package_name, default_version = nil) ⇒ Object

Returns a version.



33
34
35
36
37
38
39
# File 'lib/fig/backtrace.rb', line 33

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