poky/scripts/buildhistory-diff
Paul Eggleton 1f19d9dfe5 buildhistory-diff: add option to compare actual signature differences
Use the code underpinning bitbake-diffsigs to add an option to
buildhistory-diff to determine and display the differences between the
actual signature inputs, with a twist - we collapse identical
changes across different tasks, showing only the most recent task to
have that difference, meaning that there's less noise to wade through
when you just want to know what changed in order to cause some
rebuilding you're seeing.

(From OE-Core rev: 86cb4b01f2020553902554e512c02147eb4e0f51)

Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
2017-04-11 18:10:17 +01:00

4.3 KiB
Executable File

#!/usr/bin/env python3

Report significant differences in the buildhistory repository since a specific revision

Copyright (C) 2013 Intel Corporation

Author: Paul Eggleton paul.eggleton@linux.intel.com

import sys import os import optparse from distutils.version import LooseVersion

Ensure PythonGit is installed (buildhistory_analysis needs it)

try: import git except ImportError: print("Please install GitPython (python3-git) 0.3.4 or later in order to use this script") sys.exit(1)

def main(): parser = optparse.OptionParser( description = "Reports significant differences in the buildhistory repository.", usage = """ %prog [options] [from-revision [to-revision]] (if not specified, from-revision defaults to build-minus-1, and to-revision defaults to HEAD)""")

parser.add_option("-p", "--buildhistory-dir",
        help = "Specify path to buildhistory directory (defaults to buildhistory/ under cwd)",
        action="store", dest="buildhistory_dir", default='buildhistory/')
parser.add_option("-v", "--report-version",
        help = "Report changes in PKGE/PKGV/PKGR even when the values are still the default (PE/PV/PR)",
        action="store_true", dest="report_ver", default=False)
parser.add_option("-a", "--report-all",
        help = "Report all changes, not just the default significant ones",
        action="store_true", dest="report_all", default=False)
parser.add_option("-s", "--signatures",
        help = "Report list of signatures differing instead of output",
        action="store_true", dest="sigs", default=False)
parser.add_option("-S", "--signatures-with-diff",
        help = "Report on actual signature differences instead of output (requires signature data to have been generated, either by running the actual tasks or using bitbake -S)",
        action="store_true", dest="sigsdiff", default=False)

options, args = parser.parse_args(sys.argv)

if len(args) > 3:
    sys.stderr.write('Invalid argument(s) specified: %s\n\n' % ' '.join(args[3:]))
    parser.print_help()
    sys.exit(1)

if LooseVersion(git.__version__) < '0.3.1':
    sys.stderr.write("Version of GitPython is too old, please install GitPython (python-git) 0.3.1 or later in order to use this script\n")
    sys.exit(1)

if not os.path.exists(options.buildhistory_dir):
    if options.buildhistory_dir == 'buildhistory/':
        cwd = os.getcwd()
        if os.path.basename(cwd) == 'buildhistory':
            options.buildhistory_dir = cwd
if not os.path.exists(options.buildhistory_dir):
    sys.stderr.write('Buildhistory directory "%s" does not exist\n\n' % options.buildhistory_dir)
    parser.print_help()
    sys.exit(1)

scripts_path = os.path.abspath(os.path.dirname(os.path.abspath(sys.argv[0])))
lib_path = scripts_path + '/lib'
sys.path = sys.path + [lib_path]

import scriptpath

# Set path to OE lib dir so we can import the buildhistory_analysis module
scriptpath.add_oe_lib_path()
# Set path to bitbake lib dir so the buildhistory_analysis module can load bb.utils
bitbakepath = scriptpath.add_bitbake_lib_path()
if not bitbakepath:
    sys.stderr.write("Unable to find bitbake by searching parent directory of this script or PATH\n")
    sys.exit(1)

import oe.buildhistory_analysis

fromrev = 'build-minus-1'
torev = 'HEAD'
if len(args) > 1:
    if len(args) == 2 and '..' in args[1]:
        revs = args[1].split('..')
        fromrev = revs[0]
        if revs[1]:
            torev = revs[1]
    else:
        fromrev = args[1]
if len(args) > 2:
    torev = args[2]

import gitdb
try:
    changes = oe.buildhistory_analysis.process_changes(options.buildhistory_dir, fromrev, torev, options.report_all, options.report_ver, options.sigs, options.sigsdiff)
except gitdb.exc.BadObject as e:
    if len(args) == 1:
        sys.stderr.write("Unable to find previous build revision in buildhistory repository\n\n")
        parser.print_help()
    else:
        sys.stderr.write('Specified git revision "%s" is not valid\n' % e.args[0])
    sys.exit(1)

for chg in changes:
    print('%s' % chg)

sys.exit(0)

if name == "main": main()