#!/bin/bash set -a #---------------------------- # Color table # Black 0;30 Dark Gray 1;30 # Blue 0;34 Light Blue 1;34 # Green 0;32 Light Green 1;32 # Cyan 0;36 Light Cyan 1;36 # Red 0;31 Light Red 1;31 # Purple 0;35 Light Purple 1;35 # Brown 0;33 Yellow 1;33 # Light Gray 0;37 White 1;37 # No Color 0 #---------------------------- CBlack='\e[0;30m' CDarkGray='\e[1;30m' CBlue='\e[0;34m' CLightBlue='\e[1;34m' CGreen='\e[0;32m' CLightGreen='\e[1;32m' CCyan='\e[0;36m' CLightCyan='\e[1;36m' CRed='\e[0;31m' CLightRed='\e[1;31m' CPurple='\e[0;35m' CLightPurple='\e[1;35m' CBrown='\e[0;33m' CYellow='\e[1;33m' CGray='\e[0;37m' CWhite='\e[1;37m' CNone='\e[0m' set +a #---------------------------- # Echo a colored string to tty and tee-append it to a file without color codes # Parameters: # $1 - string to echo # $2 - log filename # $3 - if "y" create a new file. function echo_and_tee() { if [ "$3" = "y" ]; then echo -e "$1" | tee /dev/tty | sed -r "s|\x1b\[[0-9]+(;[0-9]+)?m||g" >"$2" else echo -e "$1" | tee /dev/tty | sed -r "s|\x1b\[[0-9]+(;[0-9]+)?m||g" >>"$2" fi } #---------------------------- function _set_path_variables() { # Set useful path variables set -a #-- get desired distribution and architecture [[ "$DISTRO" = "" ]] && DISTRO=$(lsb_release -is | sed -e 's/\(.*\)/\L\1/') [[ "$DISTRO_NAME" = "" ]] && DISTRO_NAME=$(lsb_release -cs | sed -e 's/\(.*\)/\L\1/') [[ "$ARCHITECTURE" = "" ]] && ARCHITECTURE=$(dpkg --print-architecture) REPO_DIR="$TDE_DIR/$CFG_GIT_DIR" REPO_TDE="$TDE_DIR/$CFG_GIT_DIR/tde" REPO_TDE_MAIN="$REPO_TDE/main" REPO_TDE_PACKAGING="$TDE_DIR/$CFG_GIT_DIR/tde/packaging/$DISTRO/$DISTRO_NAME" REPO_EXTRA_DEPENDENCIES="$TDE_DIR/$CFG_GIT_DIR/$CFG_EXTRA_DEPS_DIR" BUILD_DIR="$TDE_DIR/$CFG_BUILD_DIR" TDE_BUILD_DIR="$TDE_DIR/$CFG_BUILD_DIR/build" TDE_DEBS_DIR="$TDE_DIR/$CFG_BUILD_DIR/debs" HOOK_DIR="$TDE_DIR/$CFG_GIT_DIR/$CFG_HOOKS_DIR" SCRIPT_LOG_DIR="$TDE_DIR/$CFG_SCRIPT_LOG_DIR" LOG_BUILD_RESULT_FILENAME="$SCRIPT_LOG_DIR/build_result.log" # Common build logfile LOG_UPDATE_REPO_FILENAME="$SCRIPT_LOG_DIR/update_repo.log" # Update repository logfile set +a } #---------------------------- function init_common() { # Check script folder export SCRIPT_DIR=$(dirname $(readlink -f "$0")) # Prevent the script to be run from TDE packaging repo REPO_URL=$(git config --get remote.origin.url 2>/dev/null) if [ ! -z "$REPO_URL" ] && [ -z "${REPO_URL##*tde/packaging}" ]; then echo -e "${CLightRed} --- ERROR ---${CNone}" echo "This script cannot be run from the TDE packaging repository." echo "Please follow the instructions provided, then rerun this script." exit 1 fi # Read config settings CFG_FILE=$SCRIPT_DIR/_config.sh if [ -f "$CFG_FILE" ]; then . "$CFG_FILE" _set_path_variables else echo -e "${CLightRed} --- NOTE ---${CNone}" echo -e "Creating TDE build configuration file from template as ${CLightPurple}$CFG_FILE${CNone}." echo "Please check and modify as required, then rerun this script." cp "$SCRIPT_DIR/internals/_config_template.sh" "$CFG_FILE" exit 2 fi # Make sure we have selected a supported distribution DISTROS_FILE="$SCRIPT_DIR/internals/distro_list.txt" if [ ! -f "$DISTROS_FILE" ]; then echo -e "${CLightRed} --- ERROR ---${CNone}" echo "Could not find the list of supported distributions." echo -e "Please check the file ${CLightPurple}$DISTROS_FILE${CNone} exists, then rerun this script." exit 3 fi # -- Need to use a "here string" otherwise if the DISTRO_FOUND value is modified # -- inside the while loop, this would not remember after the loop. DISTRO_FOUND="n" OLD_IFS=$IFS && IFS=$' \t' while read l_distro l_version l_name l_rel_suffix l_packaging_path; do if [ "$l_distro" = "$DISTRO" -a "$l_name" = "$DISTRO_NAME" ]; then DISTRO_FOUND="y" l_rel_suffix=`echo "$l_rel_suffix" | perl -pe "s|^[\"-]?(.*?)[\"]?$|\1|g"` l_packaging_path=`echo "$l_packaging_path" | perl -pe "s|^[\"-]?(.*?)[\"]?$|\1|g"` export DISTRO_VERSION="$l_version" export REL_SUFFIX="$l_rel_suffix" if [[ ! -z "$l_packaging_path" ]]; then REPO_TDE_PACKAGING="$TDE_DIR/$CFG_GIT_DIR/tde/packaging/$l_packaging_path" fi break fi done <<< $(sed -n "s|\(^[\s]*[^#\s]\+.*$\)|\1|p" < $DISTROS_FILE) IFS=$OLD_IFS if [ "$DISTRO_FOUND" != "y" ]; then echo -e "${CLightRed} --- ERROR ---${CNone}" echo -e "The specified distribution (${CYellow}$DISTRO $DISTRO_NAME${CNone}) is not supported." echo -e "Something is wrong with your configuration (${CLightPurple}$CFG_FILE${CNone})" echo -e "or with the list of supported distributions (${CLightPurple}$DISTROS_FILE${CNone})." echo -e "Please check the ${CLightCyan}DISTRO${CNone} and ${CLightCyan}DISTRO_NAME${CNone} variables, then rerun this script." exit 4 fi # TDE root folder must exist if [ ! -d "$TDE_DIR" ]; then echo -e "${CLightRed} --- ERROR ---${CNone}" echo "A valid TDE root folder could not be located. Something is wrong with your configuration" echo -e "in the config file ${CLightPurple}$CFG_FILE${CNone}" echo -e "Please check and modify the ${CLightCyan}TDE_DIR${CNone} variable as required, then rerun this script." exit 5 fi # Search for main TDE repo CURR_DIR="" [ -d "$REPO_TDE_MAIN" ] && cd "$REPO_TDE_MAIN" &>/dev/null && \ CURR_DIR=$(git rev-parse --show-toplevel 2>/dev/null) if [ -z "$CURR_DIR" ]; then echo -e "${CLightRed} --- ERROR ---${CNone}" echo "The main TDE repo could not be located. Something is wrong with your configuration" echo -e "in the config file ${CLightPurple}$CFG_FILE${CNone}" echo -e "Please check and modify the ${CLightCyan}TDE_DIR${CNone} variable as required, then rerun this script." exit 6 fi # Check branch configuration # - branch existance UPDATE_BRANCHES="${OVERRIDE_UPDATE_BRANCHES:-$UPDATE_BRANCHES}" cd "$REPO_TDE" BRANCHES=() REMOTE_BRANCHES=(`git branch --remote | grep -v "HEAD" | sed "s|origin/||g"`) for br in $UPDATE_BRANCHES; do branch=`echo "$br" | sed -e "s|^[[:space:]]*||" -e "s|[[:space:]]*$||"` found=0 for rem_br in "${REMOTE_BRANCHES[@]}"; do if [[ "$rem_br" == "$branch" ]]; then found=1 break fi done if [[ found -eq 1 ]]; then BRANCHES+=($branch) else echo -e "${CLightRed} --- ERROR ---${CNone}" echo -e "Invalid branch specified (${CYellow}$branch${CNone}). Something is wrong with your configuration" echo -e "in the config file ${CLightPurple}$CFG_FILE${CNone}" echo -e "Please check and modify the ${CLightCyan}UPDATE_BRANCHES${CNone} variable as required, then rerun this script." exit 8 fi done if [ ${#BRANCHES[@]} -eq 0 ]; then echo -e "${CLightRed} --- ERROR ---${CNone}" echo -e "No valid branch was specified. Something is wrong with your configuration" echo -e "in the config file ${CLightPurple}$CFG_FILE${CNone}" echo -e "Please check and modify the ${CLightCyan}UPDATE_BRANCHES${CNone} variable as required, then rerun this script." exit 9 fi export BRANCHES # - default branch DEFAULT_REPO_BRANCH=${OVERRIDE_DEFAULT_REPO_BRANCH:-"$DEFAULT_REPO_BRANCH"} found=0 for branch in "${BRANCHES[@]}"; do if [[ "$DEFAULT_REPO_BRANCH" == "$branch" ]]; then found=1 break fi done if [[ found -ne 1 ]]; then echo -e "${CLightRed} --- ERROR ---${CNone}" echo -e "Invalid default repo branch specified (${CYellow}$DEFAULT_REPO_BRANCH${CNone}). Something is wrong with your configuration" echo -e "in the config file ${CLightPurple}$CFG_FILE${CNone}" echo -e "Please check and modify the ${CLightCyan}DEFAULT_REPO_BRANCH${CNone} variable as required, then rerun this script." exit 10 fi cd "$SCRIPT_DIR" } #---------------------------- # Save execution start time # Parameters: # $1 - timer number function exec_time_start() { _ET_start_var="_ET_start_$1" eval "$_ET_start_var=`date +%s.%N`" } #---------------------------- # Save execution stop time and set $2 to the execution time # in the format: dd/hh:mm:ss.mmm # Parameters: # $1 - timer number # $2 - result variable name function exec_time_stop() { _ET_start_var="_ET_start_$1" _ET_stop_var="_ET_stop_$1" eval "$_ET_stop_var=`date +%s.%N`" _ET_diff=`echo "${!_ET_stop_var} - ${!_ET_start_var}" | bc` _ET_days=`echo "$_ET_diff/86400" | bc` _ET_diff_day=`echo "$_ET_diff-86400*$_ET_days" | bc` _ET_hours=`echo "$_ET_diff_day/3600" | bc` _ET_diff_hour=`echo "$_ET_diff_day-3600*$_ET_hours" | bc` _ET_mins=`echo "$_ET_diff_hour/60" | bc` _ET_secs=`echo "$_ET_diff_hour-60*$_ET_mins" | bc` local _resultvar=$2 eval "$_resultvar=`printf \"%02d/%02d:%02d:%06.3f\" $_ET_days $_ET_hours $_ET_mins $_ET_secs`" }