diff --git a/lib/puppet/util/ini_file.rb b/lib/puppet/util/ini_file.rb index b7529812..3acbf7a4 100644 --- a/lib/puppet/util/ini_file.rb +++ b/lib/puppet/util/ini_file.rb @@ -222,6 +222,7 @@ def read_section(name, start_line, line_iter) end_line_num = start_line min_indentation = nil empty = true + empty_line_count = 0 loop do line, line_num = line_iter.peek if line_num.nil? || @section_regex.match(line) @@ -229,7 +230,7 @@ def read_section(name, start_line, line_iter) # when it's empty, we must be sure it's thought of as new, # which is signalled with a nil ending line end_line_num = nil if name == '' && empty - return Section.new(name, start_line, end_line_num, settings, min_indentation) + return Section.new(name, start_line, end_line_num, settings, min_indentation, empty_line_count) end if (match = @setting_regex.match(line)) settings[match[2]] = match[4] @@ -237,6 +238,8 @@ def read_section(name, start_line, line_iter) min_indentation = [indentation, min_indentation || indentation].min end end_line_num = line_num + empty_line_count += 1 if line == "\n" + empty = false line_iter.next end diff --git a/lib/puppet/util/ini_file/section.rb b/lib/puppet/util/ini_file/section.rb index 46e01477..4e29b5fd 100644 --- a/lib/puppet/util/ini_file/section.rb +++ b/lib/puppet/util/ini_file/section.rb @@ -14,13 +14,14 @@ class Section # `end_line` of `nil`. # * `start_line` and `end_line` will be set to `nil` for a new non-global # section. - def initialize(name, start_line, end_line, settings, indentation) + def initialize(name, start_line, end_line, settings, indentation, empty_line_count = 0) @name = name @start_line = start_line @end_line = end_line @existing_settings = settings.nil? ? {} : settings @additional_settings = {} @indentation = indentation + @empty_line_count = empty_line_count end attr_reader :name, :start_line, :end_line, :additional_settings, :indentation @@ -50,7 +51,7 @@ def existing_setting?(setting_name) # the global section is empty whenever it's new; # other sections are empty when they have no lines def empty? - global? ? new_section? : start_line == end_line + global? ? new_section? : (start_line == end_line || (end_line && (end_line - @empty_line_count)) == start_line) end def update_existing_setting(setting_name, value) diff --git a/spec/unit/puppet/provider/ini_setting/ruby_spec.rb b/spec/unit/puppet/provider/ini_setting/ruby_spec.rb index a250bcde..ef7da0eb 100644 --- a/spec/unit/puppet/provider/ini_setting/ruby_spec.rb +++ b/spec/unit/puppet/provider/ini_setting/ruby_spec.rb @@ -1141,6 +1141,38 @@ def self.file_path end end + context 'when section has only empty line' do + let(:orig_content) do + <<~INIFILE + [section1] + foo=foovalue + + + [section2] + + foo= foovalue2 + baz=bazvalue + url = http:// + INIFILE + end + + expected_content = <<~INIFILE + [section2] + + foo= foovalue2 + baz=bazvalue + url = http:// + INIFILE + + it 'remove empty section' do + resource = Puppet::Type::Ini_setting.new(common_params.merge(section: 'section1', setting: 'foo', ensure: 'absent')) + provider = described_class.new(resource) + expect(provider.exists?).to be true + provider.destroy + validate_file(expected_content, tmpfile) + end + end + context 'when dealing with indentation in sections' do let(:orig_content) do <<~INIFILE