diff --git a/builder b/builder index 025b170..5fc9887 100644 --- a/builder +++ b/builder @@ -1,5 +1,21 @@ #!/bin/bash +# Copyright (C) 2022 GenZmeY +# mailto: genzmey@gmail.com + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + # Requirements: git-bash # https://git-scm.com/download/win @@ -7,6 +23,15 @@ set -Eeuo pipefail trap cleanup SIGINT SIGTERM ERR EXIT +function reg_readkey () # $1: path, $2: key +{ + cygpath -u "$( + reg query "$1" //v "$2" | \ + grep -F "$2" | \ + awk '{ $1=$2=""; print $0 }' | \ + sed -r 's|^\s*(.+)\s*|\1|g')" +} + # Whoami ScriptFullname=$(readlink -e "$0") ScriptName=$(basename "$0") @@ -54,13 +79,28 @@ KFPublishLocalization="$KFPublish/Localization" MutWsInfo="$KFDoc/wsinfo.txt" KFEditorConfBackup="$KFEditorConf.backup" -function reg_readkey () # $1: path, $2: key -{ - cygpath -u $( - reg query "$1" //v "$2" | \ - grep -F "$2" | \ - awk '{ $1=$2=""; print $0 }' ) -} +# Args +ArgInitBuild="false" +ArgInitTest="false" +ArgCompile="false" +ArgBrew="false" +ArgBrewManual="false" +ArgUpload="false" +ArgTest="false" +ArgVersion="false" +ArgHelp="false" +ArgDebug="false" +ArgQuiet="false" +ArgWarnings="false" +ArgNoColors="false" + +# Colors +RED='' +GRN='' +YLW='' +BLU='' +DEF='' +BLD='' function is_true () # $1: Bool arg to check { @@ -70,11 +110,14 @@ function is_true () # $1: Bool arg to check function get_latest () # $1: Reponame, $2: filename, $3: output filename { local ApiUrl="https://api.github.com/repos/$1/releases/latest" - local LatestTag=$(curl --silent "$ApiUrl" | grep -Po '"tag_name": "\K.*?(?=")') + local LatestTag="" + LatestTag=$(curl --silent "$ApiUrl" | grep -Po '"tag_name": "\K.*?(?=")') local DownloadUrl="https://github.com/$1/releases/download/$LatestTag/$2" + msg "download $2 ($LatestTag)" mkdir -p "$(dirname "$3")/" curl -LJs "$DownloadUrl" -o "$3" + msg "${GRN}successfully downloaded${DEF}" } function get_latest_multini () # $1: file to save @@ -87,42 +130,80 @@ function get_latest_kfeditor_patcher () # $1: file to save get_latest "notpeelz/kfeditor-patcher" "kfeditor_patcher.exe" "$1" } -function show_help () +function setup_colors () { - cat <&2 + fi +} + +function msg () # $1: String +{ + if ! is_true "$ArgQuiet"; then + if is_true "$ArgDebug"; then + echo -e "${BLU}${1-}${DEF}" >&1 + else + echo -e "${DEF}${1-}${DEF}" >&1 + fi + fi +} + +function die () # $1: String, $2: Exit code +{ + err "${1-}" + exit "${2-3}" +} + +function usage () +{ + local HelpMessage="" + + HelpMessage=$(cat < /dev/null) -EOF + msg "${BLD}$ScriptName $(git describe 2> /dev/null)${DEF}" } function cleanup() @@ -133,12 +214,14 @@ function cleanup() function backup_kfeditorconf () { + msg "backup $(basename "$KFEditorConf") to $(basename "$KFEditorConfBackup")" cp -f "$KFEditorConf" "$KFEditorConfBackup" } function restore_kfeditorconf () { if [[ -f "$KFEditorConfBackup" ]]; then + msg "restore $(basename "$KFEditorConf") from backup" mv -f "$KFEditorConfBackup" "$KFEditorConf" fi } @@ -147,6 +230,8 @@ function init_build () { local PackageList="" + msg "creating new build config" + :> "$MutBuildConfig" while read -r Package @@ -158,6 +243,8 @@ function init_build () fi done < <(find "$MutSource" -mindepth 2 -maxdepth 2 -type d -ipath '*/Classes' | sed -r 's|.+/([^/]+)/[^/]+|\1|' | sort) + msg "packages found: $PackageList" + cat > "$MutBuildConfig" < /dev/null - do - ModificationTimeNew="$(stat -c %y "$KFWin64/$2")" - if [[ "$ModificationTime" != "$ModificationTimeNew" ]]; then # wait for write - while ps -p "$PID" &> /dev/null - do - ModificationTime="$ModificationTimeNew" - sleep 1 - ModificationTimeNew="$(stat -c %y "$KFWin64/$2")" - if [[ "$ModificationTime" == "$ModificationTimeNew" ]]; then # wait for write finish - kill "$PID" - rm -f "$KFWin64/$1" # cleanup (auto) - return 0 - fi - done - fi - sleep 1 - done + msg "merge $1 into $2" + + if is_true "$ArgWarnings"; then + CMD //C "cd /D $(cygpath -w "$KFWin64") && $(basename "$KFEditorMergePackages") make $1 $2" + else + ModificationTime=$(stat -c %y "$KFWin64/$2") + CMD //C "cd /D $(cygpath -w "$KFWin64") && $(basename "$KFEditorMergePackages") make $1 $2" & + PID="$!" + while ps -p "$PID" &> /dev/null + do + ModificationTimeNew="$(stat -c %y "$KFWin64/$2")" + if [[ "$ModificationTime" != "$ModificationTimeNew" ]]; then # wait for write + while ps -p "$PID" &> /dev/null + do + ModificationTime="$ModificationTimeNew" + sleep 1 + ModificationTimeNew="$(stat -c %y "$KFWin64/$2")" + if [[ "$ModificationTime" == "$ModificationTimeNew" ]]; then # wait for write finish + kill "$PID" + rm -f "$KFWin64/$1" # cleanup (auto) + return 0 + fi + done + fi + sleep 1 + done + fi rm -f "$KFWin64/$1" # cleanup (manual) } function merge_packages () # $1: Mutator name { + msg "merge packages for $1.u" + cp -f "$KFUnpublishScript/$1.u" "$KFWin64" while read -r Upk @@ -297,13 +393,27 @@ function compile () if is_true "$StripSource"; then StripSourceArg="-stripsource"; fi - CMD //C "$(cygpath -w "$KFEditor") make $StripSourceArg -useunpublished" & - PID="$!" - while ps -p "$PID" &> /dev/null - do - if compiled; then kill "$PID"; break; fi - sleep 1 - done + msg "compilation" + + if is_true "$ArgWarnings"; then + CMD //C "$(cygpath -w "$KFEditor") make $StripSourceArg -useunpublished" + if ! compiled; then + die "compilation failed" + fi + msg "${GRN}successfully compiled${DEF}" + else + CMD //C "$(cygpath -w "$KFEditor") make $StripSourceArg -useunpublished" & + PID="$!" + while ps -p "$PID" &> /dev/null + do + if compiled; then + kill "$PID" + msg "${GRN}successfully compiled${DEF}" + break + fi + sleep 1 + done + fi find "$KFUnpublish" -type d -empty -delete @@ -350,24 +460,38 @@ function brew () { local PID="" + msg "brewing" + read_build_settings if ! compiled ; then - echo "You must compile packages before brewing. Use $0 --compile for this." - exit 1 + die "You must compile packages before brewing. Use --compile option for this." 2 fi rm -rf "$KFPublish" mkdir -p "$KFPublishBrewedPC" - CMD //C "cd /D $(cygpath -w "$KFWin64") && $(basename "$KFEditor") brewcontent -platform=PC $PackageUpload -useunpublished" & - PID="$!" - while ps -p "$PID" &> /dev/null - do - if brewed; then kill "$PID"; break; fi - sleep 1 - done + if is_true "$ArgWarnings"; then + CMD //C "cd /D $(cygpath -w "$KFWin64") && $(basename "$KFEditor") brewcontent -platform=PC $PackageUpload -useunpublished" + if ! brewed; then + brew_cleanup + die "brewing failed" + fi + msg "${GRN}successfully brewed${DEF}" + else + CMD //C "cd /D $(cygpath -w "$KFWin64") && $(basename "$KFEditor") brewcontent -platform=PC $PackageUpload -useunpublished" & + PID="$!" + while ps -p "$PID" &> /dev/null + do + if brewed; then + kill "$PID" + msg "${GRN}successfully brewed${DEF}" + break + fi + sleep 1 + done + fi publish_common brew_cleanup @@ -377,11 +501,12 @@ function brew () function brew_manual () { + msg "manual brewing" + read_build_settings if ! compiled ; then - echo "You must compile packages before brewing. Use $0 --compile for this." - exit 1 + die "You must compile packages before brewing. Use --compile option for this." 2 fi rm -rf "$KFPublish" @@ -392,7 +517,9 @@ function brew_manual () get_latest_kfeditor_patcher "$KFEditorPatcher" fi + msg "patching $(basename "$KFEditor")" CMD //C "cd /D $(cygpath -w "$KFWin64") && $(basename "$KFEditorPatcher")" + msg "${GRN}successfully patched${DEF}" for Package in $PackageUpload do @@ -400,14 +527,17 @@ function brew_manual () mv "$KFWin64/$Package.u" "$KFPublishBrewedPC" done + msg "${GRN}successfully brewed${DEF}" + publish_common find "$KFPublish" -type d -empty -delete } -# Uploading without brewing function publish_unpublished () { + msg "${YLW}warn: uploading without brewing${DEF}" + mkdir -p "$KFPublishBrewedPC" "$KFPublishScript" "$KFPublishPackages" for Package in $PackageUpload @@ -428,8 +558,7 @@ function upload () read_build_settings if ! compiled ; then - echo "You must compile packages before uploading. Use $0 --compile for this." - exit 1 + die "You must compile packages before uploading. Use --compile option for this." 2 fi if ! [[ -d "$KFPublish" ]]; then @@ -451,7 +580,13 @@ EOF cp -rf "$KFPublish" "$PreparedWsDir" - CMD //C "$(cygpath -w "$KFWorkshop") $(basename "$MutWsInfo")" + msg "upload to steam workshop" + if is_true "$ArgQuiet"; then + CMD //C "$(cygpath -w "$KFWorkshop") $(basename "$MutWsInfo")" &>/dev/null + else + CMD //C "$(cygpath -w "$KFWorkshop") $(basename "$MutWsInfo")" + fi + msg "${GRN}successfully uploaded to steam workshop${DEF}" rm -rf "$PreparedWsDir" rm -f "$MutWsInfo" @@ -462,6 +597,8 @@ function init_test () local AviableMutators="" local AviableGamemodes="" + msg "creating new test config" + read_build_settings for Package in $PackageUpload @@ -487,8 +624,14 @@ function init_test () done < <(grep -rihPo '\s.+extends\sKFGameInfo_' "$MutSource/$Package" | awk '{ print $1 }') done + if [[ -n "$AviableMutators" ]]; then + msg "mutators found: $AviableMutators" + fi + if [[ -z "$AviableGamemodes" ]]; then AviableGamemodes="KFGameContent.KFGameInfo_Survival" + else + msg "custom gamemodes found: $AviableGamemodes" fi cat > "$MutTestConfig" <