summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--meta/lib/oe/buildhistory_analysis.py49
-rw-r--r--meta/lib/oe/sstatesig.py6
-rwxr-xr-xscripts/buildhistory-diff5
3 files changed, 54 insertions, 6 deletions
diff --git a/meta/lib/oe/buildhistory_analysis.py b/meta/lib/oe/buildhistory_analysis.py
index 19b3bc437c..449446f33b 100644
--- a/meta/lib/oe/buildhistory_analysis.py
+++ b/meta/lib/oe/buildhistory_analysis.py
@@ -1,6 +1,6 @@
1# Report significant differences in the buildhistory repository since a specific revision 1# Report significant differences in the buildhistory repository since a specific revision
2# 2#
3# Copyright (C) 2012 Intel Corporation 3# Copyright (C) 2012-2013, 2016-2017 Intel Corporation
4# Author: Paul Eggleton <paul.eggleton@linux.intel.com> 4# Author: Paul Eggleton <paul.eggleton@linux.intel.com>
5# 5#
6# Note: requires GitPython 0.3.1+ 6# Note: requires GitPython 0.3.1+
@@ -410,13 +410,58 @@ def compare_dict_blobs(path, ablob, bblob, report_all, report_ver):
410 return changes 410 return changes
411 411
412 412
413def process_changes(repopath, revision1, revision2='HEAD', report_all=False, report_ver=False): 413def compare_siglists(a_blob, b_blob):
414 # FIXME collapse down a recipe's tasks?
415 alines = a_blob.data_stream.read().decode('utf-8').splitlines()
416 blines = b_blob.data_stream.read().decode('utf-8').splitlines()
417 keys = []
418 pnmap = {}
419 def readsigs(lines):
420 sigs = {}
421 for line in lines:
422 linesplit = line.split()
423 if len(linesplit) > 2:
424 sigs[linesplit[0]] = linesplit[2]
425 if not linesplit[0] in keys:
426 keys.append(linesplit[0])
427 pnmap[linesplit[1]] = linesplit[0].rsplit('.', 1)[0]
428 return sigs
429 adict = readsigs(alines)
430 bdict = readsigs(blines)
431 out = []
432 changecount = 0
433 addcount = 0
434 removecount = 0
435 for key in keys:
436 siga = adict.get(key, None)
437 sigb = bdict.get(key, None)
438 if siga is not None and sigb is not None and siga != sigb:
439 out.append('%s changed from %s to %s' % (key, siga, sigb))
440 changecount += 1
441 elif siga is None:
442 out.append('%s was added' % key)
443 addcount += 1
444 elif sigb is None:
445 removecount += 1
446 out.append('%s was removed' % key)
447 out.append('Summary: %d tasks added, %d tasks removed, %d tasks modified (%.1f%%)' % (addcount, removecount, changecount, (changecount / float(len(bdict)) * 100)))
448 return '\n'.join(out)
449
450
451def process_changes(repopath, revision1, revision2='HEAD', report_all=False, report_ver=False, sigs=False):
414 repo = git.Repo(repopath) 452 repo = git.Repo(repopath)
415 assert repo.bare == False 453 assert repo.bare == False
416 commit = repo.commit(revision1) 454 commit = repo.commit(revision1)
417 diff = commit.diff(revision2) 455 diff = commit.diff(revision2)
418 456
419 changes = [] 457 changes = []
458
459 if sigs:
460 for d in diff.iter_change_type('M'):
461 if d.a_blob.path == 'siglist.txt':
462 changes.append(compare_siglists(d.a_blob, d.b_blob))
463 return changes
464
420 for d in diff.iter_change_type('M'): 465 for d in diff.iter_change_type('M'):
421 path = os.path.dirname(d.a_blob.path) 466 path = os.path.dirname(d.a_blob.path)
422 if path.startswith('packages/'): 467 if path.startswith('packages/'):
diff --git a/meta/lib/oe/sstatesig.py b/meta/lib/oe/sstatesig.py
index 3239bc63ae..f087a019e1 100644
--- a/meta/lib/oe/sstatesig.py
+++ b/meta/lib/oe/sstatesig.py
@@ -217,9 +217,9 @@ class SignatureGeneratorOEBasicHash(bb.siggen.SignatureGeneratorBasicHash):
217 for taskitem in self.taskhash: 217 for taskitem in self.taskhash:
218 (fn, task) = taskitem.rsplit(".", 1) 218 (fn, task) = taskitem.rsplit(".", 1)
219 pn = self.lockedpnmap[fn] 219 pn = self.lockedpnmap[fn]
220 tasks.append((pn, task, self.taskhash[taskitem])) 220 tasks.append((pn, task, fn, self.taskhash[taskitem]))
221 for (pn, task, taskhash) in sorted(tasks): 221 for (pn, task, fn, taskhash) in sorted(tasks):
222 f.write('%s.%s %s\n' % (pn, task, taskhash)) 222 f.write('%s.%s %s %s\n' % (pn, task, fn, taskhash))
223 223
224 def checkhashes(self, missed, ret, sq_fn, sq_task, sq_hash, sq_hashfn, d): 224 def checkhashes(self, missed, ret, sq_fn, sq_task, sq_hash, sq_hashfn, d):
225 warn_msgs = [] 225 warn_msgs = []
diff --git a/scripts/buildhistory-diff b/scripts/buildhistory-diff
index e03ccc5ed8..e8e3e11649 100755
--- a/scripts/buildhistory-diff
+++ b/scripts/buildhistory-diff
@@ -33,6 +33,9 @@ def main():
33 parser.add_option("-a", "--report-all", 33 parser.add_option("-a", "--report-all",
34 help = "Report all changes, not just the default significant ones", 34 help = "Report all changes, not just the default significant ones",
35 action="store_true", dest="report_all", default=False) 35 action="store_true", dest="report_all", default=False)
36 parser.add_option("-s", "--signatures",
37 help = "Report on signature differences instead of output",
38 action="store_true", dest="sigs", default=False)
36 39
37 options, args = parser.parse_args(sys.argv) 40 options, args = parser.parse_args(sys.argv)
38 41
@@ -86,7 +89,7 @@ def main():
86 89
87 import gitdb 90 import gitdb
88 try: 91 try:
89 changes = oe.buildhistory_analysis.process_changes(options.buildhistory_dir, fromrev, torev, options.report_all, options.report_ver) 92 changes = oe.buildhistory_analysis.process_changes(options.buildhistory_dir, fromrev, torev, options.report_all, options.report_ver, options.sigs)
90 except gitdb.exc.BadObject as e: 93 except gitdb.exc.BadObject as e:
91 if len(args) == 1: 94 if len(args) == 1:
92 sys.stderr.write("Unable to find previous build revision in buildhistory repository\n\n") 95 sys.stderr.write("Unable to find previous build revision in buildhistory repository\n\n")