#!/usr/bin/env python3

# bitbake-dumpsig
# BitBake task signature dump utility
#
# Copyright (C) 2013 Intel Corporation
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

import os
import sys
import warnings
import optparse
import logging
import pickle

sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(sys.argv[0])), 'lib'))

import bb.tinfoil
import bb.siggen
import bb.msg

logger = bb.msg.logger_create('bitbake-dumpsig')

def find_siginfo_task(bbhandler, pn, taskname):
    """ Find the most recent signature file for the specified PN/task """

    if not hasattr(bb.siggen, 'find_siginfo'):
        logger.error('Metadata does not support finding signature data files')
        sys.exit(1)

    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])[-1:]
    if not latestfiles:
        logger.error('No sigdata files found matching %s %s' % (pn, taskname))
        sys.exit(1)

    return latestfiles[0]

parser = optparse.OptionParser(
    description = "Dumps siginfo/sigdata files written out by BitBake",
    usage = """
  %prog -t recipename taskname
  %prog sigdatafile""")

parser.add_option("-D", "--debug",
        help = "enable debug",
        action = "store_true", dest="debug", default = False)

parser.add_option("-t", "--task",
        help = "find the signature data file for the specified task",
        action="store", dest="taskargs", nargs=2, metavar='recipename taskname')

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

if options.debug:
    logger.setLevel(logging.DEBUG)

if options.taskargs:
    tinfoil = bb.tinfoil.Tinfoil()
    tinfoil.prepare(config_only = True)
    file = find_siginfo_task(tinfoil, options.taskargs[0], options.taskargs[1])
    logger.debug("Signature file: %s" % file)
elif len(args) == 1:
    parser.print_help()
    sys.exit(0)
else:
    file = args[1]

try:
    output = bb.siggen.dump_sigfile(file)
except IOError as e:
    logger.error(str(e))
    sys.exit(1)
except (pickle.UnpicklingError, EOFError):
    logger.error('Invalid signature data - ensure you are specifying a sigdata/siginfo file')
    sys.exit(1)

if output:
    print('\n'.join(output))
