summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorChris Price <chris@puppetlabs.com>2012-10-20 00:08:06 -0700
committerChris Price <chris@puppetlabs.com>2012-10-20 00:08:06 -0700
commitc2c26de9b10c3675e1044d5571e47e195a5d0167 (patch)
tree873024609da221f418b3acf642cd8ac75de2b3c8 /lib
parenta5eebcfca0c1c8e8fb8130205a6ec623c8691326 (diff)
downloadpuppet-inifile-c2c26de9b10c3675e1044d5571e47e195a5d0167.tar.gz
puppet-inifile-c2c26de9b10c3675e1044d5571e47e195a5d0167.tar.bz2
Respect indentation / spacing for existing sections and settings
This commit adds some cosmetic functionality. The main two improvements are: * We'll now pay attention to indentation within existing sections, and when we write new settings or update existing ones, we'll match the existing indentation. * When modifying existing settings, the regex now captures a greater portion of the original line and preserves it. Basically, the original whitespacing in the line should remain intact and only the value should be modified.
Diffstat (limited to 'lib')
-rw-r--r--lib/puppet/util/ini_file.rb19
-rw-r--r--lib/puppet/util/ini_file/section.rb5
2 files changed, 14 insertions, 10 deletions
diff --git a/lib/puppet/util/ini_file.rb b/lib/puppet/util/ini_file.rb
index 52ad32c..af9bc0e 100644
--- a/lib/puppet/util/ini_file.rb
+++ b/lib/puppet/util/ini_file.rb
@@ -6,7 +6,7 @@ module Util
class IniFile
SECTION_REGEX = /^\s*\[([\w\d\.\\\/\-\:]+)\]\s*$/
- SETTING_REGEX = /^\s*([\w\d\.\\\/\-]+)\s*=\s*([\S\s]*\S)\s*$/
+ SETTING_REGEX = /^(\s*)([\w\d\.\\\/\-]+)(\s*=\s*)([\S\s]*\S)\s*$/
def initialize(path, key_val_separator = ' = ')
@path = path
@@ -30,7 +30,7 @@ module Util
def set_value(section_name, setting, value)
unless (@sections_hash.has_key?(section_name))
- add_section(Section.new(section_name, nil, nil, nil))
+ add_section(Section.new(section_name, nil, nil, nil, nil))
end
section = @sections_hash[section_name]
@@ -77,7 +77,7 @@ module Util
end
section.additional_settings.each_pair do |key, value|
- fh.puts("#{key}#{@key_val_separator}#{value}")
+ fh.puts("#{' ' * (section.indentation || 0)}#{key}#{@key_val_separator}#{value}")
end
end
end
@@ -111,12 +111,15 @@ module Util
def read_section(name, start_line, line_iter)
settings = {}
end_line_num = nil
+ min_indentation = nil
while true
line, line_num = line_iter.peek
if (line_num.nil? or match = SECTION_REGEX.match(line))
- return Section.new(name, start_line, end_line_num, settings)
+ return Section.new(name, start_line, end_line_num, settings, min_indentation)
elsif (match = SETTING_REGEX.match(line))
- settings[match[1]] = match[2]
+ settings[match[2]] = match[4]
+ indentation = match[1].length
+ min_indentation = [indentation, min_indentation || indentation].min
end
end_line_num = line_num
line_iter.next
@@ -126,8 +129,8 @@ module Util
def update_line(section, setting, value)
(section.start_line..section.end_line).each do |line_num|
if (match = SETTING_REGEX.match(lines[line_num]))
- if (match[1] == setting)
- lines[line_num] = "#{setting}#{@key_val_separator}#{value}"
+ if (match[2] == setting)
+ lines[line_num] = "#{match[1]}#{match[2]}#{match[3]}#{value}"
end
end
end
@@ -136,7 +139,7 @@ module Util
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)
+ if (match[2] == setting)
lines.delete_at(line_num)
end
end
diff --git a/lib/puppet/util/ini_file/section.rb b/lib/puppet/util/ini_file/section.rb
index 16f19d3..c565872 100644
--- a/lib/puppet/util/ini_file/section.rb
+++ b/lib/puppet/util/ini_file/section.rb
@@ -2,15 +2,16 @@ module Puppet
module Util
class IniFile
class Section
- def initialize(name, start_line, end_line, settings)
+ def initialize(name, start_line, end_line, settings, indentation)
@name = name
@start_line = start_line
@end_line = end_line
@existing_settings = settings.nil? ? {} : settings
@additional_settings = {}
+ @indentation = indentation
end
- attr_reader :name, :start_line, :end_line, :additional_settings
+ attr_reader :name, :start_line, :end_line, :additional_settings, :indentation
def get_value(setting_name)
@existing_settings[setting_name] || @additional_settings[setting_name]