#!/bin/bash

# Test Script for task re-execution
# 
# Copyright 2012 Intel Corporation
#
# SPDX-License-Identifier: GPL-2.0-or-later
#
# DESCRIPTION
# This script is intended to address issues for re-execution of 
# tasks. The test results are saved in ./reexeclogs. Force build
# logs are saved with prefix "force". Build failure logs are saved with
# prefix "failed". Log files with prefix "initial" are used to save
# initial build logs for each recipe. Log files with prefix "clean" are
# used to save logs of clean task after testing for a recipe is finished.
#

targets=`bitbake -s | cut -d " " -f 1`

LOGS=./reexeclogs

mkdir -p $LOGS

# Clear sstate files for specified recipe
function clearsstate {
	target=$1

	sstate_dir=`bitbake $target -e | grep "^SSTATE_DIR=" | cut -d "\"" -f 2`
	sstate_pkgspec=`bitbake $target -e | grep "^SSTATE_PKGSPEC=" | cut -d "\"" -f 2`
	sstasks=`bitbake $target -e | grep "^SSTATETASKS=" | cut -d "\"" -f 2`

	for sstask in $sstasks
	do
		sstask=${sstask:3}
		case $sstask in
			populate_sysroot) sstask="populate-sysroot"
			;;
			populate_lic) sstask="populate-lic"
			;;
			package_write_ipk) sstask="deploy-ipk"
			;;
			package_write_deb) sstask="deploy-deb"
			;;
			package_write_rpm) sstask="deploy-rpm"
			;;
			package) sstask="package"
			;;
			deploy) sstask="deploy"
			;;
			*)
			;;
		esac

		echo "Removing ${sstate_dir}/${sstate_pkgspec}*_${sstask}.tgz* for $target"
		rm -rf ${sstate_dir}/${sstate_pkgspec}*_${sstask}.tgz*
	done
}

# Function to re-execute specified task of recipe
function testit {
	target=$1
	task=$2

	task=`echo $task | sed 's/_setscene//'`

	if [ -f $LOGS/force.$target.$task ]; then
		return
	fi

	case $task in
		clean|build|cleansstate|cleanall|package|cleansstate2|package_write|package_write_ipk|package_write_rpm|package_write_deb|fetch|populate_lic) return;;
		fetchall|devshell|buildall|listtasks|checkuri|checkuriall) return;;
	esac

	echo "Attempting target $target, task $task"
	echo "Initial build"
	bitbake $target -c cleansstate > $LOGS/initial.$target.$task
	bitbake $target >> $LOGS/initial.$target.$task
	clearsstate $target >> $LOGS/initial.$target.$task
	echo "Re-execution build"
	bitbake $target -c $task -f  > $LOGS/force.$target.$task
	if [ "$?" != 0 ]; then
		echo "FAILURE for $target $task"
		cp $LOGS/force.$target.$task $LOGS/failed.$target.$task
		bitbake $target -c clean > $LOGS/clean.$target.$task
	else
		bitbake $target >> $LOGS/force.$target.$task
		if [ "$?" != 0 ]; then
			echo "FAILURE2 for $target $task"
			cp $LOGS/force.$target.$task $LOGS/failed.$target.$task
			bitbake $target -c clean > $LOGS/clean.$target.$task
		fi
	fi
	echo "Done"
}

# Go through the recipe list and these recipes' task list
# Then re-execute them
for target in $targets; do
	# Remove log messages from bitbake output
	case $target in
		Summary*|WARNING*|Loading*|Loaded*|Package*|=====*) continue;;
	esac
	tasks=`bitbake $target -c listtasks | grep ^do_ | sed s/do_//`
	for task in $tasks; do
		testit $target $task
	done
done


