summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlamont-granquist <lamont@scriptkiddie.org>2014-08-23 10:25:38 -0700
committerlamont-granquist <lamont@scriptkiddie.org>2014-08-23 10:25:38 -0700
commit9f3ca0e4f4fdaae1257117421c99d3e920c9edf0 (patch)
treec8dded9ea7f02dfbdc195955b167422cf0c72c78
parent45e8bf3c416dff31d133a2ff8844bbbf63fb0c80 (diff)
parent55df049b4b261f79bc9da3073b6120cd693cb5ba (diff)
downloadchef-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.md4
-rw-r--r--lib/chef/mixin/deep_merge.rb9
-rw-r--r--spec/unit/mixin/deep_merge_spec.rb14
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