#!/usr/bin/env python3 
 | 
  
 | 
# Query which tasks will be restored from sstate 
 | 
# 
 | 
# Copyright 2016 Intel Corporation 
 | 
# Authored-by:  Paul Eggleton <paul.eggleton@intel.com> 
 | 
# 
 | 
# SPDX-License-Identifier: GPL-2.0-only 
 | 
# 
 | 
  
 | 
import sys 
 | 
import os 
 | 
import subprocess 
 | 
import tempfile 
 | 
import shutil 
 | 
import re 
 | 
  
 | 
scripts_path = os.path.dirname(os.path.realpath(__file__)) 
 | 
lib_path = scripts_path + '/lib' 
 | 
sys.path = sys.path + [lib_path] 
 | 
import scriptutils 
 | 
import scriptpath 
 | 
scriptpath.add_bitbake_lib_path() 
 | 
import argparse_oe 
 | 
  
 | 
  
 | 
def translate_virtualfns(tasks): 
 | 
    import bb.tinfoil 
 | 
    tinfoil = bb.tinfoil.Tinfoil() 
 | 
    try: 
 | 
        tinfoil.prepare(False) 
 | 
  
 | 
        recipecaches = tinfoil.cooker.recipecaches 
 | 
        outtasks = [] 
 | 
        for task in tasks: 
 | 
            (mc, fn, taskname) = bb.runqueue.split_tid(task) 
 | 
            if taskname.endswith('_setscene'): 
 | 
                taskname = taskname[:-9] 
 | 
            outtasks.append('%s:%s' % (recipecaches[mc].pkg_fn[fn], taskname)) 
 | 
    finally: 
 | 
        tinfoil.shutdown() 
 | 
    return outtasks 
 | 
  
 | 
  
 | 
def check(args): 
 | 
    tmpdir = tempfile.mkdtemp(prefix='oe-check-sstate-') 
 | 
    try: 
 | 
        env = os.environ.copy() 
 | 
        if not args.same_tmpdir: 
 | 
            env['BB_ENV_EXTRAWHITE'] = env.get('BB_ENV_EXTRAWHITE', '') + ' TMPDIR:forcevariable' 
 | 
            env['TMPDIR:forcevariable'] = tmpdir 
 | 
  
 | 
        try: 
 | 
            output = subprocess.check_output( 
 | 
                    'bitbake -n %s' % ' '.join(args.target), 
 | 
                    stderr=subprocess.STDOUT, 
 | 
                    env=env, 
 | 
                    shell=True) 
 | 
  
 | 
            task_re = re.compile('NOTE: Running setscene task [0-9]+ of [0-9]+ \(([^)]+)\)') 
 | 
            tasks = [] 
 | 
            for line in output.decode('utf-8').splitlines(): 
 | 
                res = task_re.match(line) 
 | 
                if res: 
 | 
                    tasks.append(res.group(1)) 
 | 
            outtasks = translate_virtualfns(tasks) 
 | 
        except subprocess.CalledProcessError as e: 
 | 
            print('ERROR: bitbake failed:\n%s' % e.output.decode('utf-8')) 
 | 
            return e.returncode 
 | 
    finally: 
 | 
        shutil.rmtree(tmpdir) 
 | 
  
 | 
    if args.log: 
 | 
        with open(args.log, 'wb') as f: 
 | 
            f.write(output) 
 | 
  
 | 
    if args.outfile: 
 | 
        with open(args.outfile, 'w') as f: 
 | 
            for task in outtasks: 
 | 
                f.write('%s\n' % task) 
 | 
    else: 
 | 
        for task in outtasks: 
 | 
            print(task) 
 | 
  
 | 
    return 0 
 | 
  
 | 
  
 | 
def main(): 
 | 
    parser = argparse_oe.ArgumentParser(description='OpenEmbedded sstate check tool. Does a dry-run to check restoring the specified targets from shared state, and lists the tasks that would be restored. Set BB_SETSCENE_ENFORCE=1 in the environment if you wish to ensure real tasks are disallowed.') 
 | 
  
 | 
    parser.add_argument('target', nargs='+', help='Target to check') 
 | 
    parser.add_argument('-o', '--outfile', help='Write list to a file instead of stdout') 
 | 
    parser.add_argument('-l', '--log', help='Write full log to a file') 
 | 
    parser.add_argument('-s', '--same-tmpdir', action='store_true', help='Use same TMPDIR for check (list will then be dependent on what tasks have executed previously)') 
 | 
  
 | 
    parser.set_defaults(func=check) 
 | 
  
 | 
    args = parser.parse_args() 
 | 
  
 | 
    ret = args.func(args) 
 | 
    return ret 
 | 
  
 | 
  
 | 
if __name__ == "__main__": 
 | 
    try: 
 | 
        ret = main() 
 | 
    except Exception: 
 | 
        ret = 1 
 | 
        import traceback 
 | 
        traceback.print_exc() 
 | 
    sys.exit(ret) 
 |