[bitbake-devel] [PATCH 1/2] bitbake-diffsigs: Merge with bitbake-dumpsig

Peter Kjellerstedt peter.kjellerstedt at axis.com
Fri Dec 28 17:37:23 UTC 2018


Assuming these are accepted into master, I would also like for them to 
be cherry-picked to Thud, to make bitbake-dumpsig work again.

//Peter

> -----Original Message-----
> From: bitbake-devel-bounces at lists.openembedded.org <bitbake-devel-
> bounces at lists.openembedded.org> On Behalf Of Peter Kjellerstedt
> Sent: den 28 december 2018 18:31
> To: bitbake-devel at lists.openembedded.org
> Cc: Paul Eggleton <paul.eggleton at linux.intel.com>
> Subject: [bitbake-devel] [PATCH 1/2] bitbake-diffsigs: Merge with
> bitbake-dumpsig
> 
> The functionalities of bitbake-diffsigs and bitbake-dumpsig are so
> similar that they can be merged into one. Add an option --dump to make
> bitbake-diffsigs dump the last signature data instead of comparing it.
> Keep bitbake-dumpsig as a symbolic link to bitbake-diffsigs. When it is
> called as bitbake-dumpsig, it behaves as if --dump was specified.
> 
> Also make -D the short option for --debug again (the way it used to be,
> and still was for bitbake-dumpsig), so that -d can be used as the short
> option for --dump.
> 
> Signed-off-by: Peter Kjellerstedt <peter.kjellerstedt at axis.com>
> ---
>  bitbake/bin/bitbake-diffsigs | 139 +++++++++++++++++++++++++----------
> --------
>  bitbake/bin/bitbake-dumpsig  |  95 +----------------------------
>  2 files changed, 82 insertions(+), 152 deletions(-)
>  mode change 100755 => 120000 bitbake/bin/bitbake-dumpsig
> 
> diff --git a/bitbake/bin/bitbake-diffsigs b/bitbake/bin/bitbake-
> diffsigs
> index 4e6bbddcd8..b0869e1143 100755
> --- a/bitbake/bin/bitbake-diffsigs
> +++ b/bitbake/bin/bitbake-diffsigs
> @@ -1,7 +1,7 @@
>  #!/usr/bin/env python3
> 
> -# bitbake-diffsigs
> -# BitBake task signature data comparison utility
> +# bitbake-diffsigs / bitbake-dumpsig
> +# BitBake task signature data dump and comparison utility
>  #
>  # Copyright (C) 2012-2013, 2017 Intel Corporation
>  #
> @@ -21,7 +21,6 @@
>  import os
>  import sys
>  import warnings
> -import fnmatch
>  import argparse
>  import logging
>  import pickle
> @@ -32,7 +31,10 @@ import bb.tinfoil
>  import bb.siggen
>  import bb.msg
> 
> -logger = bb.msg.logger_create('bitbake-diffsigs')
> +myname = os.path.basename(sys.argv[0])
> +logger = bb.msg.logger_create(myname)
> +
> +is_dump = myname == 'bitbake-dumpsig'
> 
>  def find_siginfo(tinfoil, pn, taskname, sigs=None):
>      result = None
> @@ -59,8 +61,8 @@ def find_siginfo(tinfoil, pn, taskname, sigs=None):
>          sys.exit(2)
>      return result
> 
> -def find_compare_task(bbhandler, pn, taskname, sig1=None, sig2=None,
> color=False):
> -    """ Find the most recent signature files for the specified PN/task
> and compare them """
> +def find_siginfo_task(bbhandler, pn, taskname, sig1=None, sig2=None):
> +    """ Find the most recent signature files for the specified PN/task
> """
> 
>      if not taskname.startswith('do_'):
>          taskname = 'do_%s' % taskname
> @@ -79,73 +81,81 @@ def find_compare_task(bbhandler, pn, taskname,
> sig1=None, sig2=None, color=False
>          latestfiles = [sigfiles[sig1], sigfiles[sig2]]
>      else:
>          filedates = find_siginfo(bbhandler, pn, taskname)
> -        latestfiles = sorted(filedates.keys(), key=lambda f:
> filedates[f])[-3:]
> +        latestfiles = sorted(filedates.keys(), key=lambda f:
> filedates[f])[-2:]
>          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 = find_siginfo(bbhandler, key, None, hashes)
> -
> -        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, color=color)
> -            for change in out2:
> -                for line in change.splitlines():
> -                    recout.append('  ' + line)
> +    return latestfiles
> 
> -        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, color=color)
> -    if output:
> -        print('\n'.join(output))
> -    sys.exit(0)
> +# Define recursion callback
> +def recursecb(key, hash1, hash2):
> +    hashes = [hash1, hash2]
> +    hashfiles = find_siginfo(tinfoil, key, None, hashes)
> +
> +    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, color=color)
> +        for change in out2:
> +            for line in change.splitlines():
> +                recout.append('  ' + line)
> 
> +    return recout
> 
> 
>  parser = argparse.ArgumentParser(
> -    description="Compares siginfo/sigdata files written out by
> BitBake")
> +    description=("Dumps" if is_dump else "Compares") + "
> siginfo/sigdata files written out by BitBake")
> 
> -parser.add_argument('-d', '--debug',
> +parser.add_argument('-D', '--debug',
>                      help='Enable debug output',
>                      action='store_true')
> 
> -parser.add_argument('--color',
> -        help='Colorize output (where %(metavar)s is %(choices)s)',
> -        choices=['auto', 'always', 'never'], default='auto',
> metavar='color')
> +if is_dump:
> +    parser.add_argument("-t", "--task",
> +            help="find the signature data file for the last run of the
> specified task",
> +            action="store", dest="taskargs", nargs=2,
> metavar=('recipename', 'taskname'))
> 
> -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("sigdatafile1",
> +            help="Signature file to dump. Not used when using -t/--
> task.",
> +            action="store", nargs='?', metavar="sigdatafile")
> +else:
> +    parser.add_argument('-c', '--color',
> +            help='Colorize the output (where %(metavar)s is
> %(choices)s)',
> +            choices=['auto', 'always', 'never'], default='auto',
> metavar='color')
> +
> +    parser.add_argument('-d', '--dump',
> +            help='Dump the last signature data instead of comparing
> (equivalent to using bitbake-dumpsig)',
> +            action='store_true')
> 
> -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("-t", "--task",
> +            help="find the signature data files for the last two runs
> of the specified task and compare them",
> +            action="store", dest="taskargs", nargs=2,
> metavar=('recipename', 'taskname'))
> 
> -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='?')
> +    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("sigdatafile2",
> -        help="Second signature file to compare",
> -        action="store", nargs='?')
> +    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='?')
> 
> +    parser.add_argument("sigdatafile2",
> +            help="Second signature file to compare",
> +            action="store", nargs='?')
> 
>  options = parser.parse_args()
> +if is_dump:
> +    options.color = 'never'
> +    options.dump = True
> +    options.sigdatafile2 = None
> +    options.sigargs = None
> 
>  if options.debug:
>      logger.setLevel(logging.DEBUG)
> @@ -155,16 +165,29 @@ color = (options.color == 'always' or
> (options.color == 'auto' and sys.stdout.is
>  if options.taskargs:
>      with bb.tinfoil.Tinfoil() as tinfoil:
>          tinfoil.prepare(config_only=True)
> -        if options.sigargs:
> -            find_compare_task(tinfoil, options.taskargs[0],
> options.taskargs[1], options.sigargs[0], options.sigargs[1],
> color=color)
> +        if not options.dump and options.sigargs:
> +            files = find_siginfo_task(tinfoil, options.taskargs[0],
> options.taskargs[1], options.sigargs[0], options.sigargs[1])
> +        else:
> +            files = find_siginfo_task(tinfoil, options.taskargs[0],
> options.taskargs[1])
> +
> +        if options.dump:
> +            logger.debug("Signature file: %s" % files[-1])
> +            output = bb.siggen.dump_sigfile(files[-1])
>          else:
> -            find_compare_task(tinfoil, options.taskargs[0],
> options.taskargs[1], color=color)
> +            if len(files) < 2:
> +                logger.error('Only one matching sigdata file found for
> the specified task (%s %s)' % (options.taskargs[0],
> options.taskargs[1]))
> +                sys.exit(1)
> +
> +            # Recurse into signature comparison
> +            logger.debug("Signature file (previous): %s" % files[-2])
> +            logger.debug("Signature file (latest): %s" % files[-1])
> +            output = bb.siggen.compare_sigfiles(files[-2], files[-1],
> recursecb, color=color)
>  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:
> +        if not options.dump and options.sigdatafile1 and
> options.sigdatafile2:
>              output = bb.siggen.compare_sigfiles(options.sigdatafile1,
> options.sigdatafile2, color=color)
>          elif options.sigdatafile1:
>              output = bb.siggen.dump_sigfile(options.sigdatafile1)
> @@ -179,5 +202,5 @@ else:
>          logger.error('Invalid signature data - ensure you are
> specifying sigdata/siginfo files')
>          sys.exit(1)
> 
> -    if output:
> -        print('\n'.join(output))
> +if output:
> +    print('\n'.join(output))
> diff --git a/bitbake/bin/bitbake-dumpsig b/bitbake/bin/bitbake-dumpsig
> deleted file mode 100755
> index 95ebd93546..0000000000
> --- a/bitbake/bin/bitbake-dumpsig
> +++ /dev/null
> @@ -1,94 +0,0 @@
> -#!/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))
> diff --git a/bitbake/bin/bitbake-dumpsig b/bitbake/bin/bitbake-dumpsig
> new file mode 120000
> index 0000000000..b1e8489b45
> --- /dev/null
> +++ b/bitbake/bin/bitbake-dumpsig
> @@ -0,0 +1 @@
> +bitbake-diffsigs
> \ No newline at end of file
> --
> 2.12.0
> 
> --
> _______________________________________________
> bitbake-devel mailing list
> bitbake-devel at lists.openembedded.org
> http://lists.openembedded.org/mailman/listinfo/bitbake-devel


More information about the bitbake-devel mailing list