From 12f825204b6c8f45015b077906ed2dd74e59705a Mon Sep 17 00:00:00 2001 From: David Dollar Date: Fri, 24 Feb 2012 11:30:55 -0500 Subject: [PATCH] support various quoting styles in .env --- lib/foreman/engine.rb | 8 ++++++-- spec/foreman/engine_spec.rb | 24 ++++++++++++++++-------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/lib/foreman/engine.rb b/lib/foreman/engine.rb index 3e169a0..f6e28ed 100644 --- a/lib/foreman/engine.rb +++ b/lib/foreman/engine.rb @@ -213,9 +213,13 @@ private ###################################################################### def read_environment(filename) return {} unless File.exists?(filename) - if line =~ /\A([A-Za-z_0-9]+)=(.*)\z/ - hash[$1] = $2 File.read(filename).split("\n").inject({}) do |hash, line| + if line =~ /\A([A-Za-z_0-9]+)=(.*)\z/ + key, val = [$1, $2] + case val + when /\A'(.*)'\z/ then hash[key] = $1 + when /\A"(.*)"\z/ then hash[key] = $1.gsub(/\\(.)/, '\1') + else hash[key] = val end end hash diff --git a/spec/foreman/engine_spec.rb b/spec/foreman/engine_spec.rb index 53d6c70..a7e8516 100644 --- a/spec/foreman/engine_spec.rb +++ b/spec/foreman/engine_spec.rb @@ -53,14 +53,16 @@ describe "Foreman::Engine", :fakefs do before(:each) do write_procfile stub(Process).fork + any_instance_of(Foreman::Engine) do |engine| + stub(engine).info + stub(engine).spawn_processes + stub(engine).watch_for_termination + end end it "should read if specified" do File.open("/tmp/env", "w") { |f| f.puts("FOO=baz") } engine = Foreman::Engine.new("Procfile", :env => "/tmp/env") - stub(engine).info - mock(engine).spawn_processes - mock(engine).watch_for_termination engine.environment.should == {"FOO"=>"baz"} engine.start end @@ -69,13 +71,21 @@ describe "Foreman::Engine", :fakefs do File.open("/tmp/env1", "w") { |f| f.puts("FOO=bar") } File.open("/tmp/env2", "w") { |f| f.puts("BAZ=qux") } engine = Foreman::Engine.new("Procfile", :env => "/tmp/env1,/tmp/env2") - stub(engine).info - mock(engine).spawn_processes - mock(engine).watch_for_termination engine.environment.should == { "FOO"=>"bar", "BAZ"=>"qux" } engine.start end + it "should handle quoted values" do + File.open("/tmp/env", "w") do |f| + f.puts 'FOO=bar' + f.puts 'BAZ="qux"' + f.puts "FRED='barney'" + f.puts 'OTHER="escaped\"quote"' + end + engine = Foreman::Engine.new("Procfile", :env => "/tmp/env") + engine.environment.should == { "FOO" => "bar", "BAZ" => "qux", "FRED" => "barney", "OTHER" => 'escaped"quote' } + end + it "should fail if specified and doesnt exist" do mock.instance_of(Foreman::Engine).error("No such file: /tmp/env") engine = Foreman::Engine.new("Procfile", :env => "/tmp/env") @@ -84,8 +94,6 @@ describe "Foreman::Engine", :fakefs do it "should read .env if none specified" do File.open(".env", "w") { |f| f.puts("FOO=qoo") } engine = Foreman::Engine.new("Procfile") - mock(engine).spawn_processes - mock(engine).watch_for_termination engine.environment.should == {"FOO"=>"qoo"} engine.start end