summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorChris Price <chris@puppetlabs.com>2012-10-17 15:50:02 -0700
committerChris Price <chris@puppetlabs.com>2012-10-17 15:50:02 -0700
commita5eebcfca0c1c8e8fb8130205a6ec623c8691326 (patch)
tree17a5bb35c8861a745786105eeaee2e7d8479e711 /lib
parent842b2f06b2d8bcd8a8e7ed00b2d388bc4ddf1db2 (diff)
parentcda30a6ab9b6fa673ead091ab0b130cbc6e75dbc (diff)
downloadpuppet-inifile-a5eebcfca0c1c8e8fb8130205a6ec623c8691326.tar.gz
puppet-inifile-a5eebcfca0c1c8e8fb8130205a6ec623c8691326.tar.bz2
Merge pull request #18 from cprice-puppet/feature/master/tweaks-to-setting-removal
Feature/master/tweaks to setting removal
Diffstat (limited to 'lib')
-rw-r--r--lib/puppet/provider/ini_setting/ruby.rb6
-rw-r--r--lib/puppet/util/ini_file.rb41
-rw-r--r--lib/puppet/util/ini_file/section.rb22
3 files changed, 68 insertions, 1 deletions
diff --git a/lib/puppet/provider/ini_setting/ruby.rb b/lib/puppet/provider/ini_setting/ruby.rb
index 946685e..2c13847 100644
--- a/lib/puppet/provider/ini_setting/ruby.rb
+++ b/lib/puppet/provider/ini_setting/ruby.rb
@@ -12,6 +12,12 @@ Puppet::Type.type(:ini_setting).provide(:ruby) do
@ini_file = nil
end
+ def destroy
+ ini_file.remove_setting(section, setting)
+ ini_file.save
+ @ini_file = nil
+ end
+
def value
ini_file.get_value(section, setting)
end
diff --git a/lib/puppet/util/ini_file.rb b/lib/puppet/util/ini_file.rb
index b2e554f..52ad32c 100644
--- a/lib/puppet/util/ini_file.rb
+++ b/lib/puppet/util/ini_file.rb
@@ -42,10 +42,30 @@ module Util
end
end
+ def remove_setting(section_name, setting)
+ section = @sections_hash[section_name]
+ if (section.has_existing_setting?(setting))
+ # If the setting is found, we have some work to do.
+ # First, we remove the line from our array of lines:
+ remove_line(section, setting)
+
+ # Then, we need to tell the setting object to remove
+ # the setting from its state:
+ section.remove_existing_setting(setting)
+
+ # Finally, we need to update all of the start/end line
+ # numbers for all of the sections *after* the one that
+ # was modified.
+ section_index = @section_names.index(section_name)
+ decrement_section_line_numbers(section_index + 1)
+ end
+ end
+
def save
File.open(@path, 'w') do |fh|
@section_names.each do |name|
+
section = @sections_hash[name]
if section.start_line.nil?
@@ -113,6 +133,16 @@ module Util
end
end
+ def remove_line(section, setting)
+ (section.start_line..section.end_line).each do |line_num|
+ if (match = SETTING_REGEX.match(lines[line_num]))
+ if (match[1] == setting)
+ lines.delete_at(line_num)
+ end
+ end
+ end
+ end
+
def create_line_iter
ExternalIterator.new(lines)
end
@@ -132,6 +162,17 @@ module Util
File.readlines(path)
end
+
+ # Utility method; given a section index (index into the @section_names
+ # array), decrement the start/end line numbers for that section and all
+ # all of the other sections that appear *after* the specified section.
+ def decrement_section_line_numbers(section_index)
+ @section_names[section_index..(@section_names.length - 1)].each do |name|
+ section = @sections_hash[name]
+ section.decrement_line_nums
+ end
+ end
+
end
end
end
diff --git a/lib/puppet/util/ini_file/section.rb b/lib/puppet/util/ini_file/section.rb
index 39f2959..16f19d3 100644
--- a/lib/puppet/util/ini_file/section.rb
+++ b/lib/puppet/util/ini_file/section.rb
@@ -24,11 +24,31 @@ class IniFile
@existing_settings[setting_name] = value
end
+ def remove_existing_setting(setting_name)
+ if (@existing_settings.delete(setting_name))
+ if @end_line
+ @end_line = @end_line - 1
+ end
+ end
+ end
+
def set_additional_setting(setting_name, value)
@additional_settings[setting_name] = value
end
+ # Decrement the start and end line numbers for the section (if they are
+ # defined); this is intended to be called when a setting is removed
+ # from a section that comes before this section in the ini file.
+ def decrement_line_nums()
+ if @start_line
+ @start_line = @start_line - 1
+ end
+ if @end_line
+ @end_line = @end_line - 1
+ end
+ end
+
end
end
end
-end \ No newline at end of file
+end