lib/fig/environment.rb in fig-0.1.35 vs lib/fig/environment.rb in fig-0.1.36
- old
+ new
@@ -1,19 +1,22 @@
+require 'fig/backtrace'
+
module Fig
# This class manages the program's state, including the value of all environment
# variables, and which packages have already been applied
class Environment
DEFAULT_VERSION_NAME = "current"
- def initialize(os, repository, variables)
+ def initialize(os, repository, variables, retriever)
@os = os
@repository = repository
@variables = variables
@retrieve_vars = {}
@packages = {}
@applied_configs = {}
+ @retriever = retriever
end
# Returns the value of an envirionment variable
def [](name)
@variables[name]
@@ -32,27 +35,28 @@
exit 10
end
@packages[name] = package
end
- def apply_config(package, config_name)
+ def apply_config(package, config_name, backtrace)
if (@applied_configs[package.package_name] ||= []).member?(config_name)
return
end
+ new_backtrace = Backtrace.new(backtrace, package.package_name, package.version_name, config_name)
config = package[config_name]
- config.statements.each { |stmt| apply_config_statement(package, stmt) }
+ config.statements.each { |stmt| apply_config_statement(package, stmt, new_backtrace) }
@applied_configs[package.package_name] << config_name
end
def execute_shell(command)
with_environment do
yield command.map{|arg| expand_arg(arg)}
end
end
def execute_config(base_package, package_name, config_name, version_name, args)
- package = lookup_package(package_name || base_package.package_name, version_name)
+ package = lookup_package(package_name || base_package.package_name, version_name, Backtrace.new(nil, package_name, version_name, config_name))
result = nil
commands = package[config_name || "default"].commands
with_environment do
# todo nil check
commands.each do |command|
@@ -60,32 +64,33 @@
end
end
result
end
- def apply_config_statement(base_package, statement)
+ def apply_config_statement(base_package, statement, backtrace)
case statement
when Path
append_variable(base_package, statement.name, statement.value)
when Set
set_variable(base_package, statement.name, statement.value)
when Include
- include_config(base_package, statement.package_name, statement.config_name, statement.version_name)
+ include_config(base_package, statement.package_name, statement.config_name, statement.version_name, backtrace)
when Command
# ignore
else
fail "Unexpected statement: #{statement}"
end
end
- def include_config(base_package, package_name, config_name, version_name)
- package = lookup_package(package_name || base_package.package_name, version_name)
- apply_config(package, config_name || "default")
+ def include_config(base_package, package_name, config_name, version_name, backtrace)
+ new_backtrace = Backtrace.new(backtrace, package_name, version_name, config_name)
+ package = lookup_package(package_name || base_package.package_name, version_name, new_backtrace)
+ apply_config(package, config_name || "default", backtrace)
end
def direct_retrieve(package_name, source_path, target_path)
- package = lookup_package(package_name, nil)
+ package = lookup_package(package_name, nil, nil)
FileUtils.mkdir_p(target_path)
FileUtils.cp_r(File.join(package.directory, source_path, '.'), target_path)
end
private
@@ -121,17 +126,20 @@
ensure
old_env.each { |key,value| ENV[key] = value }
end
end
- def lookup_package(package_name, version_name)
+ def lookup_package(package_name, version_name, backtrace)
package = @packages[package_name]
if package.nil?
package = @repository.load_package(package_name, version_name || DEFAULT_VERSION_NAME)
+ package.backtrace = backtrace
@packages[package_name] = package
elsif version_name && version_name != package.version_name
$stderr.puts "Version mismatch: #{package_name}"
+ backtrace.dump($stderr) if backtrace
+ package.backtrace.dump($stderr) if package.backtrace
exit 10
end
package
end
@@ -149,10 +157,12 @@
target = File.join(@retrieve_vars[name].gsub(/\[package\]/, base_package.package_name))
if not File.directory?(file)
target = File.join(target, File.basename(file))
end
end
- @os.copy(file, target, "retrieving")
+ @retriever.with_config(base_package.package_name, base_package.version_name) do
+ @retriever.retrieve(file, target)
+ end
file = target
end
file
end