#!/usr/bin/env bash CBUILD_BOOTSTRAP_VERSION=1.0.1 set -eo pipefail function version_parse { local value="$1" var_name="$2" IFS_backup="$IFS" IFS='.' local v_array=($value) IFS="$IFS_backup" eval ${var_name}_version_major=${v_array[0]} eval ${var_name}_version_minor=${v_array[1]} eval ${var_name}_version_patch=${v_array[2]} } function safeprint { printf "%s" "$@" } function exec_script_line { local script="$1" local line_num="$2" local line_str="$(sed $line_num'!d' $script)" if [ -z "$line_str" ]; then echo "script line is empty" exit 1 fi eval "$line_str" } function print_version_list { dir_local="$HOME/.local/share/cbuild" dir_global="/usr/local/share/cbuild" files="" if [ -d "$dir_local" ]; then files+="$(find $dir_local -name 'CBUILD_VERSION')" fi if [ -d "$dir_global" ]; then files+="$(find $dir_global -name 'CBUILD_VERSION')" fi for f in $files; do cat $f | sed '$a\' done | sort -V } function print_help { echo "cbuild-bootstrap v$CBUILD_BOOTSTRAP_VERSION" echo "Script that launches a specific cbuild version selected by user or defined in a project config." echo "Usage: cbuild [OPTIONS]" echo "Options:" echo " -h, --help Show this message" echo " -v, --version Shows version" echo " -c, --config FILE Set project config file path (default=./project.config)" echo " --list-versions Shows list of installed cbuild versions" } # parse command line arguments project_config_path="./project.config" args=($@) args_count=${#args[@]} i=0 if [ $args_count -eq 0 ]; then print_help fi while [ $i -lt $args_count ] do case "${args[i]}" in '-v' | '--version') echo "cbuild-bootstrap v$CBUILD_BOOTSTRAP_VERSION" ;; '-h' | '--help') print_help ;; '-c' | '--config') i=$((i+1)) project_config_path="${args[i]}" ;; '--list-versions') print_version_list exit 0 ;; *) ;; esac i=$((i+1)) done if [ -z "$CBUILD_VERSION" ]; then if [ -f "$project_config_path" ]; then # read version from project config exec_script_line "$project_config_path" 2 else echo "project config not found" echo "list of installed cbuild versions:" versions=$(print_version_list) echo "$versions" latest_version=$(echo "$versions" | tail -n 1) echo "select version (default=$latest_version):" read -r CBUILD_VERSION [ -z "$CBUILD_VERSION" ] && CBUILD_VERSION=$latest_version fi fi version_parse "$CBUILD_VERSION" cbuild_ommand="cbuild${_version_major}.${_version_minor} $@" LOG_FILE="$(realpath cbuild.log)" set +eo pipefail # enable logging stdout and stderr to file $cbuild_ommand 2>&1 | tee "$LOG_FILE" # log file can be deleted by clean task if [ -f "$LOG_FILE" ]; then # remove terminal escape codes sed -e 's/[^[:blank:][:print:]]//g' \ -e 's/\[0;[0-9][0-9]m//g' \ -e 's/\[0;[0-9]m//g' \ -e 's/\[[0-9][0-9]m//g' \ -e 's/\[[0-9]m//g' \ -e 's/ H //g' \ -e 's/\[3gH //g' \ "$LOG_FILE" > "$LOG_FILE.clean" mv "$LOG_FILE.clean" "$LOG_FILE" fi