summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Slynko <alex.slynko@wonga.com>2014-08-20 22:47:18 +0100
committerJay Mundrawala <jdmundrawala@gmail.com>2014-09-10 09:49:54 -0700
commite6613a101de325caab78a1b392d0a149d02e270c (patch)
treea4e8fa0bb1c9fe4edf2174a169df61f3722bc44c
parent549f629d1b23010ebd9dd811babca7f174fd6af1 (diff)
downloadchef-e6613a101de325caab78a1b392d0a149d02e270c.tar.gz
Fix setting Path for Windows
-rw-r--r--lib/chef/provider/env/windows.rb14
-rw-r--r--spec/unit/provider/env/windows_spec.rb17
2 files changed, 30 insertions, 1 deletions
diff --git a/lib/chef/provider/env/windows.rb b/lib/chef/provider/env/windows.rb
index f73cb42f7e..990ab178af 100644
--- a/lib/chef/provider/env/windows.rb
+++ b/lib/chef/provider/env/windows.rb
@@ -33,7 +33,10 @@ class Chef
end
obj.variablevalue = @new_resource.value
obj.put_
- ENV[@new_resource.key_name] = @new_resource.value
+ value = @new_resource.value
+ value = expand_path(value) if @new_resource.key_name.upcase == 'PATH'
+ ENV[@new_resource.key_name] = value
+
broadcast_env_change
end
@@ -71,6 +74,15 @@ class Chef
flags = SMTO_BLOCK | SMTO_ABORTIFHUNG | SMTO_NOTIMEOUTIFNOTHUNG
SendMessageTimeoutA(HWND_BROADCAST, WM_SETTINGCHANGE, 0, FFI::MemoryPointer.from_string('Environment').address, flags, 5000, nil)
end
+
+ private
+
+ def expand_path(path)
+ system_vars = %w(HomeDrive HomePath ProgramFiles SystemDirectory SystemDrive SystemRoot Temp Tmp UserProfile WinDir)
+ system_vars.each_with_object(path) do |variable, new_path|
+ new_path.gsub!(/%#{variable}%/i, ENV[variable]) if ENV[variable]
+ end
+ end
end
end
end
diff --git a/spec/unit/provider/env/windows_spec.rb b/spec/unit/provider/env/windows_spec.rb
index 329448ac05..8f72d19b29 100644
--- a/spec/unit/provider/env/windows_spec.rb
+++ b/spec/unit/provider/env/windows_spec.rb
@@ -52,6 +52,23 @@ describe Chef::Provider::Env::Windows, :windows_only do
@provider.action_modify
expect(ENV['CHEF_WINDOWS_ENV_TEST']).to eql('foobar')
end
+
+ describe "for PATH" do
+ before do
+ stub_const('ENV', {'SystemRoot' => 'D:\\Windows', 'Path' => 'D:\\Path'})
+ @new_resource = Chef::Resource::Env.new('Path')
+ @new_resource.value("%SystemRoot%")
+
+ @provider = Chef::Provider::Env::Windows.new(@new_resource, @run_context)
+ @provider.stub(:env_obj).and_return(double('null object').as_null_object)
+ end
+
+ it "replaces Windows system variables" do
+ @provider.should_receive(:compare_value).and_return(true)
+ @provider.action_modify
+ expect(ENV['Path']).to eql('D:\\Windows')
+ end
+ end
end
describe "action_delete" do