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