#!/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)

    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):
        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)
    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()
