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" <