#!/bin/bash

# Test Script for task re-execution
# 
# Copyright 2012 Intel Corporation
# All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#
# 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


