#!/bin/bash

rebuild_all_version=0

unset processes modules_files

#
# functions
#

isMemberOf() {
	local i target
	target="$1"
	shift 1
	for i in $@; do
		[[ "$target" == "$i" ]] && return 0
	done
	return 1
}

printHelpAndExit(){
	#[[ $# == 3 ]] && echo $1 $2
	echo $*
	echo "usage rebuild_all [options]"

	exit
}

cleanup_and_die(){
	kill "$processes"
	rm -f "${modules_files[*]}"
}

trap "cleanup_and_die" SIGHUP SIGINT SIGQUIT SIGABRT SIGTERM

#
# settings
#

#default modules, all present
modules_path="/etc/rebuild.d/"

#TODO
action="echo"

#exact, best, slot TODO
rebuild_version="exact"

[[ -f /etc/rebuild-allrc ]] && . /etc/rebuild-allrc

available_rebuild_version=(exact best slot)
available_modules=($(ls "${modules_path}"))
[[ -z "$modules" ]] && modules=(${available_modules[*]})

while getopts "a:m:V:dvhM" optionName; do
	case "$optionName" in
			a) action="$OPTARG";;
			m) modules=($(echo "$OPTARG" | sed 's/:/ /g'));;
			M) echo "${available_modules[*]}"; exit 0;;
			V) rebuild_version="$OPTARG";;
#default stuff
			d) set -xv;;
			v) echo rebuild_all version "$reabuild_all_version" && exit;;
			h) printHelpAndExit;;
			[?]) printHelpAndExit bad_option "$badOptionHelp";;
	esac
done

for i in ${modules[*]}; do
	isMemberOf $i ${available_modules[*]} || printHelpAndExit unknown_module $i
done
	
#echo isMemberOf $rebuild_version ${available_rebuild_version[*]} 
isMemberOf $rebuild_version ${available_rebuild_version[*]} ||
	printHelpAndExit unknown_rebuild_version $rebuild_version

#
# functionality
#

[[ 0 == ${#modules[*]} ]] && exit 0

for ((i=0;i<${#modules[*]};i++)) do
	modules_files[$i]=$(mktemp)
	"${modules_path}/${modules[$i]}" > ${modules_files[$i]} &
	processes=(${processes} $?)
done

wait

packagesToRebuild=$([[ -n "${modules_files[*]}" ]] && cat ${modules_files[*]})
rm ${modules_files[*]}


test -n "${packagesToRebuild[*]}" && "$action" ${packagesToRebuild[*]}

