Improve diff output with human-readable formatting

- Show each record with clear before/after versions
- Display TTL changes when values are updated (old_ttl -> new_ttl)
- Organize output into DELETED, ADDED, and UPDATED sections
- Use visual indicators (-, +, ~) for record operations
- Format with proper indentation and alignment for readability
- Show full record details including all values and TTLs
This commit is contained in:
Daniel Akulenok
2026-01-29 22:07:49 +01:00
parent 152de31edc
commit 5a8e7a3384

View File

@@ -865,29 +865,69 @@ class DNSZoneManager:
return result
def _format_diff(self, changes: dict) -> dict:
"""Format changes as a diff structure for diff mode."""
diff_before = {}
diff_after = {}
"""Format changes as a diff structure for diff mode with human-readable output."""
diff_content = []
# Process adds
for record in changes['adds']:
record_key = f"{record['name'].to_text()} {record['type']}"
diff_after[record_key] = sorted(str(v) for v in record['values'])
# Process deletes - records being removed
if changes['deletes']:
diff_content.append("DELETED RECORDS:")
for record in sorted(changes['deletes'], key=lambda r: (r['name'].to_text(), r['type'])):
record_name = record['name'].to_text()
record_type = record['type']
ttl = record.get('ttl', 'default')
values = sorted(str(v) for v in record['values'])
diff_content.append(f" - {record_name:<50} {record_type:<10} TTL={ttl}")
for value in values:
diff_content.append(f" {value}")
diff_content.append("")
# Process deletes
for record in changes['deletes']:
record_key = f"{record['name'].to_text()} {record['type']}"
diff_before[record_key] = sorted(str(v) for v in record['values'])
# Process adds - records being added
if changes['adds']:
diff_content.append("ADDED RECORDS:")
for record in sorted(changes['adds'], key=lambda r: (r['name'].to_text(), r['type'])):
record_name = record['name'].to_text()
record_type = record['type']
ttl = record.get('ttl', 'default')
values = sorted(str(v) for v in record['values'])
diff_content.append(f" + {record_name:<50} {record_type:<10} TTL={ttl}")
for value in values:
diff_content.append(f" {value}")
diff_content.append("")
# Process updates - show both before and after
for record in changes['updates']:
record_key = f"{record['name'].to_text()} {record['type']}"
diff_before[record_key] = sorted(str(v) for v in record['old_values'])
diff_after[record_key] = sorted(str(v) for v in record['new_values'])
# Process updates - records being changed
if changes['updates']:
diff_content.append("UPDATED RECORDS:")
for record in sorted(changes['updates'], key=lambda r: (r['name'].to_text(), r['type'])):
record_name = record['name'].to_text()
record_type = record['type']
old_ttl = record.get('old_ttl', 'default')
new_ttl = record.get('new_ttl', 'default')
old_values = sorted(str(v) for v in record['old_values'])
new_values = sorted(str(v) for v in record['new_values'])
diff_content.append(f" ~ {record_name:<50} {record_type:<10}")
# Show TTL change if it changed
if old_ttl != new_ttl:
diff_content.append(f" TTL: {old_ttl} -> {new_ttl}")
else:
diff_content.append(f" TTL: {old_ttl}")
# Show old values
diff_content.append(f" Before:")
for value in old_values:
diff_content.append(f" - {value}")
# Show new values
diff_content.append(f" After:")
for value in new_values:
diff_content.append(f" + {value}")
diff_content.append("")
# Format as before/after with the content as text
return {
'before': diff_before,
'after': diff_after
'before': 'DNS Zone Records (Before)',
'after': '\n'.join(diff_content) if diff_content else 'No changes'
}