diff options
author | Alex Slynko <alex.slynko@wonga.com> | 2014-08-20 22:47:18 +0100 |
---|---|---|
committer | Jay Mundrawala <jdmundrawala@gmail.com> | 2014-09-10 09:49:54 -0700 |
commit | e6613a101de325caab78a1b392d0a149d02e270c (patch) | |
tree | a4e8fa0bb1c9fe4edf2174a169df61f3722bc44c | |
parent | 549f629d1b23010ebd9dd811babca7f174fd6af1 (diff) | |
download | chef-e6613a101de325caab78a1b392d0a149d02e270c.tar.gz |
Fix setting Path for Windows
-rw-r--r-- | lib/chef/provider/env/windows.rb | 14 | ||||
-rw-r--r-- | spec/unit/provider/env/windows_spec.rb | 17 |
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 |