summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Brown <ben.brown@codethink.co.uk>2017-05-25 16:22:36 +0100
committerBen Brown <ben.brown@codethink.co.uk>2017-05-26 12:06:13 +0100
commitf431c693228aad296b6c46607223c4a48c3eaeb7 (patch)
tree673fa091dea089250573e43fce31516d8fd0f876
parentebb84714ea7ce2ffffa3a9e64f301f05be54b75a (diff)
downloadybd-f431c693228aad296b6c46607223c4a48c3eaeb7.tar.gz
Improve how differences are displayed
-rw-r--r--ybd/release_note.py32
1 files changed, 25 insertions, 7 deletions
diff --git a/ybd/release_note.py b/ybd/release_note.py
index 899bc01..6cb1e92 100644
--- a/ybd/release_note.py
+++ b/ybd/release_note.py
@@ -15,9 +15,13 @@
# =*= License: GPL-2 =*=
import os
+import re
from subprocess import check_output
import tempfile
import app
+import yaml
+import difflib
+import itertools
from app import chdir, config, log
from pots import Pots
from repos import (
@@ -55,6 +59,22 @@ def do_release_note(release_note):
release_note)
+def represent_str(dumper, data):
+ if data.count('\n') == 0:
+ return yaml.representer.SafeRepresenter.represent_str(dumper, data)
+ return dumper.represent_scalar(u'tag:yaml.org,2002:str', data, style='|')
+
+
+def sanitise_yaml(obj):
+ stripped = re.sub(r' +(?=\\n)', '', yaml.dump(obj), flags=re.MULTILINE)
+ yaml.add_representer(str, represent_str)
+ return yaml.safe_load(stripped)
+
+
+def expand_obj(obj):
+ return [x for x in yaml.dump(obj, default_flow_style=False).splitlines()]
+
+
def log_changes(dn, tmpdir, old_defs, ref):
do_git_log = False
old_def = old_defs.get(dn['path'], {})
@@ -68,13 +88,11 @@ def log_changes(dn, tmpdir, old_defs, ref):
if type(dn[key]) in (str, unicode, int):
f.write('%s | %s\n' % (old_value, dn[key]))
if type(dn[key]) not in (str, unicode, int, float):
- if old_value:
- for x in old_value:
- f.write(repr(x))
- f.write('\n vvv\n')
- if dn[key]:
- for x in dn[key]:
- f.write(repr(x))
+ before = expand_obj(sanitise_yaml(old_value or ""))
+ after = expand_obj(sanitise_yaml(dn[key]))
+ diff = itertools.islice(difflib.unified_diff(
+ before, after), 2, None)
+ f.write('\n'.join(diff))
f.write('\n\n')
if (dn.get('kind', 'chunk') == 'chunk' and dn.get('repo') and