diff options
author | lamont-granquist <lamont@scriptkiddie.org> | 2014-08-23 10:25:38 -0700 |
---|---|---|
committer | lamont-granquist <lamont@scriptkiddie.org> | 2014-08-23 10:25:38 -0700 |
commit | 9f3ca0e4f4fdaae1257117421c99d3e920c9edf0 (patch) | |
tree | c8dded9ea7f02dfbdc195955b167422cf0c72c78 | |
parent | 45e8bf3c416dff31d133a2ff8844bbbf63fb0c80 (diff) | |
parent | 55df049b4b261f79bc9da3073b6120cd693cb5ba (diff) | |
download | chef-9f3ca0e4f4fdaae1257117421c99d3e920c9edf0.tar.gz |
Merge pull request #1851 from opscode/lcg/chef-4101
CHEF-4101: DeepMerge - support overwriting hash values with nil
-rw-r--r-- | CHANGELOG.md | 4 | ||||
-rw-r--r-- | lib/chef/mixin/deep_merge.rb | 9 | ||||
-rw-r--r-- | spec/unit/mixin/deep_merge_spec.rb | 14 |
3 files changed, 22 insertions, 5 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 10d664989e..eabdfbdff4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ ## Unreleased: 12.0.0 -### Community Contributions - +* [**Malte Swart**](https://github.com/mswart): + [CHEF-4101] DeepMerge - support overwriting hash values with nil * [**James Belchamber**](https://github.com/JamesBelchamber): Mount provider remount action now honours options * [**Mark Gibbons**](https://github.com/MarkGibbons): diff --git a/lib/chef/mixin/deep_merge.rb b/lib/chef/mixin/deep_merge.rb index a8a4737758..5e3327a526 100644 --- a/lib/chef/mixin/deep_merge.rb +++ b/lib/chef/mixin/deep_merge.rb @@ -29,7 +29,6 @@ class Chef class InvalidSubtractiveMerge < ArgumentError; end - OLD_KNOCKOUT_PREFIX = "!merge:".freeze # Regex to match the "knockout prefix" that was used to indicate @@ -86,8 +85,12 @@ class Chef when Hash if dest.kind_of?(Hash) source.each do |src_key, src_value| - if dest[src_key] - dest[src_key] = deep_merge!(src_value, dest[src_key]) + if dest.has_key? src_key + if dest[src_key].nil? + dest[src_key] = nil + else + dest[src_key] = deep_merge!(src_value, dest[src_key]) + end else # dest[src_key] doesn't exist so we take whatever source has raise_if_knockout_used!(src_value) dest[src_key] = src_value diff --git a/spec/unit/mixin/deep_merge_spec.rb b/spec/unit/mixin/deep_merge_spec.rb index 76f5c68a29..dbc49e68f2 100644 --- a/spec/unit/mixin/deep_merge_spec.rb +++ b/spec/unit/mixin/deep_merge_spec.rb @@ -236,6 +236,20 @@ describe Chef::Mixin::DeepMerge, "deep_merge!" do @dm.deep_merge!(hash_src, hash_dst) hash_dst.should == {"item" => "orange"} end + + it 'should overwrite hashes with nil' do + hash_src = {"item" => { "1" => "2"}, "other" => true } + hash_dst = {"item" => nil } + @dm.deep_merge!(hash_src, hash_dst) + hash_dst.should == {"item" => nil, "other" => true } + end + + it 'should overwrite strings with nil' do + hash_src = {"item" => "to_overwrite", "other" => false } + hash_dst = {"item" => nil } + @dm.deep_merge!(hash_src, hash_dst) + hash_dst.should == {"item" => nil, "other" => false } + end end # deep_merge! # Chef specific |