diff --git a/README.md b/README.md index 5d03bac..27ec522 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,14 @@ script, so all of the functions defined in modules under the `lib` directory wil ## Changelog +__0.3__ + +* Added support for variable replacement +* Small code refactorings +* Added a VARIABLES file that is read for the variables +* Added run flag to the compiled script +* Updated the init files + __0.2__ * Added support for deploying (copying) to a (configurable) path @@ -56,6 +64,10 @@ __0.1__ * Created the initial script * Split it up so it will compile itself (this therefor serves as example project) +## Open issues + +* Implement creating a new bash script project + ## Sources * [Initial project we forked](https://github.com/zinovyev/bash-project) diff --git a/bash-script-compiler b/bash-script-compiler index 259cacc..7cfffe3 100755 --- a/bash-script-compiler +++ b/bash-script-compiler @@ -8,17 +8,15 @@ # Maintainer: Manuel Manhart # Company: Manuel Manhart IT e.U. # License: MIT -# Created by bash-script-compiler version BASH_SCRIPT_COMPILER_VERSION +# Created by bash-script-compiler version 0.3 # set default constants / variables -VERSION="0.2" +VERSION="0.3" # TODO implement variable replacement during compilation and use this here instead of the hardcoded value: -#CONFIG_FILE_NAME=BASH_SCRIPT_COMPILER_SCRIPT_NAME.config -CONFIG_FILE_NAME=bash-script-compiler.config -CONFIG_PATH=${HOME}/.config/mmit -CONFIG_FILE=${CONFIG_PATH}/${CONFIG_FILE_NAME} -ACTION=${1:-"help"} +CONFIG_FILE_NAME="bash-script-compiler.config" +CONFIG_PATH="${HOME}/.config/mmit" +CONFIG_FILE="${CONFIG_PATH}/${CONFIG_FILE_NAME}" TARGET_DIR_NAME="dist" SRC_DIR_NAME="src" @@ -48,10 +46,6 @@ compile_addFunctions() { done } -compile_copyCompletionFile() { - cp *-completion ../${TARGET_DIR_NAME} -} - compile_defineMainFunction() { touch ${TARGET_FILE} if [ ! -f "${INTRO_FILE_NAME}" ]; then @@ -67,7 +61,11 @@ compile_defineMainFunction() { else echo -e "function main() {" >> ${TARGET_FILE} cat "${MAIN_FUNC_FILE_NAME}" | sed -e 's/^/ /g' >> ${TARGET_FILE} - echo -e "\n}\n" >> ${TARGET_FILE} + cat >>${TARGET_FILE} <<-END + +} + +END fi } @@ -75,24 +73,97 @@ compile_invokeMainFunction() { echo "main \"\$@\"" >> ${TARGET_FILE} } -compile_setTargetFile() { +function compile_otherFileProcessing() { + cp *-completion ${TARGET_PATH} + chmod +x ${TARGET_FILE} +} + +function compile_readVariables() { + local directory="$TARGET_PATH" + + # read VARIABLES + if [ -f ./VARIABLES ]; then + source VARIABLES + #echo "DEBUG: Found variables file, setting: `cat VARIABLES`" + fi + if [ -n $BASH_SCRIPT_COMPILER_SCRIPT_NAME ]; then + pushd .. >/dev/null 2>&1 + BASH_SCRIPT_COMPILER_SCRIPT_NAME=$(basename "$(pwd)") + popd >/dev/null 2>&1 + echo "BASH_SCRIPT_COMPILER_SCRIPT_NAME was not set, setting to: $BASH_SCRIPT_COMPILER_SCRIPT_NAME" + fi +} + +function compile_replaceVariables() { + local directory="$TARGET_PATH" local bashScriptName=$(basename "$(pwd)") - if [ ! -d "${TARGET_DIR_NAME}" ]; then - echo "Creating output dir '${TARGET_DIR_NAME}'" - mkdir -p ${TARGET_DIR_NAME} + + # read VARIABLES + if [ -f ./VARIABLES ]; then + source VARIABLES + cat VARIABLES + fi + + # Loop through each file in the directory + for file in "$directory"/*; do + if [ -f "$file" ]; then + #echo "DEBUG: replacing variables for $file" + # Replace pattern in file content + local content=$(cat $file) + local replacement=$(compile_replaceVariablesIntern "$content") + # Replace the file content + #echo "DEBUG: file content: $replacement" + if [ "$content" != "$replacement" ]; then + echo -e "$replacement" >$file + fi + + # Extract the filename without the directory path + local filename=$(basename "$file") + local replacement=$(compile_replaceVariablesIntern "$filename") + # Rename the file if the new filename is different + if [ "$filename" != "$replacement" ]; then + mv "$file" "$directory/$replacement" + fi + fi + done +} + +# does the real replacement of content (first argument) and echoes it +# call it like this: $replacement=$(compile_replaceVariablesIntern $CONTENT_WHERE_YOU_WANT_TO_REPLACE_VARIABLES) +# Be aware that everything that is echoed in here will be in the replacement as well +function compile_replaceVariablesIntern() { + local content=$1 + while [[ "$content" =~ _BASH_SCRIPT_COMPILER_[A-Z_]+_ ]]; do + #echo "DEBUG: found following variable to replace in content: ${BASH_REMATCH[0]}" + local matchedPattern="${BASH_REMATCH[0]}" + local varName=$(echo "$matchedPattern" | sed 's/^_//; s/_$//') + local replacementValue="${!varName}" + #echo "DEBUG: replacing $matchedPattern with $varName = $replacementValue in content" + content=$(echo "$content" | sed "s/${matchedPattern}/${replacementValue}/") + done + echo -e "$content" +} + +compile_setBuildTarget() { + TARGET_PATH=../${TARGET_DIR_NAME} + if [ ! -d "${TARGET_PATH}" ]; then + echo "Creating output dir '${TARGET_PATH}'" + mkdir -p ${TARGET_PATH} fi # we need to add ../ since we will be cd-ing into the src dir inside the PRJ_DIR - TARGET_FILE=../${TARGET_DIR_NAME}/$bashScriptName + TARGET_FILE=${TARGET_PATH}/${BASH_SCRIPT_COMPILER_SCRIPT_NAME} } compile() { pushd $PRJ_DIR >/dev/null 2>&1 - compile_setTargetFile cd $SRC_DIR_NAME + compile_readVariables + compile_setBuildTarget compile_defineMainFunction compile_addFunctions compile_invokeMainFunction - compile_copyCompletionFile + compile_otherFileProcessing + compile_replaceVariables echo "Compiled successfully" popd >/dev/null 2>&1 } diff --git a/init/README.md b/init/README.md index e03ff63..d61f47d 100644 --- a/init/README.md +++ b/init/README.md @@ -1,14 +1,12 @@ -# gt bash script 0.1 +# _BASH_SCRIPT_SCRIPT_NAME_ 0.1 -A helper for git functions I really miss, like merging the lastest develop / main branch into my current branch, showing what I (or someone else) has checked in over the time, etc. +TODO: Your description here ## Changelog __0.1__ * Created the initial bash script -* Added config functions (for future use) -* Added commands pull, tag, mine, pullAndMerge ## Sources diff --git a/init/VERSION b/init/VERSION deleted file mode 100644 index ceab6e1..0000000 --- a/init/VERSION +++ /dev/null @@ -1 +0,0 @@ -0.1 \ No newline at end of file diff --git a/init/src/VARIABLES b/init/src/VARIABLES new file mode 100644 index 0000000..f110344 --- /dev/null +++ b/init/src/VARIABLES @@ -0,0 +1,4 @@ +# sets the version of the script +BASH_SCRIPT_COMPILER_VERSION=0.1 +# optionally set the name of the compiled script (otherwise the directory name will be taken) +#BASH_SCRIPT_COMPILER_SCRIPT_NAME=bash-script-compiler diff --git a/init/src/functions/configInit.sh b/init/src/functions/configInit.sh index c784541..4c9e2c1 100644 --- a/init/src/functions/configInit.sh +++ b/init/src/functions/configInit.sh @@ -1,28 +1,15 @@ configInit() { - if [ ! -f "${DEV_CONFIG_FILE}" ]; then - echo Could not find any config file, creating a file for you to fill in the values in ${DEV_CONFIG_FILE} - if [ ! -d "${DEV_CONFIG_FILE_PATH}" ]; then - echo "Config directory '${DEV_CONFIG_FILE_PATH}' does not exist yet, creating..." - mkdir -p ${DEV_CONFIG_FILE_PATH} + if [ ! -f "${CONFIG_FILE}" ]; then + echo Could not find any config file, creating a file for you to fill in the values in ${CONFIG_FILE} + if [ ! -d "${CONFIG_PATH}" ]; then + echo "Config directory '${CONFIG_PATH}' does not exist yet, creating..." + mkdir -p ${CONFIG_PATH} fi - if [ -f "/IMAGE_NAME" ]; then - # || [ `whoami` = 'dev' ]; then - MODE=devcontainer - GRADLE_DEFAULT=wrapper - else - MODE=host - GRADLE_DEFAULT=normal - fi - - cat <${DEV_CONFIG_FILE} -# this file was created by dev script by Manuel Manhart + cat <${CONFIG_FILE} +# this file was created by bash-script-compiler script _BASH_SCRIPT_COMPILER_VERSION_ by Manuel Manhart # it is now in your hands and will not be changed by scripts anymore -MODE=$MODE -LIFERAY_DOCKER=( - "TODO" # change this to the real path -) +# TODO: Add your config values here like CONFIG_VAR_KEY="config var value" END - fi } diff --git a/init/src/functions/configPrint.sh b/init/src/functions/configPrint.sh index d15ba87..88c76b0 100644 --- a/init/src/functions/configPrint.sh +++ b/init/src/functions/configPrint.sh @@ -2,7 +2,7 @@ configPrint() { echo "" echo "Configuration file:" - cat ${DEV_CONFIG_FILE} | while read line + cat ${CONFIG_FILE} | while read line do echo "$line" done diff --git a/init/src/functions/configRead.sh b/init/src/functions/configRead.sh index d9a57b1..8670c6a 100644 --- a/init/src/functions/configRead.sh +++ b/init/src/functions/configRead.sh @@ -1,23 +1,13 @@ # reads the configuration file where the docker container names are saved configRead() { - if [ -f "${DEV_CONFIG_FILE_PATH}/${DEV_CONFIG_FILE_NAME}" ]; then - echo found config file in ${DEV_CONFIG_FILE_PATH}/${DEV_CONFIG_FILE_NAME} - source ${DEV_CONFIG_FILE_PATH}/${DEV_CONFIG_FILE_NAME} - - # Read common vars from the config file - # the incantation here ensures (by env) that only key=value pairs are present - # then declare-ing the result puts those vars in our environment -# declare $(env -i `cat ${DEV_CONFIG_FILE_PATH}/${DEV_CONFIG_FILE_NAME}` >/dev/null 2>&1) >/dev/null 2>&1 - -# IFS=$'\n' read -d '' -r -a LIFERAY_DOCKER < ${DEV_CONFIG_FILE_PATH}/${DEV_CONFIG_FILE_NAME} + if [ -f "${CONFIG_FILE}" ]; then + echo found config file in ${CONFIG_FILE} + source ${CONFIG_FILE} fi # as fallback search in script home directory SCRIPTPATH="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" - if [ -f "${SCRIPTPATH}/${DEV_CONFIG_FILE_NAME}" ]; then - echo found config file in ${SCRIPTPATH}/${DEV_CONFIG_FILE_NAME} - - declare $(env -i `cat ${SCRIPTPATH}/${DEV_CONFIG_FILE_NAME}` >/dev/null 2>&1) -# source ${SCRIPTPATH}/${DEV_CONFIG_FILE_NAME} -# IFS=$'\n' read -d '' -r -a LIFERAY_DOCKER < ${SCRIPTPATH}/${DEV_CONFIG_FILE_NAME} + if [ -f "${SCRIPTPATH}/${CONFIG_FILE_NAME}" ]; then + echo "found config file in ${SCRIPTPATH}/${CONFIG_FILE_NAME}" + declare $(env -i `cat ${SCRIPTPATH}/${CONFIG_FILE_NAME}` >/dev/null 2>&1) fi } diff --git a/init/src/functions/demo.sh b/init/src/functions/demo.sh new file mode 100644 index 0000000..45e4d1f --- /dev/null +++ b/init/src/functions/demo.sh @@ -0,0 +1,3 @@ +demo() { + echo "$DEMO_GREETING" +} diff --git a/init/src/functions/gitPull.sh b/init/src/functions/gitPull.sh deleted file mode 100644 index 9aa3301..0000000 --- a/init/src/functions/gitPull.sh +++ /dev/null @@ -1,7 +0,0 @@ -gitPull() { - if [ -f ".git" ]; then - git pull - else - echo "Seems not to be a git repo" - fi -} diff --git a/init/src/functions/gitTag.sh b/init/src/functions/gitTag.sh deleted file mode 100644 index e6955d6..0000000 --- a/init/src/functions/gitTag.sh +++ /dev/null @@ -1,17 +0,0 @@ -gitTag() { - if [ -n "$2" ]; then - git pull >/dev/null - local message="" - if [ -n "$3" ]; then - message="-m $3" - fi - git tag -a $2 $message - git push --tags - else - git fetch origin >/dev/null - echo "Existing tags" - git tag - echo "" - echo "If you want to create a new tag, just provide a tag version" - fi -} diff --git a/init/src/functions/help.sh b/init/src/functions/help.sh index f9ab9ba..435543b 100644 --- a/init/src/functions/help.sh +++ b/init/src/functions/help.sh @@ -12,11 +12,7 @@ The options are: config init ... for creating a config file (if none exists yet - automatically checked) config print ... for printing the config file content - mine [USER] ... fetches the log of either the given user or the one defined in git config - pullAndMerge BRANCH ... pulls the given branch and merges it into the current one (updating to latest develop / main) - pull ... for pulling from git (not working?) - tag NAME [MESSAGE] ... creates and pushes a new tag - branch NAME ... creates a new branch (TODO) + demo (STRING) ... echoes a greeting or the given STRING help ... show this page diff --git a/init/src/functions/mine.sh b/init/src/functions/mine.sh deleted file mode 100644 index 32e2a8a..0000000 --- a/init/src/functions/mine.sh +++ /dev/null @@ -1,13 +0,0 @@ -mine() { - # fetch user from args - local gitUser=$GIT_USER - # Get the user defined in the local config - if [ -z "$gitUser" ]; then - gitUser=$(git config --get user.name) - echo "Fetching user from git config: $gitUser" - fi - echo "Git user: $gitUser" - - # get my commits - git log --author="$gitUser" -} diff --git a/init/src/functions/parseArgs_demo.sh b/init/src/functions/parseArgs_demo.sh new file mode 100644 index 0000000..1625c3d --- /dev/null +++ b/init/src/functions/parseArgs_demo.sh @@ -0,0 +1,6 @@ +parseArgs_demo() { + DEMO_GREETING="Welcome to our demo, $USER" + if [ -z "$1" ]; then + DEMO_GREETING="$1" + fi +} diff --git a/init/src/functions/parseArgs_mine.sh b/init/src/functions/parseArgs_mine.sh deleted file mode 100644 index 3aec7e8..0000000 --- a/init/src/functions/parseArgs_mine.sh +++ /dev/null @@ -1,6 +0,0 @@ -parseArgs_mine() { - echo "Fetching user: $1" - if [ -n "$1" ]; then - GIT_USER=$1 - fi -} diff --git a/init/src/functions/parseArgs_pullAndMerge.sh b/init/src/functions/parseArgs_pullAndMerge.sh deleted file mode 100644 index a287317..0000000 --- a/init/src/functions/parseArgs_pullAndMerge.sh +++ /dev/null @@ -1,9 +0,0 @@ -parseArgs_pullAndMerge() { - echo "Pulling and merging branch $1 into current one" - if [ -z "$1" ]; then - echo "ERROR: Argument BRANCH is missing" - help pullAndMerge - else - GIT_BRANCH=$1 - fi -} diff --git a/init/src/functions/preset.sh b/init/src/functions/preset.sh deleted file mode 100644 index 87fcf14..0000000 --- a/init/src/functions/preset.sh +++ /dev/null @@ -1,19 +0,0 @@ -preset() { - # not yet working - # FIXME properties file not correctly read - # FIXME how do we set multiple values in a simple properties file - # TODO think about a better mechanism - utilIsReadPropertiesFile ./.dev-presets presetOptions presetValues - printf "presetOptions %s\n" "${presetOptions[@]}" - printf "presetValues %s\n" "${presetValues[@]}" - echo 'Please enter your choice: ' - local index=0 - for item in "${presetOptions[@]}" - do - echo ${index}. ${item} - index="$((index + 1))" - done - read n - echo "opt: $n" - echo "presetValue: ${presetValues[$n]}" -} diff --git a/init/src/functions/pullAndMerge.sh b/init/src/functions/pullAndMerge.sh deleted file mode 100644 index 566db86..0000000 --- a/init/src/functions/pullAndMerge.sh +++ /dev/null @@ -1,12 +0,0 @@ -pullAndMerge() { - # fetch user from args - local gitBranch=$GIT_BRANCH - local currentBranch=$(git rev-parse --abbrev-ref HEAD) - echo "current branch: $currentBranch" - - # Update the current branch to the latest of the given branch - git checkout $gitBranch - git pull - git checkout $currentBranch - echo DEBUG: git merge $gitBranch -} diff --git a/init/src/functions/runScript.sh b/init/src/functions/runScript.sh deleted file mode 100644 index 32dc975..0000000 --- a/init/src/functions/runScript.sh +++ /dev/null @@ -1,34 +0,0 @@ -runScript() { - # go to source path (if neccessary) - pushd $SOURCE_PATH >/dev/null 2>&1 - local runFunctions=${@// /|} - #echo "DEBUG - runFunctions: $runFunctions" - - # in the execution there are in- and dependent tasks, this file ensures that everything - # will be executed in a helpful way - - if [[ "$runFunctions" = *"help"* ]]; then - help - fi - # run config functions - if [[ "$runFunctions" = *"config"* ]]; then - if [[ "$runFunctions" = *"config init"* ]]; then - configInit - elif [[ "$runFunctions" = *"config print"* ]]; then - configPrint - exit - elif [[ "$runFunctions" = *"config set"* ]]; then - echo "Setting configurations is not yet supported" - fi - fi - - local parseArgsFunc="parseArgs_$ACTION" - local isParseArgsDefined=$(type -t $parseArgsFunc) - if [ "function" == "$isParseArgsDefined" ]; then - "$parseArgsFunc" "${@:2}" - fi - "$ACTION" "${@:2}" - - # return to initial path (if neccessary) - popd >/dev/null 2>&1 -} diff --git a/init/src/functions/utilIsExistingFile.sh b/init/src/functions/utilIsExistingFile.sh deleted file mode 100644 index 9c83a52..0000000 --- a/init/src/functions/utilIsExistingFile.sh +++ /dev/null @@ -1,7 +0,0 @@ -utilIsExistingFile() { - if ls $1 1> /dev/null 2>&1; then - return 0 - else - return 1 - fi -} diff --git a/init/src/functions/utilIsReadPropertiesFile.sh b/init/src/functions/utilIsReadPropertiesFile.sh deleted file mode 100644 index 539b564..0000000 --- a/init/src/functions/utilIsReadPropertiesFile.sh +++ /dev/null @@ -1,21 +0,0 @@ -utilIsReadPropertiesFile() { - local fileName=$1 - local keysName=$2 - local valuesName=$3 - local keys=() - local values=() - echo "reading properties file $1 into $2 and $3" - if [ -n "$fileName" ]; then - while IFS='=' read -r key value - do - key=$(echo $key | tr '.' '_') - keys+=("$key") - values+=("$value") -# eval ${key}=\${value} - done < "$fileName" - fi - echo "keys: $keys" - echo "values: $values" - eval $keysName="'$keys'" - eval $valuesName="'$values'" -} diff --git a/init/src/intro.sh b/init/src/intro.sh index dba98a1..aa76be9 100644 --- a/init/src/intro.sh +++ b/init/src/intro.sh @@ -11,10 +11,9 @@ # Created by bash-script-compiler version BASH_SCRIPT_COMPILER_VERSION # set default constants / variables -VERSION="0.1" +VERSION="_BASH_SCRIPT_COMPILER_VERSION_" # define your global variables here -CONFIG_FILE_NAME=BASH_SCRIPT_COMPILER_SCRIPT_NAME.config +CONFIG_FILE_NAME=_BASH_SCRIPT_COMPILER_SCRIPT_NAME_.config CONFIG_PATH=${HOME}/.config/mmit CONFIG_FILE=${CONFIG_PATH}/${CONFIG_FILE_NAME} -ACTION=${1:-"help"} diff --git a/init/src/main.sh b/init/src/main.sh index 94b4a2a..dfaf457 100644 --- a/init/src/main.sh +++ b/init/src/main.sh @@ -1,12 +1,20 @@ - # main -# import colors +# if there is a import colors script source it if [ -f ${BASH_SOURCE%/*}/define-colors ]; then . ${BASH_SOURCE%/*}/define-colors "" fi # read configuration (if any) configRead +# set the action to the first parameter (if your script runs without, just remove these lines) +local action=${1:-"help"} +local parseArgsFunc="${PARSE_ARGS_PREFIX}${action}" +# if there is a parseArgs_ARG1, call it +local isParseArgsDefined=$(type -t $parseArgsFunc) +if [ "function" == "$isParseArgsDefined" ]; then + "$parseArgsFunc" "${@:2}" +fi # parse the arguments parseArgs "$@" -# run the script -runScript "$@" +configRead +# run the script (by default calls the function given in the first arg) +"$action" "${@:2}" \ No newline at end of file diff --git a/src/VARIABLES b/src/VARIABLES new file mode 100644 index 0000000..22c9e33 --- /dev/null +++ b/src/VARIABLES @@ -0,0 +1,4 @@ +# sets the version of the script +BASH_SCRIPT_COMPILER_VERSION=0.3 +# optionally set the name of the compiled script (otherwise the directory name will be taken) +#BASH_SCRIPT_COMPILER_SCRIPT_NAME=bash-script-compiler diff --git a/src/bash-script-compiler-completion b/src/_BASH_SCRIPT_COMPILER_SCRIPT_NAME_-completion similarity index 81% rename from src/bash-script-compiler-completion rename to src/_BASH_SCRIPT_COMPILER_SCRIPT_NAME_-completion index cf4ff93..8e5e9d7 100644 --- a/src/bash-script-compiler-completion +++ b/src/_BASH_SCRIPT_COMPILER_SCRIPT_NAME_-completion @@ -1,4 +1,5 @@ -_bash-script-compiler-completion() +# version _BASH_SCRIPT_COMPILER_VERSION_ +__BASH_SCRIPT_COMPILER_SCRIPT_NAME_-completion() { local cur prev opts tag help COMPREPLY=() @@ -9,7 +10,7 @@ _bash-script-compiler-completion() config="print set init" # TODO check if this is still the most efficient way to list help options - HELP_PATH=${BASH_SOURCE%/*}/bash-script-compiler-help + HELP_PATH=${BASH_SOURCE%/*}/_BASH_SCRIPT_COMPILER_SCRIPT_NAME_-help help=${opts} #help=`ls $HELP_PATH` @@ -46,4 +47,4 @@ createFromDirectory() { popd >/dev/null } -complete -F _bash-script-compiler-completion bash-script-compiler +complete -F __BASH_SCRIPT_COMPILER_SCRIPT_NAME_-completion _BASH_SCRIPT_COMPILER_SCRIPT_NAME_ diff --git a/src/functions/compile.sh b/src/functions/compile.sh index 9550a94..86e103b 100644 --- a/src/functions/compile.sh +++ b/src/functions/compile.sh @@ -1,11 +1,13 @@ compile() { pushd $PRJ_DIR >/dev/null 2>&1 - compile_setTargetFile cd $SRC_DIR_NAME + compile_readVariables + compile_setBuildTarget compile_defineMainFunction compile_addFunctions compile_invokeMainFunction - compile_copyCompletionFile + compile_otherFileProcessing + compile_replaceVariables echo "Compiled successfully" popd >/dev/null 2>&1 } \ No newline at end of file diff --git a/src/functions/compile_copyCompletionFile.sh b/src/functions/compile_copyCompletionFile.sh deleted file mode 100644 index eab625c..0000000 --- a/src/functions/compile_copyCompletionFile.sh +++ /dev/null @@ -1,3 +0,0 @@ -compile_copyCompletionFile() { - cp *-completion ../${TARGET_DIR_NAME} -} diff --git a/src/functions/compile_defineMainFunction.sh b/src/functions/compile_defineMainFunction.sh index 5ea1a7e..a6bdd86 100644 --- a/src/functions/compile_defineMainFunction.sh +++ b/src/functions/compile_defineMainFunction.sh @@ -13,6 +13,10 @@ compile_defineMainFunction() { else echo -e "function main() {" >> ${TARGET_FILE} cat "${MAIN_FUNC_FILE_NAME}" | sed -e 's/^/ /g' >> ${TARGET_FILE} - echo -e "\n}\n" >> ${TARGET_FILE} + cat >>${TARGET_FILE} <<-END + +} + +END fi } diff --git a/src/functions/compile_otherFileProcessing.sh b/src/functions/compile_otherFileProcessing.sh new file mode 100644 index 0000000..63cf344 --- /dev/null +++ b/src/functions/compile_otherFileProcessing.sh @@ -0,0 +1,4 @@ +function compile_otherFileProcessing() { + cp *-completion ${TARGET_PATH} + chmod +x ${TARGET_FILE} +} diff --git a/src/functions/compile_readVariables.sh b/src/functions/compile_readVariables.sh new file mode 100644 index 0000000..3bb66eb --- /dev/null +++ b/src/functions/compile_readVariables.sh @@ -0,0 +1,15 @@ +function compile_readVariables() { + local directory="$TARGET_PATH" + + # read VARIABLES + if [ -f ./VARIABLES ]; then + source VARIABLES + #echo "DEBUG: Found variables file, setting: `cat VARIABLES`" + fi + if [ -n $BASH_SCRIPT_COMPILER_SCRIPT_NAME ]; then + pushd .. >/dev/null 2>&1 + BASH_SCRIPT_COMPILER_SCRIPT_NAME=$(basename "$(pwd)") + popd >/dev/null 2>&1 + echo "BASH_SCRIPT_COMPILER_SCRIPT_NAME was not set, setting to: $BASH_SCRIPT_COMPILER_SCRIPT_NAME" + fi +} diff --git a/src/functions/compile_replaceVariables.sh b/src/functions/compile_replaceVariables.sh new file mode 100644 index 0000000..42d2b31 --- /dev/null +++ b/src/functions/compile_replaceVariables.sh @@ -0,0 +1,49 @@ +function compile_replaceVariables() { + local directory="$TARGET_PATH" + local bashScriptName=$(basename "$(pwd)") + + # read VARIABLES + if [ -f ./VARIABLES ]; then + source VARIABLES + cat VARIABLES + fi + + # Loop through each file in the directory + for file in "$directory"/*; do + if [ -f "$file" ]; then + #echo "DEBUG: replacing variables for $file" + # Replace pattern in file content + local content=$(cat $file) + local replacement=$(compile_replaceVariablesIntern "$content") + # Replace the file content + #echo "DEBUG: file content: $replacement" + if [ "$content" != "$replacement" ]; then + echo -e "$replacement" >$file + fi + + # Extract the filename without the directory path + local filename=$(basename "$file") + local replacement=$(compile_replaceVariablesIntern "$filename") + # Rename the file if the new filename is different + if [ "$filename" != "$replacement" ]; then + mv "$file" "$directory/$replacement" + fi + fi + done +} + +# does the real replacement of content (first argument) and echoes it +# call it like this: $replacement=$(compile_replaceVariablesIntern $CONTENT_WHERE_YOU_WANT_TO_REPLACE_VARIABLES) +# Be aware that everything that is echoed in here will be in the replacement as well +function compile_replaceVariablesIntern() { + local content=$1 + while [[ "$content" =~ _BASH_SCRIPT_COMPILER_[A-Z_]+_ ]]; do + #echo "DEBUG: found following variable to replace in content: ${BASH_REMATCH[0]}" + local matchedPattern="${BASH_REMATCH[0]}" + local varName=$(echo "$matchedPattern" | sed 's/^_//; s/_$//') + local replacementValue="${!varName}" + #echo "DEBUG: replacing $matchedPattern with $varName = $replacementValue in content" + content=$(echo "$content" | sed "s/${matchedPattern}/${replacementValue}/") + done + echo -e "$content" +} diff --git a/src/functions/compile_setBuildTarget.sh b/src/functions/compile_setBuildTarget.sh new file mode 100644 index 0000000..5ba0faf --- /dev/null +++ b/src/functions/compile_setBuildTarget.sh @@ -0,0 +1,9 @@ +compile_setBuildTarget() { + TARGET_PATH=../${TARGET_DIR_NAME} + if [ ! -d "${TARGET_PATH}" ]; then + echo "Creating output dir '${TARGET_PATH}'" + mkdir -p ${TARGET_PATH} + fi + # we need to add ../ since we will be cd-ing into the src dir inside the PRJ_DIR + TARGET_FILE=${TARGET_PATH}/${BASH_SCRIPT_COMPILER_SCRIPT_NAME} +} diff --git a/src/functions/compile_setTargetFile.sh b/src/functions/compile_setTargetFile.sh deleted file mode 100644 index 7ccda7f..0000000 --- a/src/functions/compile_setTargetFile.sh +++ /dev/null @@ -1,9 +0,0 @@ -compile_setTargetFile() { - local bashScriptName=$(basename "$(pwd)") - if [ ! -d "${TARGET_DIR_NAME}" ]; then - echo "Creating output dir '${TARGET_DIR_NAME}'" - mkdir -p ${TARGET_DIR_NAME} - fi - # we need to add ../ since we will be cd-ing into the src dir inside the PRJ_DIR - TARGET_FILE=../${TARGET_DIR_NAME}/$bashScriptName -} diff --git a/src/intro.sh b/src/intro.sh index debf036..f73754a 100644 --- a/src/intro.sh +++ b/src/intro.sh @@ -8,17 +8,15 @@ # Maintainer: Manuel Manhart # Company: Manuel Manhart IT e.U. # License: MIT -# Created by bash-script-compiler version BASH_SCRIPT_COMPILER_VERSION +# Created by bash-script-compiler version _BASH_SCRIPT_COMPILER_VERSION_ # set default constants / variables -VERSION="0.2" +VERSION="_BASH_SCRIPT_COMPILER_VERSION_" # TODO implement variable replacement during compilation and use this here instead of the hardcoded value: -#CONFIG_FILE_NAME=BASH_SCRIPT_COMPILER_SCRIPT_NAME.config -CONFIG_FILE_NAME=bash-script-compiler.config -CONFIG_PATH=${HOME}/.config/mmit -CONFIG_FILE=${CONFIG_PATH}/${CONFIG_FILE_NAME} -ACTION=${1:-"help"} +CONFIG_FILE_NAME="_BASH_SCRIPT_COMPILER_SCRIPT_NAME_.config" +CONFIG_PATH="${HOME}/.config/mmit" +CONFIG_FILE="${CONFIG_PATH}/${CONFIG_FILE_NAME}" TARGET_DIR_NAME="dist" SRC_DIR_NAME="src"