1
0
mirror of https://git.yoctoproject.org/poky synced 2026-06-02 01:19:52 +00:00

bitbake: lib/bb/siggen: show word-diff for single-line values containing spaces

If a variable value has changed and either the new or old value contains
spaces, a word diff should be appropriate and may be a bit more readable.
Import the "simplediff" module and use it to show a word diff (in the
style of GNU wdiff and git diff --word-diff).

Also use a similar style diff to show changes in the runtaskhashes list.
I didn't use an actual word-diff here since it's a little different - we
can be sure that the list is a list and not simply a free-format string.

(Bitbake rev: 20db6b6553c80e18afc4f43dc2495435f7477822)

Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Paul Eggleton
2017-04-07 09:52:10 +12:00
committed by Richard Purdie
parent 5d8b89fc0b
commit 5f7bf1f66d
4 changed files with 259 additions and 1 deletions
+37 -1
View File
@@ -6,6 +6,7 @@ import tempfile
import pickle
import bb.data
import difflib
import simplediff
from bb.checksum import FileChecksumCache
logger = logging.getLogger('BitBake.SigGen')
@@ -352,6 +353,39 @@ def dump_this_task(outfile, d):
referencestamp = bb.build.stamp_internal(task, d, None, True)
bb.parse.siggen.dump_sigtask(fn, task, outfile, "customfile:" + referencestamp)
def worddiff_str(oldstr, newstr):
diff = simplediff.diff(oldstr.split(' '), newstr.split(' '))
ret = []
for change, value in diff:
value = ' '.join(value)
if change == '=':
ret.append(value)
elif change == '+':
item = '{+%s+}' % value
ret.append(item)
elif change == '-':
item = '[-%s-]' % value
ret.append(item)
whitespace_note = ''
if oldstr != newstr and ' '.join(oldstr.split()) == ' '.join(newstr.split()):
whitespace_note = ' (whitespace changed)'
return '"%s"%s' % (' '.join(ret), whitespace_note)
def list_inline_diff(oldlist, newlist):
diff = simplediff.diff(oldlist, newlist)
ret = []
for change, value in diff:
value = ' '.join(value)
if change == '=':
ret.append("'%s'" % value)
elif change == '+':
item = "+'%s'" % value
ret.append(item)
elif change == '-':
item = "-'%s'" % value
ret.append(item)
return '[%s]' % (', '.join(ret))
def clean_basepath(a):
mc = None
if a.startswith("multiconfig:"):
@@ -471,6 +505,8 @@ def compare_sigfiles(a, b, recursecb=None, collapsed=False):
# the old/new filename (they are blank anyway in this case)
difflines = list(diff)[2:]
output.append("Variable %s value changed:\n%s" % (dep, '\n'.join(difflines)))
elif newval and oldval and (' ' in oldval or ' ' in newval):
output.append("Variable %s value changed:\n%s" % (dep, worddiff_str(oldval, newval)))
else:
output.append("Variable %s value changed from '%s' to '%s'" % (dep, oldval, newval))
@@ -510,7 +546,7 @@ def compare_sigfiles(a, b, recursecb=None, collapsed=False):
clean_a = clean_basepaths_list(a_data['runtaskdeps'])
clean_b = clean_basepaths_list(b_data['runtaskdeps'])
if clean_a != clean_b:
output.append("runtaskdeps changed from %s to %s" % (clean_a, clean_b))
output.append("runtaskdeps changed:\n%s" % list_inline_diff(clean_a, clean_b))
else:
output.append("runtaskdeps changed:")
output.append("\n".join(changed))