diff --git a/bitbake/bin/bitbake-diffsigs b/bitbake/bin/bitbake-diffsigs index 08ae00db0f..196f0b73e8 100755 --- a/bitbake/bin/bitbake-diffsigs +++ b/bitbake/bin/bitbake-diffsigs @@ -46,6 +46,12 @@ logger = logger_create('bitbake-diffsigs') def find_compare_task(bbhandler, pn, taskname): """ Find the most recent signature files for the specified PN/task and compare them """ + def get_hashval(siginfo): + if siginfo.endswith('.siginfo'): + return siginfo.rpartition(':')[2].partition('_')[0] + else: + return siginfo.rpartition('.')[2] + if not hasattr(bb.siggen, 'find_siginfo'): logger.error('Metadata does not support finding signature data files') sys.exit(1) @@ -54,7 +60,7 @@ def find_compare_task(bbhandler, pn, taskname): taskname = 'do_%s' % taskname filedates = bb.siggen.find_siginfo(pn, taskname, None, bbhandler.config_data) - latestfiles = sorted(filedates.keys(), key=lambda f: filedates[f])[-2:] + 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) @@ -62,6 +68,16 @@ def find_compare_task(bbhandler, pn, taskname): logger.error('Only one matching sigdata file found for the specified task (%s %s)' % (pn, taskname)) sys.exit(1) else: + # It's possible that latestfiles contain 3 elements and the first two have the same hash value. + # In this case, we delete the second element. + # The above case is actually the most common one. Because we may have sigdata file and siginfo + # file having the same hash value. Comparing such two files makes no sense. + if len(latestfiles) == 3: + hash0 = get_hashval(latestfiles[0]) + hash1 = get_hashval(latestfiles[1]) + if hash0 == hash1: + latestfiles.pop(1) + # Define recursion callback def recursecb(key, hash1, hash2): hashes = [hash1, hash2]