From b3136b4d32104ca9325a59b0588f6133d22af4a9 Mon Sep 17 00:00:00 2001 From: Manuel Manhart Date: Mon, 25 Mar 2024 10:22:01 +0100 Subject: [PATCH] initial commit --- .gitignore | 1 + LICENSE | 21 +++++++++ README.md | 15 +++++++ src/functions/buildCheckBuildSystem.sh | 18 ++++++++ src/functions/configInit.sh | 28 ++++++++++++ src/functions/configPrint.sh | 11 +++++ src/functions/configRead.sh | 23 ++++++++++ src/functions/gitPull.sh | 7 +++ src/functions/gitTag.sh | 17 +++++++ src/functions/help.sh | 27 ++++++++++++ src/functions/mine.sh | 13 ++++++ src/functions/parseArgs.sh | 36 +++++++++++++++ src/functions/parseArgs_mine.sh | 6 +++ src/functions/parseArgs_pullAndMerge.sh | 9 ++++ src/functions/preset.sh | 19 ++++++++ src/functions/pullAndMerge.sh | 12 +++++ src/functions/runScript.sh | 34 ++++++++++++++ src/functions/utilIsExistingFile.sh | 7 +++ src/functions/utilIsReadPropertiesFile.sh | 21 +++++++++ src/gt-completion | 54 +++++++++++++++++++++++ src/intro.sh | 26 +++++++++++ src/main.sh | 11 +++++ 22 files changed, 416 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 src/functions/buildCheckBuildSystem.sh create mode 100644 src/functions/configInit.sh create mode 100644 src/functions/configPrint.sh create mode 100644 src/functions/configRead.sh create mode 100644 src/functions/gitPull.sh create mode 100644 src/functions/gitTag.sh create mode 100644 src/functions/help.sh create mode 100644 src/functions/mine.sh create mode 100644 src/functions/parseArgs.sh create mode 100644 src/functions/parseArgs_mine.sh create mode 100644 src/functions/parseArgs_pullAndMerge.sh create mode 100644 src/functions/preset.sh create mode 100644 src/functions/pullAndMerge.sh create mode 100644 src/functions/runScript.sh create mode 100644 src/functions/utilIsExistingFile.sh create mode 100644 src/functions/utilIsReadPropertiesFile.sh create mode 100644 src/gt-completion create mode 100644 src/intro.sh create mode 100644 src/main.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7773828 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +dist/ \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..c143ba0 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Zinovyev Ivan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..e03ff63 --- /dev/null +++ b/README.md @@ -0,0 +1,15 @@ +# gt bash script 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. + +## Changelog + +__0.1__ + +* Created the initial bash script +* Added config functions (for future use) +* Added commands pull, tag, mine, pullAndMerge + +## Sources + +- \ No newline at end of file diff --git a/src/functions/buildCheckBuildSystem.sh b/src/functions/buildCheckBuildSystem.sh new file mode 100644 index 0000000..8135e56 --- /dev/null +++ b/src/functions/buildCheckBuildSystem.sh @@ -0,0 +1,18 @@ +buildCheckBuildSystem() { + if [ -f "package.json" ]; then + BUILD_SYSTEM=$NPM + elif [ -f "gulpfile.js" ]; then + BUILD_SYSTEM=$GULP + elif [ -f "build.gradle" ]; then + BUILD_SYSTEM=$GRADLE + elif [ -f "pom.xml" ]; then + BUILD_SYSTEM=$MAVEN + fi + + # when no build system could be found, print a the help / usage (if not set to ignore) + if [ "$1" != $IGNORE_ERROR ] && [ "$BUILD_SYSTEM" == "" ]; then + echo "Could not find any supported build systems" + echo "" + help + fi +} diff --git a/src/functions/configInit.sh b/src/functions/configInit.sh new file mode 100644 index 0000000..c784541 --- /dev/null +++ b/src/functions/configInit.sh @@ -0,0 +1,28 @@ +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} + 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 +# 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 +) +END + + fi +} diff --git a/src/functions/configPrint.sh b/src/functions/configPrint.sh new file mode 100644 index 0000000..c4ba1ef --- /dev/null +++ b/src/functions/configPrint.sh @@ -0,0 +1,11 @@ +# reads the configuration file where the docker container names are saved +configPrint() { + echo "" + echo "Configuration file:" + cat ${DEV_CONFIG_FILE} | while read line + do + echo "$line" + done + echo "" + echo "Version: $SCRIPT_VERSION" +} diff --git a/src/functions/configRead.sh b/src/functions/configRead.sh new file mode 100644 index 0000000..d9a57b1 --- /dev/null +++ b/src/functions/configRead.sh @@ -0,0 +1,23 @@ +# 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} + 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} + fi +} diff --git a/src/functions/gitPull.sh b/src/functions/gitPull.sh new file mode 100644 index 0000000..9aa3301 --- /dev/null +++ b/src/functions/gitPull.sh @@ -0,0 +1,7 @@ +gitPull() { + if [ -f ".git" ]; then + git pull + else + echo "Seems not to be a git repo" + fi +} diff --git a/src/functions/gitTag.sh b/src/functions/gitTag.sh new file mode 100644 index 0000000..e6955d6 --- /dev/null +++ b/src/functions/gitTag.sh @@ -0,0 +1,17 @@ +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/src/functions/help.sh b/src/functions/help.sh new file mode 100644 index 0000000..e93c457 --- /dev/null +++ b/src/functions/help.sh @@ -0,0 +1,27 @@ +help() { + local progName=$(echo "$0" | rev | cut -d'/' -f1 | rev) + + cat <<-END +$progName is a tool for makeing git easier to use. + +Usage: + $progName [options] + +The options are: + need a param (you can combine like ubd) + 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) + + help ... show this page + +Version: $SCRIPT_VERSION + END + + exit +} diff --git a/src/functions/mine.sh b/src/functions/mine.sh new file mode 100644 index 0000000..32e2a8a --- /dev/null +++ b/src/functions/mine.sh @@ -0,0 +1,13 @@ +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/src/functions/parseArgs.sh b/src/functions/parseArgs.sh new file mode 100644 index 0000000..0cd7012 --- /dev/null +++ b/src/functions/parseArgs.sh @@ -0,0 +1,36 @@ +parseArgs() { + if [ -z "$1" ]; then + help + fi + local setVariable=0 + local variableName="" + + #echo "parsing args" + for var in "$@" + do + #echo "DEBUG - arg[i]: '$var' - setVariable: $setVariable" + if [ "$setVariable" == 0 ]; then + variableName="" + fi + + if [ "$var" == "-h" ] || [ "$var" == "--help" ]; then + help + elif [ $setVariable -gt 0 ]; then + #echo "Setting variables..." + setVariable="$(($setVariable - 1))" + if [ "$variableName" == "tag" ]; then + TAG=$var + #echo "DEBUG - Setting tag to '$var'" + elif [ "$variableName" == "path" ]; then + SOURCE_PATH=$var + #echo "DEBUG - Setting source path to '$var'" + fi + elif [ "$var" == "-p" ] || [ "$var" == "--path" ]; then + setVariable=1 + variableName="path" + elif [ "$var" == "tag" ]; then + setVariable=1 + variableName="tag" + fi + done +} diff --git a/src/functions/parseArgs_mine.sh b/src/functions/parseArgs_mine.sh new file mode 100644 index 0000000..3aec7e8 --- /dev/null +++ b/src/functions/parseArgs_mine.sh @@ -0,0 +1,6 @@ +parseArgs_mine() { + echo "Fetching user: $1" + if [ -n "$1" ]; then + GIT_USER=$1 + fi +} diff --git a/src/functions/parseArgs_pullAndMerge.sh b/src/functions/parseArgs_pullAndMerge.sh new file mode 100644 index 0000000..a287317 --- /dev/null +++ b/src/functions/parseArgs_pullAndMerge.sh @@ -0,0 +1,9 @@ +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/src/functions/preset.sh b/src/functions/preset.sh new file mode 100644 index 0000000..87fcf14 --- /dev/null +++ b/src/functions/preset.sh @@ -0,0 +1,19 @@ +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/src/functions/pullAndMerge.sh b/src/functions/pullAndMerge.sh new file mode 100644 index 0000000..566db86 --- /dev/null +++ b/src/functions/pullAndMerge.sh @@ -0,0 +1,12 @@ +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/src/functions/runScript.sh b/src/functions/runScript.sh new file mode 100644 index 0000000..32dc975 --- /dev/null +++ b/src/functions/runScript.sh @@ -0,0 +1,34 @@ +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/src/functions/utilIsExistingFile.sh b/src/functions/utilIsExistingFile.sh new file mode 100644 index 0000000..9c83a52 --- /dev/null +++ b/src/functions/utilIsExistingFile.sh @@ -0,0 +1,7 @@ +utilIsExistingFile() { + if ls $1 1> /dev/null 2>&1; then + return 0 + else + return 1 + fi +} diff --git a/src/functions/utilIsReadPropertiesFile.sh b/src/functions/utilIsReadPropertiesFile.sh new file mode 100644 index 0000000..539b564 --- /dev/null +++ b/src/functions/utilIsReadPropertiesFile.sh @@ -0,0 +1,21 @@ +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/src/gt-completion b/src/gt-completion new file mode 100644 index 0000000..8a4298f --- /dev/null +++ b/src/gt-completion @@ -0,0 +1,54 @@ +_gt-completion() +{ + local cur prev opts tag help + COMPREPLY=() + cur="${COMP_WORDS[COMP_CWORD]}" + prev="${COMP_WORDS[COMP_CWORD-1]}" + prevPrev="${COMP_WORDS[COMP_CWORD-2]}" + opts="mind pullAndMerge help config" + config="print set init" + + # TODO check if this is still the most efficient way to list help options + HELP_PATH=${BASH_SOURCE%/*}/gt-help + help=${opts} + #help=`ls $HELP_PATH` + + if [[ ${cur} == "help" ]] ; then + createFromString "${help}" + return 0 + elif [[ $COMP_CWORD -gt 1 ]]; then + if [ "$prev" == "tag" ]; then + # no suggestions for tags + return 0 + elif [ "$prev" == "config" ]; then + createFromString "$config" + elif [ "$prevPrev" == "config" ]; then + # no suggestions after config xyz + return 0 + elif [ "$prev" == "--path" ] || [ "$prev" == "-p" ]; then + createFromDirectory "$DOCKER_SERVICES_HOME" + elif [[ $COMP_CWORD -gt 1 ]] && [ "$prev" == "-p" ]; then + createFromDirectory "$DOCKER_SERVICES_HOME" +# elif [[ $COMP_CWORD -gt 1 ]] && [ "$prev" != "desc" ] && [ "$prev" != "year" ]; then +# createFromString "${twoPlus}" + else + createFromString "${opts}" + fi + return 0 + elif [[ $COMP_CWORD -eq 1 ]]; then + createFromString "${opts}" + return 0 + fi +} + +createFromString() { + COMPREPLY=( $(compgen -W "${1}" -- ${cur}) ) +} + +createFromDirectory() { + pushd $1 >/dev/null + COMPREPLY=( $(compgen -o plusdirs -- $cur) ) + popd >/dev/null +} + +complete -F _gt-completion gt diff --git a/src/intro.sh b/src/intro.sh new file mode 100644 index 0000000..5603eee --- /dev/null +++ b/src/intro.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash + +# +# This script is generated. Please do checkout the source code for editing! +# +# This is the main script for easing up Liferay development (inside AND outside a container). +# Source Code: https://code.manhart.space/mmit/gt-bash-script.git +# Maintainer: Manuel Manhart +# Company: Manuel Manhart IT e.U. +# License: Proprietary +# + +# set default constants +SCRIPT_VERSION="0.1" + +#SOURCE_PATH=./ +#BUILD_SYSTEM="" +#GULP="gulp" +#NPM="npm" +#GRADLE="gradle" +#MAVEN="mvn" +#IGNORE_ERROR="IGNORE_ERROR" +CONFIG_FILE_NAME=gt.config +CONFIG_PATH=${HOME}/.config/mmit +CONFIG_FILE=${CONFIG_PATH}/${CONFIG_FILE_NAME} +ACTION=${1:-"help"} diff --git a/src/main.sh b/src/main.sh new file mode 100644 index 0000000..7ea10c5 --- /dev/null +++ b/src/main.sh @@ -0,0 +1,11 @@ +# main +# import colors +if [ -f ${BASH_SOURCE%/*}/define-colors ]; then +. ${BASH_SOURCE%/*}/define-colors "" +fi +# read docker container configuration +configRead +# parse the arguments +parseArgs "$@" +# run the script +runScript "$@"