ini_file: fix unmatched whitespace before comment (#10102)

* ini_file: fix unmatched whitespace before comment

* Add changelog fragment

* Update changelog fragment: bugfixes to minor_changes

Co-authored-by: Felix Fontein <felix@fontein.de>

---------

Co-authored-by: sibebleuze <>
Co-authored-by: Felix Fontein <felix@fontein.de>
This commit is contained in:
Sibe Bleuzé 2025-05-10 13:21:36 +02:00 committed by GitHub
parent fcd2d8b7b7
commit 43eb342b18
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 53 additions and 9 deletions

View file

@ -0,0 +1,2 @@
minor_changes:
- ini_file - modify an inactive option also when there are spaces in front of the comment symbol (https://github.com/ansible-collections/community.general/pull/10102, https://github.com/ansible-collections/community.general/issues/8539).

View file

@ -268,21 +268,21 @@ from ansible.module_utils.common.text.converters import to_bytes, to_text
def match_opt(option, line):
option = re.escape(option)
return re.match('([#;]?)( |\t)*(%s)( |\t)*(=|$)( |\t)*(.*)' % option, line)
return re.match('( |\t)*([#;]?)( |\t)*(%s)( |\t)*(=|$)( |\t)*(.*)' % option, line)
def match_active_opt(option, line):
option = re.escape(option)
return re.match('()( |\t)*(%s)( |\t)*(=|$)( |\t)*(.*)' % option, line)
return re.match('()()( |\t)*(%s)( |\t)*(=|$)( |\t)*(.*)' % option, line)
def update_section_line(option, changed, section_lines, index, changed_lines, ignore_spaces, newline, msg):
option_changed = None
if ignore_spaces:
old_match = match_opt(option, section_lines[index])
if not old_match.group(1):
if not old_match.group(2):
new_match = match_opt(option, newline)
option_changed = old_match.group(7) != new_match.group(7)
option_changed = old_match.group(8) != new_match.group(8)
if option_changed is None:
option_changed = section_lines[index] != newline
if option_changed:
@ -299,7 +299,7 @@ def check_section_has_values(section_has_values, section_lines):
for condition in section_has_values:
for line in section_lines:
match = match_opt(condition["option"], line)
if match and (len(condition["values"]) == 0 or match.group(7) in condition["values"]):
if match and (len(condition["values"]) == 0 or match.group(8) in condition["values"]):
break
else:
return False
@ -432,8 +432,8 @@ def do_ini(module, filename, section=None, section_has_values=None, option=None,
for index, line in enumerate(section_lines):
if match_function(option, line):
match = match_function(option, line)
if values and match.group(7) in values:
matched_value = match.group(7)
if values and match.group(8) in values:
matched_value = match.group(8)
if not matched_value and allow_no_value:
# replace existing option with no value line(s)
newline = u'%s\n' % option
@ -505,7 +505,7 @@ def do_ini(module, filename, section=None, section_has_values=None, option=None,
section_lines = new_section_lines
elif not exclusive and len(values) > 0:
# delete specified option=value line(s)
new_section_lines = [i for i in section_lines if not (match_active_opt(option, i) and match_active_opt(option, i).group(7) in values)]
new_section_lines = [i for i in section_lines if not (match_active_opt(option, i) and match_active_opt(option, i).group(8) in values)]
if section_lines != new_section_lines:
changed = True
msg = 'option changed'

View file

@ -120,4 +120,46 @@
that:
- result3 is changed
- result3.msg == 'option changed'
- content3 == expected3
- content3 == expected3
- name: test-modify_inactive_option 4 - create test file with spaces before commented option
copy:
content: |
[section1]
# Uncomment the line below to enable foo
# foo = bar
dest: "{{ output_file }}"
- name: test-modify_inactive_option 4 - set value for foo with modify_inactive_option set to true
ini_file:
path: "{{ output_file }}"
section: section1
option: foo
value: bar
modify_inactive_option: true
register: result4
- name: test-modify_inactive_option 4 - read content from output file
slurp:
src: "{{ output_file }}"
register: output_content
- name: test-modify_inactive_option 4 - set expected content and get current ini file content
set_fact:
expected4: |
[section1]
# Uncomment the line below to enable foo
foo = bar
content4: "{{ output_content.content | b64decode }}"
- name: test-modify_inactive_option 4 - assert 'changed' is true and content is OK and option changed
assert:
that:
- result4 is changed
- result4.msg == 'option changed'
- content4 == expected4