|
@@ -34,7 +34,7 @@ import bb.msg
|
|
|
|
|
|
logger = bb.msg.logger_create('bitbake-diffsigs')
|
|
|
|
|
|
-def find_compare_task(bbhandler, pn, taskname):
|
|
|
+def find_compare_task(bbhandler, pn, taskname, sig1=None, sig2=None):
|
|
|
""" Find the most recent signature files for the specified PN/task and compare them """
|
|
|
|
|
|
if not hasattr(bb.siggen, 'find_siginfo'):
|
|
@@ -44,41 +44,54 @@ def find_compare_task(bbhandler, pn, taskname):
|
|
|
if not taskname.startswith('do_'):
|
|
|
taskname = 'do_%s' % taskname
|
|
|
|
|
|
- filedates = bb.siggen.find_siginfo(pn, taskname, None, bbhandler.config_data)
|
|
|
- latestfiles = sorted(filedates.keys(), key=lambda f: filedates[f])[-3:]
|
|
|
- if not latestfiles:
|
|
|
- logger.error('No sigdata files found matching %s %s' % (pn, taskname))
|
|
|
- sys.exit(1)
|
|
|
- elif len(latestfiles) < 2:
|
|
|
- logger.error('Only one matching sigdata file found for the specified task (%s %s)' % (pn, taskname))
|
|
|
- sys.exit(1)
|
|
|
+ if sig1 and sig2:
|
|
|
+ sigfiles = bb.siggen.find_siginfo(pn, taskname, [sig1, sig2], bbhandler.config_data)
|
|
|
+ if len(sigfiles) == 0:
|
|
|
+ logger.error('No sigdata files found matching %s %s matching either %s or %s' % (pn, taskname, sig1, sig2))
|
|
|
+ sys.exit(1)
|
|
|
+ elif not sig1 in sigfiles:
|
|
|
+ logger.error('No sigdata files found matching %s %s with signature %s' % (pn, taskname, sig1))
|
|
|
+ sys.exit(1)
|
|
|
+ elif not sig2 in sigfiles:
|
|
|
+ logger.error('No sigdata files found matching %s %s with signature %s' % (pn, taskname, sig2))
|
|
|
+ sys.exit(1)
|
|
|
+ latestfiles = [sigfiles[sig1], sigfiles[sig2]]
|
|
|
else:
|
|
|
- # Define recursion callback
|
|
|
- def recursecb(key, hash1, hash2):
|
|
|
- hashes = [hash1, hash2]
|
|
|
- hashfiles = bb.siggen.find_siginfo(key, None, hashes, bbhandler.config_data)
|
|
|
-
|
|
|
- recout = []
|
|
|
- if len(hashfiles) == 0:
|
|
|
- recout.append("Unable to find matching sigdata for %s with hashes %s or %s" % (key, hash1, hash2))
|
|
|
- elif not hash1 in hashfiles:
|
|
|
- recout.append("Unable to find matching sigdata for %s with hash %s" % (key, hash1))
|
|
|
- elif not hash2 in hashfiles:
|
|
|
- recout.append("Unable to find matching sigdata for %s with hash %s" % (key, hash2))
|
|
|
- else:
|
|
|
- out2 = bb.siggen.compare_sigfiles(hashfiles[hash1], hashfiles[hash2], recursecb)
|
|
|
- for change in out2:
|
|
|
- for line in change.splitlines():
|
|
|
- recout.append(' ' + line)
|
|
|
-
|
|
|
- return recout
|
|
|
-
|
|
|
- # Recurse into signature comparison
|
|
|
- logger.debug("Signature file (previous): %s" % latestfiles[-2])
|
|
|
- logger.debug("Signature file (latest): %s" % latestfiles[-1])
|
|
|
- output = bb.siggen.compare_sigfiles(latestfiles[-2], latestfiles[-1], recursecb)
|
|
|
- if output:
|
|
|
- print('\n'.join(output))
|
|
|
+ filedates = bb.siggen.find_siginfo(pn, taskname, None, bbhandler.config_data)
|
|
|
+ latestfiles = sorted(filedates.keys(), key=lambda f: filedates[f])[-3:]
|
|
|
+ if not latestfiles:
|
|
|
+ logger.error('No sigdata files found matching %s %s' % (pn, taskname))
|
|
|
+ sys.exit(1)
|
|
|
+ elif len(latestfiles) < 2:
|
|
|
+ logger.error('Only one matching sigdata file found for the specified task (%s %s)' % (pn, taskname))
|
|
|
+ sys.exit(1)
|
|
|
+
|
|
|
+ # Define recursion callback
|
|
|
+ def recursecb(key, hash1, hash2):
|
|
|
+ hashes = [hash1, hash2]
|
|
|
+ hashfiles = bb.siggen.find_siginfo(key, None, hashes, bbhandler.config_data)
|
|
|
+
|
|
|
+ recout = []
|
|
|
+ if len(hashfiles) == 0:
|
|
|
+ recout.append("Unable to find matching sigdata for %s with hashes %s or %s" % (key, hash1, hash2))
|
|
|
+ elif not hash1 in hashfiles:
|
|
|
+ recout.append("Unable to find matching sigdata for %s with hash %s" % (key, hash1))
|
|
|
+ elif not hash2 in hashfiles:
|
|
|
+ recout.append("Unable to find matching sigdata for %s with hash %s" % (key, hash2))
|
|
|
+ else:
|
|
|
+ out2 = bb.siggen.compare_sigfiles(hashfiles[hash1], hashfiles[hash2], recursecb)
|
|
|
+ for change in out2:
|
|
|
+ for line in change.splitlines():
|
|
|
+ recout.append(' ' + line)
|
|
|
+
|
|
|
+ return recout
|
|
|
+
|
|
|
+ # Recurse into signature comparison
|
|
|
+ logger.debug("Signature file (previous): %s" % latestfiles[-2])
|
|
|
+ logger.debug("Signature file (latest): %s" % latestfiles[-1])
|
|
|
+ output = bb.siggen.compare_sigfiles(latestfiles[-2], latestfiles[-1], recursecb)
|
|
|
+ if output:
|
|
|
+ print('\n'.join(output))
|
|
|
sys.exit(0)
|
|
|
|
|
|
|
|
@@ -94,6 +107,10 @@ parser.add_argument("-t", "--task",
|
|
|
help="find the signature data files for last two runs of the specified task and compare them",
|
|
|
action="store", dest="taskargs", nargs=2, metavar=('recipename', 'taskname'))
|
|
|
|
|
|
+parser.add_argument("-s", "--signature",
|
|
|
+ help="With -t/--task, specify the signatures to look for instead of taking the last two",
|
|
|
+ action="store", dest="sigargs", nargs=2, metavar=('fromsig', 'tosig'))
|
|
|
+
|
|
|
parser.add_argument("sigdatafile1",
|
|
|
help="First signature file to compare (or signature file to dump, if second not specified). Not used when using -t/--task.",
|
|
|
action="store", nargs='?')
|
|
@@ -111,8 +128,14 @@ if options.debug:
|
|
|
if options.taskargs:
|
|
|
with bb.tinfoil.Tinfoil() as tinfoil:
|
|
|
tinfoil.prepare(config_only=True)
|
|
|
- find_compare_task(tinfoil, options.taskargs[0], options.taskargs[1])
|
|
|
+ if options.sigargs:
|
|
|
+ find_compare_task(tinfoil, options.taskargs[0], options.taskargs[1], options.sigargs[0], options.sigargs[1])
|
|
|
+ else:
|
|
|
+ find_compare_task(tinfoil, options.taskargs[0], options.taskargs[1])
|
|
|
else:
|
|
|
+ if options.sigargs:
|
|
|
+ logger.error('-s/--signature can only be used together with -t/--task')
|
|
|
+ sys.exit(1)
|
|
|
try:
|
|
|
if options.sigdatafile1 and options.sigdatafile2:
|
|
|
output = bb.siggen.compare_sigfiles(options.sigdatafile1, options.sigdatafile2)
|