Fix diff output to use lists instead of joined strings

- Return diff as lists of lines instead of joined strings
- Ansible's diff display properly handles list format
- Eliminates escaped newline characters in output
- Before/after shown as separate lists for proper diff formatting
- Each record appears on its own line in the diff output
This commit is contained in:
Daniel Akulenok
2026-01-29 22:18:28 +01:00
parent cd00703a1f
commit cd40a4ede8

View File

@@ -873,25 +873,26 @@ class DNSZoneManager:
def _format_diff(self, changes: dict) -> dict: def _format_diff(self, changes: dict) -> dict:
"""Format changes as a diff structure for diff mode using zone file format.""" """Format changes as a diff structure for diff mode using zone file format."""
diff_lines = [] before_lines = []
after_lines = []
# Process deletes - records being removed # Process deletes - records being removed (appear in before)
for record in sorted(changes['deletes'], key=lambda r: (r['name'].to_text(), r['type'])): for record in sorted(changes['deletes'], key=lambda r: (r['name'].to_text(), r['type'])):
record_name = record['name'].to_text().rstrip('.') record_name = record['name'].to_text().rstrip('.')
record_type = record['type'] record_type = record['type']
ttl = record.get('ttl', self.soa_minimum_ttl) ttl = record.get('ttl', self.soa_minimum_ttl)
values = sorted(str(v) for v in record['values']) values = sorted(str(v) for v in record['values'])
for value in values: for value in values:
diff_lines.append(f"-{record_name:<35} {ttl:<10} {record_type:<10} {value}") before_lines.append(f"{record_name:<35} {ttl:<10} {record_type:<10} {value}")
# Process adds - records being added # Process adds - records being added (appear in after)
for record in sorted(changes['adds'], key=lambda r: (r['name'].to_text(), r['type'])): for record in sorted(changes['adds'], key=lambda r: (r['name'].to_text(), r['type'])):
record_name = record['name'].to_text().rstrip('.') record_name = record['name'].to_text().rstrip('.')
record_type = record['type'] record_type = record['type']
ttl = record.get('ttl', self.soa_minimum_ttl) ttl = record.get('ttl', self.soa_minimum_ttl)
values = sorted(str(v) for v in record['values']) values = sorted(str(v) for v in record['values'])
for value in values: for value in values:
diff_lines.append(f"+{record_name:<35} {ttl:<10} {record_type:<10} {value}") after_lines.append(f"{record_name:<35} {ttl:<10} {record_type:<10} {value}")
# Process updates - records being changed # Process updates - records being changed
for record in sorted(changes['updates'], key=lambda r: (r['name'].to_text(), r['type'])): for record in sorted(changes['updates'], key=lambda r: (r['name'].to_text(), r['type'])):
@@ -902,18 +903,17 @@ class DNSZoneManager:
old_values = sorted(str(v) for v in record['old_values']) old_values = sorted(str(v) for v in record['old_values'])
new_values = sorted(str(v) for v in record['new_values']) new_values = sorted(str(v) for v in record['new_values'])
# Show old values with - # Show old values in before
for value in old_values: for value in old_values:
diff_lines.append(f"-{record_name:<35} {old_ttl:<10} {record_type:<10} {value}") before_lines.append(f"{record_name:<35} {old_ttl:<10} {record_type:<10} {value}")
# Show new values with + # Show new values in after
for value in new_values: for value in new_values:
diff_lines.append(f"+{record_name:<35} {new_ttl:<10} {record_type:<10} {value}") after_lines.append(f"{record_name:<35} {new_ttl:<10} {record_type:<10} {value}")
# Return diff with content - using actual line breaks, not escaped strings # Return diff with before/after as lists - Ansible will display these properly
diff_output = '\n'.join(diff_lines) if diff_lines else 'No changes'
return { return {
'before': diff_output, 'before': before_lines if before_lines else ['No changes'],
'after': diff_output 'after': after_lines if after_lines else ['No changes']
} }