diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 372cae8b..4e61ea6a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,6 +2,7 @@ name: CI on: [push, pull_request] + jobs: build: @@ -9,7 +10,7 @@ jobs: strategy: matrix: - java: [11, 8] + java: [11, 8, 14] steps: - uses: actions/checkout@v2 @@ -17,30 +18,34 @@ jobs: uses: actions/setup-java@v1.3.0 with: java-version: ${{ matrix.java }} - - - uses: actions/cache@v1.1.2 + - name: Pull Maven Cache + uses: actions/cache@v1.1.2 + id: maven-cache with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} restore-keys: ${{ runner.os }}-maven- - + - uses: s4u/maven-settings-action@v2.1.0 + name: Use ${{ matrix.java }} as the java target + with: + properties: '[{"maven.compiler.target": "${{ matrix.java }}"}]' + - name: Setup YAPFA Project + run: | + git submodule update --init --recursive -f + git config --global user.email "ci@github.com" + git config --global user.name "Github CI" + sudo chmod -R -f 777 scripts + - name: Build Maven Depends + if: steps.maven-cache.outputs.cache-hit != 'true' + run: | + cd Tuinity + ./tuinity jar + cd ..// - name: Build YAPFA run: | - git submodule init - git submodule update --init --recursive - git config --global user.email "ci@github.com" - git config --global user.name "Github CI" - yapfaDir=`pwd` - ./patchPaper.sh - cd Tuinity - mvn -N install - ./tuinity patch - cd $yapfaDir - ./yapfa patch - ./yapfa build - ./yapfa paperclip + ./yapfa full - name: Upload Artifact uses: actions/upload-artifact@v2-preview with: name: YAPFA-${{ matrix.java }} - path: yapfa-paperclip.jar + path: target/YAPFA-1.16.1-paperclip.jar diff --git a/.gitignore b/.gitignore index 9a84b756..d4d774c4 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,5 @@ mc-dev .project .idea yapfa-paperclip.jar + +target/site/surefire-report.html diff --git a/.gitmodules b/.gitmodules index 73179f45..85c6a88e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,4 @@ [submodule "Tuinity"] path = Tuinity - url = https://github.com/Spottedleaf/Tuinity + url = https://github.com/tsao-chi/Tuinity-autoupstreamupdate.git + branch = ver/1.16 diff --git a/README.md b/README.md index dc67a292..630da26e 100644 --- a/README.md +++ b/README.md @@ -47,11 +47,8 @@ ## Building and setting up Run the following commands in the root directory: ``` -git submodule init -git submodule update -./fetchUpstream.sh -./yapfa build -./yapfa paperclip +git submodule update --init --recursive --force +./yapfa jar ``` ## LICENSE @@ -61,4 +58,4 @@ ## LICENSE See [EMC](https://github.com/starlis/empirecraft), [Lithium](https://github.com/jellysquid3/lithium-fabric), [Akarin](https://github.com/Akarin-project/Akarin), [Purpur](https://github.com/pl3xgaming/Purpur) and [Tuinity](https://github.com/Spottedleaf/Tuinity) for the license of material used/modified by this project. -**By using this project you accept the Mojang EULA! Starting the server-jar requires that you have read and accepted the EULA because of [this patch](https://github.com/tr7zw/YAPFA/blob/master/patches/server/0017-EMC-Accept-the-EULA.patch)!** \ No newline at end of file +**By using this project you accept the Mojang EULA! Starting the server-jar requires that you have read and accepted the EULA because of [this patch](https://github.com/tr7zw/YAPFA/blob/master/patches/server/0017-EMC-Accept-the-EULA.patch)!** diff --git a/current-tuinity b/current-tuinity index dace6a38..c40c2296 100644 --- a/current-tuinity +++ b/current-tuinity @@ -1 +1 @@ -1.15.2--055421230a1bb70eefcf15d57ad8551e1e9d47b1 +1.16.1--8c602452d2ded22cb7322c41de5c78395b5f1348 \ No newline at end of file diff --git a/fetchUpstream.sh b/fetchUpstream.sh deleted file mode 100644 index 3a7e3213..00000000 --- a/fetchUpstream.sh +++ /dev/null @@ -1,12 +0,0 @@ -cd Tuinity -git clean -fx -git clean -fd -git fetch -git reset --hard origin/ver/1.16 -git submodule update --init --recursive -f -cd .. -sh patchPaper.sh -cd Tuinity -./tuinity paperclip -cd .. -./yapfa patch \ No newline at end of file diff --git a/patchPaper.sh b/patchPaper.sh deleted file mode 100755 index 2183b818..00000000 --- a/patchPaper.sh +++ /dev/null @@ -1 +0,0 @@ -cp -f ./scripts/importmcdev_paper.sh ./Tuinity/Paper/scripts/importmcdev.sh \ No newline at end of file diff --git a/scripts/apply.sh b/scripts/apply.sh deleted file mode 100755 index 0682a3a7..00000000 --- a/scripts/apply.sh +++ /dev/null @@ -1,79 +0,0 @@ -#!/bin/bash -# get base dir regardless of execution location -SOURCE="${BASH_SOURCE[0]}" -while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink - DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" - SOURCE="$(readlink "$SOURCE")" - [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located -done -. $(dirname $SOURCE)/init.sh -PS1="$" - -tuinityVer=$(cat current-tuinity) -gpgsign="$(git config commit.gpgsign || echo "false")" - -echo "Rebuilding Forked projects.... " -function applyPatch { - what=$1 - what_name=$(basename $what) - target=$2 - branch=$3 - patch_folder=$4 - - cd "$basedir/$what" - git fetch --all - git branch -f upstream "$branch" >/dev/null - - cd "$basedir" - if [ ! -d "$basedir/$target" ]; then - mkdir "$basedir/$target" - cd "$basedir/$target" - git init - git remote add origin $5 - cd "$basedir" - fi - cd "$basedir/$target" - - # Disable GPG signing before AM, slows things down and doesn't play nicely. - # There is also zero rational or logical reason to do so for these sub-repo AMs. - # Calm down kids, it's re-enabled (if needed) immediately after, pass or fail. - git config commit.gpgsign false - - echo "Resetting $target to $what_name..." - git remote rm upstream > /dev/null 2>&1 - git remote add upstream $basedir/$what >/dev/null 2>&1 - (git am --abort ; git rebase --abort) 1>&2 2>/dev/null || true - git checkout master 2>/dev/null - git fetch upstream >/dev/null 2>&1 - git reset --hard upstream/upstream - echo " Applying patches to $target..." - statusfile=".git/patch-apply-failed" - rm -f "$statusfile" - git am --abort >/dev/null 2>&1 - git am --3way --ignore-whitespace "$basedir/patches/$patch_folder/"*.patch - if [ "$?" != "0" ]; then - echo 1 > "$statusfile" - echo " Something did not apply cleanly to $target." - echo " Please review above details and finish the apply then" - echo " save the changes with rebuildPatches.sh" - exit 1 - else - rm -f "$statusfile" - echo " Patches applied cleanly to $target" - fi -} -function enableCommitSigningIfNeeded { - if [[ "$gpgsign" == "true" ]]; then - git config commit.gpgsign true - fi -} - -( - (applyPatch Tuinity/Tuinity-API ${FORK_NAME}-API HEAD api $API_REPO && - applyPatch Tuinity/Tuinity-Server ${FORK_NAME}-Server HEAD server $SERVER_REPO) || exit 1 - enableCommitSigningIfNeeded -) || ( - echo "Failed to apply patches" - enableCommitSigningIfNeeded - exit 1 -) || exit 1 diff --git a/scripts/applyPatches.sh b/scripts/applyPatches.sh new file mode 100644 index 00000000..7bf957f5 --- /dev/null +++ b/scripts/applyPatches.sh @@ -0,0 +1,95 @@ +#!/usr/bin/env bash + +# SCRIPT HEADER start +basedir=$1 +source "$basedir/scripts/functions.sh" +echo " " +echo "----------------------------------------" +echo " $(bashcolor 1 32)Task$(bashcolorend) - Apply Patches" +echo " This will apply all of YAPFA patches on top of the Paper." +echo " " +echo " $(bashcolor 1 32)Subtask:$(bashcolorend)" +echo " - Import Sources" +echo " " +echo " $(bashcolor 1 32)Modules:$(bashcolorend)" +echo " - $(bashcolor 1 32)1$(bashcolorend) : API" +echo " - $(bashcolor 1 32)2$(bashcolorend) : Server" +echo "----------------------------------------" +# SCRIPT HEADER end + +needimport=$2 + +function applyPatch { + baseproject=$1 + basename=$(basename $baseproject) + target=$2 + branch=$3 + patch_folder=$4 + + # Skip if that software have no patch + haspatch=-f "$basedir/patches/$patch_folder/"*.patch >/dev/null 2>&1 # too many files + if [ ! haspatch ]; then + echo " $(bashcolor 1 33)($5/$6) Skipped$(bashcolorend) - No patch found for $target under patches/$patch_folder" + return + fi + + echo " $(bashcolor 1 32)($5/$6)$(bashcolorend) - Setup upstream project.." + cd "$basedir/$baseproject" + $gitcmd fetch --all &> /dev/null + # Create the upstream branch in Paper project with current state + $gitcmd checkout master >/dev/null 2>&1 # possibly already in + $gitcmd branch -D upstream &> /dev/null + $gitcmd branch -f upstream "$branch" &> /dev/null && $gitcmd checkout upstream &> /dev/null + + if [[ $needimport != "1" ]]; then + if [ $baseproject != "Paper/Paper-API" ]; then + echo " $(bashcolor 1 32)($5/$6)$(bashcolorend) - Import new introduced NMS files.." + basedir && $scriptdir/importSources.sh $basedir 1 || exit 1 + fi + fi + + basedir + # Create source project dirs + if [ ! -d "$basedir/$target" ]; then + mkdir "$basedir/$target" + cd "$basedir/$target" + # $gitcmd remote add origin "$5" + fi + cd "$basedir/$target" + $gitcmd init > /dev/null 2>&1 + + echo " " + echo " $(bashcolor 1 32)($5/$6)$(bashcolorend) - Reset $target to $basename.." + # Add the generated Paper project as the upstream remote of subproject + $gitcmd remote rm upstream &> /dev/null + $gitcmd remote add upstream "$basedir/$baseproject" &> /dev/null + # Ensure that we are in the branch we want so not overriding things + $gitcmd checkout master &> /dev/null || $gitcmd checkout -b master &> /dev/null + $gitcmd fetch upstream &> /dev/null + # Reset our source project to Paper + cd "$basedir/$target" && $gitcmd reset --hard upstream/upstream &> /dev/null + echo " " + + echo " $(bashcolor 1 32)($5/$6)$(bashcolorend) - Apply patches to $target.." + # Abort previous applying operation + $gitcmd am --abort >/dev/null 2>&1 + # Apply our patches on top Paper in our dirs + $gitcmd am --no-utf8 --3way --ignore-whitespace "$basedir/patches/$patch_folder/"*.patch + + if [ "$?" != "0" ]; then + echo " Something did not apply cleanly to $target." + echo " Please review above details and finish the apply then" + echo " save the changes with rebuildPatches.sh" + echo " or use 'git am --abort' to cancel this applying." + echo " $(bashcolor 1 33)($5/$6) Suspended$(bashcolorend) - Resolve the conflict or abort the apply" + echo " " + cd "$basedir/$target" + exit 1 + else + echo " $(bashcolor 1 32)($6/$6) Succeed$(bashcolorend) - Patches applied cleanly to $target" + echo " " + fi +} + +(applyPatch Tuinity/Tuinity-API ${FORK_NAME}-API HEAD api $API_REPO 0 2 && +applyPatch Tuinity/Tuinity-Server ${FORK_NAME}-Server HEAD server $SERVER_REPO 1 2) || exit 1 diff --git a/scripts/commitUpstream.sh b/scripts/commitUpstream.sh new file mode 100644 index 00000000..74752c7f --- /dev/null +++ b/scripts/commitUpstream.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash + +echo "[YAPFA] State: Commit Upstream" + +( +set -e + +function changeLog() { + base=$(git ls-tree HEAD $1 | cut -d' ' -f3 | cut -f1) + cd $1 && git log --oneline ${base}...HEAD +} +paper=$(changeLog Tuinity) + +updated="" +logsuffix="" +if [ ! -z "$paper" ]; then + logsuffix="$logsuffix\nTuinity Changes:\n$paper" + if [ -z "$updated" ]; then updated="Tuinity"; else updated="$updated/Tuinity"; fi +fi +disclaimer="Upstream has released updates that appears to apply and compile correctly" + +if [ ! -z "$1" ]; then + disclaimer="$@" +fi + +log="Updated Upstream ($updated)\n\n${disclaimer}${logsuffix}" + +echo -e "$log" | git commit -F - + +) || exit 1 diff --git a/scripts/commitup.sh b/scripts/commitup.sh deleted file mode 100755 index 8919502c..00000000 --- a/scripts/commitup.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env bash -( -set -e -PS1="$" - -function changelog() { - base=$(git ls-tree HEAD $1 | cut -d' ' -f3 | cut -f1) - cd $1 && git log --oneline ${base}...HEAD -} -tuinity=$(changelog Tuinity) - -log="Updated Tuinity \n\nUpdating our baseline Tuinity reference\n\nTuinity changes since last:\n$tuinity" - -echo -e "$log" | git commit -F - - -) || exit 1 diff --git a/scripts/fetchUpstream.sh b/scripts/fetchUpstream.sh new file mode 100644 index 00000000..e2427d87 --- /dev/null +++ b/scripts/fetchUpstream.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +cd $1 +cd Tuinity +git clean -fx +git clean -fd +git fetch +git reset --hard origin/ver/1.16 +git submodule update --init --recursive -f \ No newline at end of file diff --git a/scripts/functions.sh b/scripts/functions.sh new file mode 100644 index 00000000..4e9dd5f3 --- /dev/null +++ b/scripts/functions.sh @@ -0,0 +1,131 @@ +#!/usr/bin/env bash +# CONFIG set +FORK_NAME="YAPFA" +API_REPO="" +SERVER_REPO="" +PAPER_API_REPO="" +PAPER_SERVER_REPO="" +MCDEV_REPO="" + +# Added Multithreading to builds +# By JosephWorks +mvncmd="mvn -T 1.5C" + +gitcmd="git -c commit.gpgsign=false -c core.quotepath=false -c core.safecrlf=false -c i18n.commit.encoding=UTF-8 -c i18n.logoutputencoding=UTF-8" + +# DIR configure +# resolve shell-specifics +case "$(echo "$SHELL" | sed -E 's|/usr(/local)?||g')" in + "/bin/zsh") + RCPATH="$HOME/.zshrc" + SOURCE="${BASH_SOURCE[0]:-${(%):-%N}}" + ;; + *) + RCPATH="$HOME/.bashrc" + if [[ -f "$HOME/.bash_aliases" ]]; then + RCPATH="$HOME/.bash_aliases" + fi + SOURCE="${BASH_SOURCE[0]}" + ;; +esac + +while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink + DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" + SOURCE="$(readlink "$SOURCE")" + [[ "$SOURCE" != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located +done +SOURCE=$([[ "$SOURCE" = /* ]] && echo "$SOURCE" || echo "$PWD/${SOURCE#./}") +scriptdir=$(dirname "$SOURCE") +basedir=$(dirname "$scriptdir") + +function basedir { + cd "$basedir" +} + +function paperdir { + cd "$basedir/Tuinity" +} + +gitcmd() { + $gitcmd "$@" +} + +# COLOUR functions +color() { + if [ $2 ]; then + echo -e "\e[$1;$2m" + else + echo -e "\e[$1m" + fi +} + +colorend() { + echo -e "\e[m" +} + +function bashcolor { + if [ $2 ]; then + echo -e "\e[$1;$2m" + else + echo -e "\e[$1m" + fi +} + +function bashcolorend { + echo -e "\e[m" +} + +# GIT functions +gitstash() { + STASHED=$($gitcmd stash 2>/dev/null|| return 0) # errors are ok +} + +gitunstash() { + if [[ "$STASHED" != "No local changes to save" ]] ; then + $gitcmd stash pop 2>/dev/null|| return 0 # errors are ok + fi +} + +function gethead { + basedir + git log -1 --oneline +} + +function gitpush { + if [ "$(git config minecraft.push-${FORK_NAME})" == "1" ]; then + echo "Push - $1 ($3) to $2" + ( + basedir + git remote rm script-push > /dev/null 2>&1 + git remote add script-push $2 >/dev/null 2>&1 + git push script-push $3 -f + ) + fi +} + +# PATCH functions +function cleanupPatches { + cd "$1" + for patch in *.patch; do + gitver=$(tail -n 2 $patch | grep -ve "^$" | tail -n 1) + diffs=$(git diff --staged $patch | grep -E "^(\+|\-)" | grep -Ev "(From [a-z0-9]{32,}|\-\-\- a|\+\+\+ b|.index|Date\: )") + + testver=$(echo "$diffs" | tail -n 2 | grep -ve "^$" | tail -n 1 | grep "$gitver") + if [ "x$testver" != "x" ]; then + diffs=$(echo "$diffs" | tail -n +3) + fi + + if [ "x$diffs" == "x" ] ; then + git reset HEAD $patch >/dev/null + git checkout -- $patch >/dev/null + fi + done +} + +function containsElement { + local e + for e in "${@:2}"; do + [[ "$e" == "$1" ]] && return 0; + done + return 1 +} diff --git a/scripts/generateImports.sh b/scripts/generateImports.sh new file mode 100644 index 00000000..eedf840f --- /dev/null +++ b/scripts/generateImports.sh @@ -0,0 +1,46 @@ +#!/usr/bin/env bash + +echo "[YAPFA] State: Generate Imports" + +# For a description of this script, see updateUpstream.sh. + +# get base dir regardless of execution location +basedir=$1 + +source "$basedir/scripts/functions.sh" + +paperworkdir="$basedir/Tuinity/Paper/work" +minecraftversion=$(cat $paperworkdir/BuildData/info.json | grep minecraftVersion | cut -d '"' -f 4) +decompile="$paperworkdir/Minecraft/$minecraftversion/spigot" + +# create dev dir +basedir +mkdir -p mc-dev/src/net/minecraft/server +cd mc-dev + +# prepare to push +if [ ! -d ".git" ]; then + $gitcmd init +fi + +# reset dev files to raw nms in spigot naming +rm src/net/minecraft/server/*.java +cp $decompile/net/minecraft/server/*.java src/net/minecraft/server + +# diff and only preserve new added files +paperserver="$basedir/Tuinity/Tuinity-Server/src/main/java/net/minecraft/server" +cd $basedir/mc-dev/src/net/minecraft/server/ + +for file in $(/bin/ls $paperserver) +do + if [ -f "$file" ]; then + rm -f "$file" + fi +done + +# push the dev project +cd $basedir/mc-dev +$gitcmd add . -A +$gitcmd commit . -m "YAPFA-base" +$gitcmd tag -a "YAPFA-base" -m "YAPFA-base" 2>/dev/null +# gitpush . $MCDEV_REPO $paperVer diff --git a/scripts/generatesources.sh b/scripts/generatesources.sh deleted file mode 100755 index 2eae5c94..00000000 --- a/scripts/generatesources.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash - -SOURCE="${BASH_SOURCE[0]}" -while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink - DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" - SOURCE="$(readlink "$SOURCE")" - [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located -done -. $(dirname $SOURCE)/init.sh - - -cd $basedir -tuinityVer=$(cat current-tuinity) - -minecraftversion=$(cat $basedir/Tuinity/work/BuildData/info.json | grep minecraftVersion | cut -d '"' -f 4) -decompile="Tuinity/work/Minecraft/$minecraftversion/spigot" - -mkdir -p mc-dev/src/net/minecraft/server - -cd mc-dev -if [ ! -d ".git" ]; then - git init -fi - -rm src/net/minecraft/server/*.java -for i in $basedir/$decompile/net/minecraft/server/*.java; -do - cp "$i" src/net/minecraft/server -done - - -base="$basedir/Tuinity/Tuinity-Server/src/main/java/net/minecraft/server" -cd $basedir/mc-dev/src/net/minecraft/server/ -for file in $(/bin/ls $base) -do - if [ -f "$file" ]; then - rm -f "$file" - fi -done -cd $basedir/mc-dev -git add . -A -git commit . -m "mc-dev" -git tag -a "$tuinityVer" -m "$tuinityVer" 2>/dev/null diff --git a/scripts/importSources.sh b/scripts/importSources.sh new file mode 100644 index 00000000..2037a32e --- /dev/null +++ b/scripts/importSources.sh @@ -0,0 +1,140 @@ +#!/usr/bin/env bash + +maintask=$2 +if [[ $maintask == "0" ]]; then + TASKTITLE="Import Sources" +else + TASKTITLE="Import Sources (Subtask)" +fi + +# SCRIPT HEADER start +basedir=$1 +source "$basedir/scripts/functions.sh" +echo " " +echo "----------------------------------------" +echo " $(bashcolor 1 32)Task$(bashcolorend) - $TASKTITLE" +echo " This will import unimported newly added/mod sources to Paper workspace" +echo "----------------------------------------" +# SCRIPT HEADER end + +# For a description of this script, see updateUpstream.sh. +paperworkdir="$basedir/Tuinity/Paper/work" +paperserverdir="$basedir/Tuinity/Tuinity-Server" +papersrcdir="$paperserverdir/src/main/java" +papernmsdir="$papersrcdir/net/minecraft/server" + +( + # fast-fail if Paper not set + if [ ! -d "$papernmsdir" ]; then + echo " $(bashcolor 1 31)Exception$(bashcolorend) - Paper sources not generated, run updateUpstream.sh to setup." + exit 1 + fi +) + +minecraftversion=$(cat "$basedir"/Tuinity/Paper/work/BuildData/info.json | grep minecraftVersion | cut -d '"' -f 4) +decompiledir=$paperworkdir/Minecraft/$minecraftversion/spigot + +nms="net/minecraft/server" +export IMPORT_LOG="" # for commit message, list all files and source for libs +basedir + +function importToPaperWorkspace { + if [ -f "$papernmsdir/$1.java" ]; then + # echo " $(bashcolor 1 33)Skipped$(bashcolorend) - Already imported $1.java" + return 0 + fi + + file="$1.java" + target="$papernmsdir/$file" + base="$decompiledir/$nms/$file" + + if [[ ! -f "$target" ]]; then + export IMPORT_LOG="$IMPORT_LOG Import: $file\n"; + echo "Import: $file" + cp "$base" "$target" + fi +} + +function importLibraryToPaperWorkspace { + group=$1 + lib=$2 + prefix=$3 + shift 3 + for file in "$@"; do + file="$prefix/$file" + target="$papersrcdir/$file" + targetdir=$(dirname "$target") + mkdir -p "${targetdir}" + + base="$paperworkdir/Minecraft/$minecraftversion/libraries/${group}/${lib}/$file" + if [ ! -f "$base" ]; then + echo " $(bashcolor 1 31)Exception$(bashcolorend) - Cannot find file $file.java of lib $lib in group $group to import, re-decomplie or remove the import." + exit 1 + fi + + export IMPORT_LOG="$IMPORT_LOG Import: $file from lib $lib\n"; + echo "Import: $file ($lib)" + sed 's/\r$//' "$base" > "$target" || exit 1 + done +} + +( + # Reset to last NORMAL commit if already have imported before + cd "$paperserverdir" + lastcommit=$(git log -1 --pretty=oneline --abbrev-commit) + if [[ "$lastcommit" = *"Extra dev imports of YAPFA"* ]]; then + git reset --hard HEAD^ + fi +) + +# Filter and import every files which have patch to modify +patchedFiles=$(cat patches/server/* | grep "+++ b/src/main/java/net/minecraft/server/" | sort | uniq | sed 's/\+\+\+ b\/src\/main\/java\/net\/minecraft\/server\///g' | sed 's/.java//g') + +patchedFilesNonNMS=$(cat patches/server/* | grep "create mode " | grep -Po "src/main/java/net/minecraft/server/(.*?).java" | sort | uniq | sed 's/src\/main\/java\/net\/minecraft\/server\///g' | sed 's/.java//g') + +( + cd "$paperserverdir" + $gitcmd fetch --all &> /dev/null + # Create the upstream branch in Paper project with current state + $gitcmd checkout master >/dev/null 2>&1 # possibly already in + $gitcmd branch -D upstream &>/dev/null + $gitcmd branch -f upstream HEAD && $gitcmd checkout upstream +) + +basedir +for f in $patchedFiles; do + containsElement "$f" ${patchedFilesNonNMS[@]} + if [ "$?" == "1" ]; then + if [ ! -f "$papersrcdir/$nms/$f.java" ]; then + if [ ! -f "$decompiledir/$nms/$f.java" ]; then + echo " $(bashcolor 1 31)Exception$(bashcolorend) - Cannot find NMS file $f.java to import, re-decomplie or remove the import." + exit 1 + else + importToPaperWorkspace $f + fi + fi + fi +done + +# NMS import format: +# importToPaperWorkspace MinecraftServer +importToPaperWorkspace PistonExtendsChecker +importToPaperWorkspace EnumDirection +# Library import format (multiple files are supported): +# importLibraryToPaperWorkspace com.mojang datafixerupper com/mojang/datafixers/util Either.java +importLibraryToPaperWorkspace com.mojang authlib com/mojang/authlib yggdrasil/YggdrasilGameProfileRepository.java +importLibraryToPaperWorkspace com.mojang datafixerupper com/mojang/datafixers/util Either.java +# Submit imports by commit with file descriptions +( + cd "$paperserverdir" + # rm -rf nms-patches + git add . &> /dev/null + echo -e "Extra dev imports of YAPFA\n\n$IMPORT_LOG" | git commit src -F - &> /dev/null + echo " $(bashcolor 1 32)Succeed$(bashcolorend) - Sources have been imported to Paper/Paper-Server (branch upstream)" + + if [[ $maintask != "0" ]]; then # this is magical + echo "----------------------------------------" + echo " Subtask finished" + echo "----------------------------------------" + fi +) diff --git a/scripts/importmcdev_paper.sh b/scripts/importmcdev_paper.sh deleted file mode 100755 index 9b2e567c..00000000 --- a/scripts/importmcdev_paper.sh +++ /dev/null @@ -1,122 +0,0 @@ -#!/usr/bin/env bash - -( -set -e -nms="net/minecraft/server" -export MODLOG="" -PS1="$" -basedir="$(cd "$1" && pwd -P)" -source "$basedir/scripts/functions.sh" -gitcmd="git -c commit.gpgsign=false" - -workdir="$basedir/work" -minecraftversion=$(cat "$workdir/BuildData/info.json" | grep minecraftVersion | cut -d '"' -f 4) -decompiledir="$workdir/Minecraft/$minecraftversion/forge" -# replace for now -decompiledir="$workdir/Minecraft/$minecraftversion/spigot" -export importedmcdev="" -function import { - export importedmcdev="$importedmcdev $1" - file="${1}.java" - target="$workdir/Spigot/Spigot-Server/src/main/java/$nms/$file" - base="$decompiledir/$nms/$file" - - if [[ ! -f "$target" ]]; then - export MODLOG="$MODLOG Imported $file from mc-dev\n"; - #echo "Copying $base to $target" - cp "$base" "$target" || exit 1 - else - echo "UN-NEEDED IMPORT: $file" - fi -} - -function importLibrary { - group=$1 - lib=$2 - prefix=$3 - shift 3 - for file in "$@"; do - file="$prefix/$file" - target="$workdir/Spigot/Spigot-Server/src/main/java/${file}" - targetdir=$(dirname "$target") - mkdir -p "${targetdir}" - base="$workdir/Minecraft/$minecraftversion/libraries/${group}/${lib}/$file" - if [ ! -f "$base" ]; then - echo "Missing $base" - exit 1 - fi - export MODLOG="$MODLOG Imported $file from $lib\n"; - sed 's/\r$//' "$base" > "$target" || exit 1 - done -} - -( - cd "$workdir/Spigot/Spigot-Server/" - lastlog=$($gitcmd log -1 --oneline) - if [[ "$lastlog" = *"mc-dev Imports"* ]]; then - $gitcmd reset --hard HEAD^ - fi -) - - - -files=$(cat "$basedir/Spigot-Server-Patches/"* | grep "+++ b/src/main/java/net/minecraft/server/" | sort | uniq | sed 's/\+\+\+ b\/src\/main\/java\/net\/minecraft\/server\///g' | sed 's/.java//g') - -nonnms=$(grep -R "new file mode" -B 1 "$basedir/Spigot-Server-Patches/" | grep -v "new file mode" | grep -oE "net\/minecraft\/server\/.*.java" | grep -oE "[A-Za-z]+?.java$" --color=none | sed 's/.java//g') -function containsElement { - local e - for e in "${@:2}"; do - [[ "$e" == "$1" ]] && return 0; - done - return 1 -} -set +e -for f in $files; do - containsElement "$f" ${nonnms[@]} - if [ "$?" == "1" ]; then - if [ ! -f "$workdir/Spigot/Spigot-Server/src/main/java/net/minecraft/server/$f.java" ]; then - if [ ! -f "$decompiledir/$nms/$f.java" ]; then - echo "$(color 1 31) ERROR!!! Missing NMS$(color 1 34) $f $(colorend)"; - else - import $f - fi - fi - fi -done - -######################################################## -######################################################## -######################################################## -# NMS IMPORTS -# Temporarily add new NMS dev imports here before you run paper patch -# but after you have paper rb'd your changes, remove the line from this file before committing. -# we do not need any lines added to this file for NMS - -import PistonExtendsChecker -import EnumDirection -#import EnumAxisCycle # doesn't compile without fixes, copied into patch -# import TileEntityPiston # doesn't compile without fixes, copied into patch - - - -######################################################## -######################################################## -######################################################## -# LIBRARY IMPORTS -# These must always be mapped manually, no automatic stuff -# -# # group # lib # prefix # many files - -# dont forget \ at end of each line but last -importLibrary com.mojang authlib com/mojang/authlib yggdrasil/YggdrasilGameProfileRepository.java -importLibrary com.mojang datafixerupper com/mojang/datafixers/util Either.java - -######################################################## -######################################################## -######################################################## -set -e -cd "$workdir/Spigot/Spigot-Server/" -rm -rf nms-patches applyPatches.sh makePatches.sh >/dev/null 2>&1 -$gitcmd add . -A >/dev/null 2>&1 -echo -e "mc-dev Imports\n\n$MODLOG" | $gitcmd commit . -F - -) diff --git a/scripts/init.sh b/scripts/init.sh deleted file mode 100755 index a781f3dc..00000000 --- a/scripts/init.sh +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/bash -sourceBase=$(dirname $SOURCE)/../ -cd "${basedir:-$sourceBase}" - -basedir=$(pwd -P) -cd - - -FORK_NAME="YAPFA" - -function bashColor { -if [ $2 ]; then - echo -e "\e[$1;$2m" -else - echo -e "\e[$1m" -fi -} -function bashColorReset { - echo -e "\e[m" -} - -function cleanupPatches { - cd "$1" - for patch in *.patch; do - gitver=$(tail -n 2 $patch | grep -ve "^$" | tail -n 1) - diffs=$(git diff --staged $patch | grep -E "^(\+|\-)" | grep -Ev "(From [a-z0-9]{32,}|\-\-\- a|\+\+\+ b|.index|Date\: )") - - testver=$(echo "$diffs" | tail -n 2 | grep -ve "^$" | tail -n 1 | grep "$gitver") - if [ "x$testver" != "x" ]; then - diffs=$(echo "$diffs" | tail -n +3) - fi - - if [ "x$diffs" == "x" ] ; then - git reset HEAD $patch >/dev/null - git checkout -- $patch >/dev/null - fi - done -} -function basedir { - cd "$basedir" -} -function gethead { - ( - cd "$1" - git log -1 --oneline - ) -} diff --git a/scripts/installLauncher.sh b/scripts/installLauncher.sh new file mode 100644 index 00000000..1d06e950 --- /dev/null +++ b/scripts/installLauncher.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash + +# SCRIPT HEADER start +basedir=$1 +source "$basedir/scripts/functions.sh" +echo " " +echo "----------------------------------------" +echo " $(bashcolor 1 32)Task$(bashcolorend) - Install Launcher" +echo " This will build a launcher that similar to Paperclip by the server jar." +echo " " +echo "----------------------------------------" +# SCRIPT HEADER end + +# Copied from https://github.com/PaperMC/Paper/blob/d54ce6c17fb7a35238d6b9f734d30a4289886773/scripts/paperclip.sh +# License from Paper applies to this file + +set -e +paperworkdir="$basedir/Tuinity/Paper/work" +mcver=$(cat "$paperworkdir/BuildData/info.json" | grep minecraftVersion | cut -d '"' -f 4) +serverjar="$basedir/YAPFA-Server/target/yapfa-$mcver.jar" +vanillajar="$paperworkdir/Minecraft/$mcver/$mcver.jar" + +( + cd "$paperworkdir/Paperclip" + mvn clean package "-Dmcver=$mcver" "-Dpaperjar=$serverjar" "-Dvanillajar=$vanillajar" +) +mkdir -p "$basedir/target" +cp "$paperworkdir/Paperclip/assembly/target/paperclip-${mcver}.jar" "$basedir/target/YAPFA-${mcver}-paperclip.jar" + +echo "" +echo " $(bashcolor 1 32)Success$(bashcolorend) - Saved launcher jar to target/YAPFA-${mcver}-launcher.jar" diff --git a/scripts/paperclip.sh b/scripts/paperclip.sh deleted file mode 100755 index 8622dfe2..00000000 --- a/scripts/paperclip.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env bash - -# Copied from https://github.com/PaperMC/Paper/blob/d54ce6c17fb7a35238d6b9f734d30a4289886773/scripts/paperclip.sh -# License from Paper applies to this file - -( -set -e -basedir="$(cd "$1" && pwd -P)" -workdir="$basedir/Tuinity/Paper/work" -mcver=$(cat "$workdir/BuildData/info.json" | grep minecraftVersion | cut -d '"' -f 4) -paperjar="$basedir/YAPFA-Server/target/yapfa-$mcver.jar" -vanillajar="$workdir/Minecraft/$mcver/$mcver.jar" - -( - cd "$workdir/Paperclip" - mvn clean package "-Dmcver=$mcver" "-Dpaperjar=$paperjar" "-Dvanillajar=$vanillajar" -) -cp "$workdir/Paperclip/assembly/target/paperclip-${mcver}.jar" "$basedir/yapfa-paperclip.jar" - -echo "" -echo "" -echo "" -echo "Build success!" -echo "Copied final jar to $(cd "$basedir" && pwd -P)/yapfa-paperclip.jar" -) || exit 1 diff --git a/scripts/push.sh b/scripts/push.sh deleted file mode 100755 index 92d3646b..00000000 --- a/scripts/push.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -# get base dir regardless of execution location -SOURCE="${BASH_SOURCE[0]}" -while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink - DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" - SOURCE="$(readlink "$SOURCE")" - [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located -done -. $(dirname $SOURCE)/init.sh - -minecraftversion=$(cat $basedir/Tuinity/work/BuildData/info.json | grep minecraftVersion | cut -d '"' -f 4) - -basedir diff --git a/scripts/rebuildpatches.sh b/scripts/rebuildpatches.sh index 27ba16a4..c3b02bba 100755 --- a/scripts/rebuildpatches.sh +++ b/scripts/rebuildpatches.sh @@ -1,51 +1,46 @@ -#!/bin/bash -# get base dir regardless of execution location -SOURCE="${BASH_SOURCE[0]}" -while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink - DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" - SOURCE="$(readlink "$SOURCE")" - [[ ${SOURCE} != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located -done -. $(dirname ${SOURCE})/init.sh +#!/usr/bin/env bash + +# SCRIPT HEADER start +basedir=$1 +source "$basedir/scripts/functions.sh" +echo " " +echo "----------------------------------------" +echo " $(bashcolor 1 32)Task$(bashcolorend) - Rebuild Patches" +echo " This will diff the sources of YAPFA and Paper to build patches." +echo " " +echo " $(bashcolor 1 32)Modules:$(bashcolorend)" +echo " - $(bashcolor 1 32)1$(bashcolorend) : API" +echo " - $(bashcolor 1 32)2$(bashcolorend) : Server" +echo "----------------------------------------" +# SCRIPT HEADER end -PS1="$" -echo "Rebuilding patch files from current fork state..." function savePatches { - what=$1 - cd ${basedir}/${what}/ + targetname=$1 + basedir + mkdir -p $basedir/patches/$2 + if [ -d ".git/rebase-apply" ]; then + # in middle of a rebase, be smarter + echo "REBASE DETECTED - PARTIAL SAVE" + last=$(cat ".git/rebase-apply/last") + next=$(cat ".git/rebase-apply/next") + declare -a files=("$basedir/patches/$2/"*.patch) + for i in $(seq -f "%04g" 1 1 $last) + do + if [ $i -lt $next ]; then + rm "${files[`expr $i - 1`]}" + fi + done + else + rm -rf $basedir/patches/$2/*.patch + fi - mkdir -p ${basedir}/patches/$2 - if [ -d ".git/rebase-apply" ]; then - # in middle of a rebase, be smarter - echo "REBASE DETECTED - PARTIAL SAVE" - last=$(cat ".git/rebase-apply/last") - next=$(cat ".git/rebase-apply/next") - declare -a files=("$basedir/patches/$2/"*.patch) - for i in $(seq -f "%04g" 1 1 ${last}) - do - if [ ${i} -lt ${next} ]; then - rm "${files[`expr ${i} - 1`]}" - fi - done - else - rm ${basedir}/patches/$2/*.patch - fi - - git format-patch --quiet -N -o ${basedir}/patches/$2 upstream/upstream - cd ${basedir} - git add -A ${basedir}/patches/$2 - cleanupPatches ${basedir}/patches/$2/ - echo " Patches saved for $what to patches/$2" + cd "$basedir/$targetname" + $gitcmd format-patch --no-signature --zero-commit --full-index --no-stat -N -o "$basedir/patches/$2" upstream/upstream >/dev/null + basedir + $gitcmd add -A "$basedir/patches/$2" + echo " $(bashcolor 1 32)($3/$4)$(bashcolorend) - Patches saved for $targetname to patches/$2" } -savePatches ${FORK_NAME}-API api -if [ -f "$basedir/${FORK_NAME}-API/.git/patch-apply-failed" ]; then - echo "$(bashColor 1 31)[[[ WARNING ]]] $(bashColor 1 33)- Not saving Tuinity-Server as it appears ${FORK_NAME}-API did not apply clean.$(bashColorReset)" - echo "$(bashColor 1 33)If this is a mistake, delete $(bashColor 1 34)${FORK_NAME}-API/.git/patch-apply-failed$(bashColor 1 33) and run rebuild again.$(bashColorReset)" - echo "$(bashColor 1 33)Otherwise, rerun ./tuinity patch to have a clean Tuinity-API apply so the latest Tuinity-Server can build.$(bashColorReset)" -else - savePatches ${FORK_NAME}-Server server - ${basedir}/scripts/push.sh -fi - - +savePatches ${FORK_NAME}-API api 1 2 +savePatches ${FORK_NAME}-Server server 2 2 +# gitpushproject diff --git a/scripts/updateUpstream.sh b/scripts/updateUpstream.sh new file mode 100644 index 00000000..a05c0c64 --- /dev/null +++ b/scripts/updateUpstream.sh @@ -0,0 +1,87 @@ +#!/usr/bin/env bash + +# SCRIPT HEADER start +basedir=$1 +source "$basedir/scripts/functions.sh" +echo "----------------------------------------" +echo " $(bashcolor 1 32)Task$(bashcolorend) - Update Upstream" +echo " This will update and patch Paper, importing necessary sources for patching." +#echo " " +#echo " $(bashcolor 1 32)Subtask:$(bashcolorend)" +#echo " - Import Sources" +echo " " +echo " $(bashcolor 1 32)Projects:$(bashcolorend)" +echo " - $(bashcolor 1 32)1$(bashcolorend) : Paper" +echo " - $(bashcolor 1 32)2$(bashcolorend) : YAPFA" +echo "----------------------------------------" +# SCRIPT HEADER end + +# This script are capable of patching paper which have the same effect with renewing the source codes of paper to its corresponding remote/official state, and also are able to reset the patches of paper to its head commit to override dirty changes which needs a argument with --resetPaper. + +# After the patching, it will copying sources that do no exist in the YAPFA workspace but referenced in YAPFA patches into our workspace, depending on the content of our patches, this will be addressed by calling importSources.sh. + +# Following by invoking generateImports.sh, it will generate new added/imported files of paper compared to the original decompiled sources into mc-dev folder under the root dir of the project, whose intention is unclear yet. + +# exit immediately if a command exits with a non-zero status +set -e + +subtasks=1 +updatepaper=$2 +if [ "$updatepaper" == "1" ]; then + echo " $(bashcolor 1 32)(0/$subtasks)$(bashcolorend) - Update Git submodules.." + $gitcmd submodule update --init --remote +fi + +if [[ "$2" == "--resetPaper" ]]; then + echo " $(bashcolor 1 32)(0/$subtasks)$(bashcolorend) - Reset Paper submodule.." + paperdir + $gitcmd fetch && $gitcmd reset --hard origin/master + basedir + $gitcmd add Paper +fi + +# patch paper +echo " $(bashcolor 1 32)(0/$subtasks)$(bashcolorend) - Apply patches of Tuinity.." +echo " " +paperVer=$(gethead Tuinity) +paperdir +./tuinity patch + +#cd "Paper-Server" +#mcVer=$($mvncmd -o org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=minecraft_version | sed -n -e '/^\[.*\]/ !{ /^[0-9]/ { p; q } }') + +#echo " $(bashcolor 1 32)(1/$subtasks)$(bashcolorend) - Import necessary sources.." +#basedir +#"$basedir"/scripts/importSources.sh $1 + +#minecraftversion=$(cat "$basedir"/Paper/work/BuildData/info.json | grep minecraftVersion | cut -d '"' -f 4) +#version=$(echo -e "Paper: $paperVer\nmc-dev:$importedmcdev") +#tag="${minecraftversion}-${mcVer}-$(echo -e $version | shasum | awk '{print $2}')" +#echo "$tag" > "$basedir"/current-paper + +# "$basedir"/scripts/generateImports.sh $1 # unused + +#echo " $(bashcolor 1 32)(1/$subtasks)$(bashcolorend) - Tagging Paper submodules.." +#function tag { +# paperdir && cd $1 +# if [ "$3" == "1" ]; then +# git tag -d "$tag" 2>/dev/null +# fi +# echo -e "$(date)\n\n$version" | git tag -a "$tag" -F - 2>/dev/null +#} + +#echo -e "$version" + +#forcetag=0 +#if [ "$(cat "$basedir"/current-paper)" != "$tag" ]; then +# forcetag=1 +#fi + +#tag Paper-API $forcetag +#tag Paper-Server $forcetag + +echo " $(bashcolor 1 32)($subtasks/$subtasks) Succeed$(bashcolorend) - Submodules have been updated, regenerated and imported, run 'YAPFA patch' to test/fix patches, and by 'YAPFA rbp' to rebuild patches that fixed with the updated upstream." +echo " " + +# gitpush Paper-API $PAPER_API_REPO $tag +# gitpush Paper-Server $PAPER_SERVER_REPO $tag diff --git a/scripts/upstream.sh b/scripts/upstream.sh deleted file mode 100755 index ef1c716b..00000000 --- a/scripts/upstream.sh +++ /dev/null @@ -1,60 +0,0 @@ -#!/bin/bash -# get base dir regardless of execution location -SOURCE="${BASH_SOURCE[0]}" -while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink - DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" - SOURCE="$(readlink "$SOURCE")" - [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located -done -. $(dirname $SOURCE)/init.sh - -if [[ "$1" == up* ]]; then - ( - cd "$basedir/Tuinity/" - git fetch && git reset --hard origin/ver/1.14 - cd ../ - git add Tuinity - ) -fi - -tuinityVer=$(gethead Tuinity) -cd "$basedir/Tuinity/" - -./tuinity patch - -cd "Tuinity-Server" -mcVer=$(mvn -o org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=minecraft_version | sed -n -e '/^\[.*\]/ !{ /^[0-9]/ { p; q } }') - -basedir -. $basedir/scripts/importmcdev.sh - -minecraftversion=$(cat $basedir/Tuinity/work/BuildData/info.json | grep minecraftVersion | cut -d '"' -f 4) -version=$(echo -e "Tuinity: $tuinityVer\nmc-dev:$importedmcdev") -tag="${minecraftversion}-${mcVer}-$(echo -e $version | shasum | awk '{print $1}')" -echo "$tag" > $basedir/current-tuinity -git add "$basedir/current-tuinity" - -$basedir/scripts/generatesources.sh - -cd Tuinity/ - -function tag { -( - cd $1 - if [ "$2" == "1" ]; then - git tag -d "$tag" 2>/dev/null - fi - echo -e "$(date)\n\n$version" | git tag -a "$tag" -F - 2>/dev/null -) -} -echo "Tagging as $tag" -echo -e "$version" - -forcetag=0 -if [ "$(cat $basedir/current-tuinity)" != "$tag" ]; then - forcetag=1 -fi - -tag Tuinity-API $forcetag -tag Tuinity-Server $forcetag - diff --git a/scripts/upstreamCommit.sh b/scripts/upstreamCommit.sh deleted file mode 100644 index 721699f3..00000000 --- a/scripts/upstreamCommit.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env bash -( -set -e -PS1="$" - -function changelog() { - base=$(git ls-tree HEAD $1 | cut -d' ' -f3 | cut -f1) - cd $1 && git log --oneline ${base}...ORIGIN/ver/1.16 -} -tuinity=$(changelog Tuinity) -#paper=$(changelog Tuinity/Paper) - -updated="" -logsuffix="" -if [ ! -z "$tuinity" ]; then - logsuffix="$logsuffix\n\nTuinity Changes:\n$tuinity" - if [ -z "$updated" ]; then updated="Tuinity"; else updated="$updated/Tuinity"; fi -fi -#if [ ! -z "$paper" ]; then -# logsuffix="$logsuffix\n\nPaper Changes:\n$paper" -# if [ -z "$updated" ]; then updated="Paper"; else updated="$updated/Paper"; fi -#fi -disclaimer="Upstream has released updates that appears to apply and compile correctly" - -if [ ! -z "$1" ]; then - disclaimer="$@" -fi - -log="${UP_LOG_PREFIX}Updated Upstream ($updated)\n\n${disclaimer}${logsuffix}" - -echo -e "$log" - -) || exit 1 \ No newline at end of file diff --git a/yapfa b/yapfa index 82a5b428..eaada59a 100755 --- a/yapfa +++ b/yapfa @@ -1,132 +1,194 @@ #!/usr/bin/env bash + +# YAPFA Build Script -# get base dir regardless of execution location -SOURCE="${BASH_SOURCE[0]}" -while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink - DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" - SOURCE="$(readlink "$SOURCE")" - [[ "$SOURCE" != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located -done -SOURCE=$([[ "$SOURCE" = /* ]] && echo "$SOURCE" || echo "$PWD/${SOURCE#./}") -basedir=$(dirname "$SOURCE") -. "$basedir"/scripts/init.sh +############################################################################ +# Multicore building # +# By JosephWorks # +# -------------------------------------------------------------------------# +# To use multicore building, use "$mvncmd" instead of "maven" # +# 20-50% speed improvement is quite common. # +############################################################################ -paperstash() { - STASHED=$(git stash) -} +# Exit immediately if a command exits with a non-zero status +set -e + +source "./scripts/functions.sh" + +JAVA_VERSION=`java -version 2>&1 |awk 'NR==1{ gsub(/"/,""); print $3 }'` -paperunstash() { - if [[ "$STASHED" != "No local changes to save" ]] ; then - git stash pop - fi -} failed=0 case "$1" in - "rb" | "rbp" | "rebuild") - ( - set -e - cd "$basedir" - scripts/rebuildpatches.sh "$basedir" || exit 1 - ) || failed=1 - ;; - "p" | "patch" | "apply") - ( - set -e - cd "$basedir" - scripts/apply.sh "$basedir" || exit 1 - ) || failed=1 - ;; - "b" | "bu" | "build") - ( - basedir - mvn -N install - cd ${FORK_NAME}-API - mvn clean install && cd ../${FORK_NAME}-Server && mvn clean install - ) || failed=1 - ;; - "jar" | "paperclip") + "r" | "rb" | "rbp" | "rebuild") ( - basedir - cd "$basedir" - ./scripts/paperclip.sh + set -e + basedir + $scriptdir/importSources.sh "$basedir" || exit 1 + $scriptdir/rebuildPatches.sh "$basedir" || exit 1 + ) || failed=1 + ;; + "a" | "p" | "patch" | "apply") + ( + set -e + $scriptdir/applyPatches.sh "$basedir" || exit 1 + ) || failed=1 + ;; + "b" | "bu" | "build" | "install") + ( + echo "$JAVA_VERSION" + basedir + $mvncmd -N install surefire-report:report + cd ${FORK_NAME}-API + $mvncmd -e clean install && (cd ../Tuinity/Paper/Paper-MojangAPI && $mvncmd -e clean install) && cd ../${FORK_NAME}-Server && $mvncmd -e clean install surefire-report:report + ) || failed=1 + ;; + "j" | "launcher" | "jar" | "paperclip") + ( + basedir + $scriptdir/installLauncher.sh "$basedir" + ) || failed=1 + ;; + "u" | "up" | "upstream" | "update") + ( + basedir + $scriptdir/updateUpstream.sh "$basedir" 1 ) ;; - "d" | "de" | "deploy") - ( - basedir - mvn -N install - cd ${FORK_NAME}-API - mvn clean deploy && cd ../${FORK_NAME}-Server && mvn clean install + "r" | "root") + basedir + ;; + "a" | "api") + cd "$basedir/YAPFA-API" + ;; + "s" | "server") + cd "$basedir/YAPFA-Server" + ;; + "fup" | "fetchupstream") + $scriptdir/fetchUpstream.sh "$basedir" || exit 1 + ;; + "c" | "clean") + rm -rf YAPFA-API + rm -rf YAPFA-Server + rm -rf Paper + echo "Cleaned build files" + ;; + "f" | "fu" | "full" | "fullbuild") + ( + echo "$JAVA_VERSION" + basedir + $scriptdir/updateUpstream.sh "$basedir" || exit 1 + set -e + $scriptdir/applyPatches.sh "$basedir" || exit 1 + basedir + $mvncmd -N install surefire-report:report + cd ${FORK_NAME}-API + $mvncmd -e clean install && (cd ../Tuinity/Paper/Paper-MojangAPI && $mvncmd -e clean install) && cd ../${FORK_NAME}-Server && $mvncmd -e clean install surefire-report:report + $scriptdir/installLauncher.sh "$basedir" || exit 1 ) || failed=1 - ;; - "up" | "upstream") - ( - cd "$basedir" - scripts/upstream.sh "$2" || exit 1 - if [ "$2" == "up" ]; then - (scripts/apply.sh "$basedir" && scripts/rebuildpatches.sh "$basedir" && scripts/commitup.sh) || exit 1 - fi - ) || failed=1 - ;; - "cup" | "commitup" | "upc" | "upcommit") - ( - cd "$basedir" - scripts/commitup.sh || exit 1 - ) || failed=1 - ;; - "r" | "root") - cd "$basedir" - ;; - "a" | "api") - cd "$basedir/YAPFA-API" - ;; - "s" | "server") - cd "$basedir/YAPFA-Server" - ;; - "setup") - if [[ -f ~/.bashrc ]] ; then - NAME="ec" - if [[ ! -z "${2+x}" ]] ; then - NAME="$2" - fi - (grep "alias $NAME=" ~/.bashrc > /dev/null) && (sed -i "s|alias $NAME=.*|alias $NAME='. $SOURCE'|g" ~/.bashrc) || (echo "alias $NAME='. $SOURCE'" >> ~/.bashrc) - alias "$NAME=. $SOURCE" - echo "You can now just type '$NAME' at any time to access the paper tool." - fi - ;; - *) - echo "YAPFA build tool command. This provides a variety of commands to build and manage the PaperMC build" - echo "environment. For all of the functionality of this command to be available, you must first run the" - echo "'setup' command. View below for details. For essential building and patching, you do not need to do the setup." - echo "" - echo " Normal commands:" - echo " * rb, rebuild | Rebuild patches, can be called from anywhere." - echo " * p, patch | Apply all patches to top of Paper without building it. Can be run from anywhere." - echo " * up, upstream | Build Paper upstream, pass arg up to update paper. Can be run from anywhere." - echo " * b, build | Build API and Server but no deploy. Can be ran anywhere." - echo " * d, deploy | Build and Deploy API jar and build Server. Can be ran anywhere." - echo "" - echo " These commands require the setup command before use:" - echo " * r, root | Change directory to the root of the project." - echo " * a. api | Move to the Paper-API directory." - echo " * s, server | Move to the Paper-Server directory." - echo " * e, edit | Use to edit a specific patch, give it the argument \"server\" or \"api\"" - echo " | respectively to edit the correct project. Use the argument \"continue\" after" - echo " | the changes have been made to finish and rebuild patches. Can be called from anywhere." - echo "" - echo " * setup | Add an alias to .bashrc to allow full functionality of this script. Run as:" - echo " | . ./paper setup" - echo " | After you run this command you'll be able to just run 'paper' from anywhere." - echo " | The default name for the resulting alias is 'paper', you can give an argument to override" - echo " | this default, such as:" - echo " | . ./paper setup example" - echo " | Which will allow you to run 'example' instead." - ;; + ;; + "e" | "edit") + case "$2" in + "s" | "server") + export YAPFA_LAST_EDIT="$basedir/YAPFA-Server" + cd "$basedir/YAPFA-Server" + ( + set -e + gitstash + cd "$basedir/Paper/Paper-Server" + $gitcmd fetch --all + # Create the upstream branch in Paper project with current state + $gitcmd checkout master # possibly already in + $gitcmd branch -D upstream || true + $gitcmd branch -f upstream HEAD + cd "$basedir/YAPFA-Server" + $gitcmd rebase -i upstream/upstream + gitunstash + ) + ;; + "a" | "api") + export YAPFA_LAST_EDIT="$basedir/YAPFA-API" + cd "$basedir/YAPFA-API" + ( + set -e + gitstash + cd "$basedir/Paper/Paper-API" + $gitcmd fetch --all + # Create the upstream branch in Paper project with current state + $gitcmd checkout master # possibly already in + $gitcmd branch -D upstream || true + $gitcmd branch -f upstream HEAD + cd "$basedir/YAPFA-API" + $gitcmd rebase -i upstream/upstream + gitunstash + ) + ;; + "c" | "continue") + cd "$YAPFA_LAST_EDIT" + unset YAPFA_LAST_EDIT + ( + set -e + $gitcmd add . + $gitcmd commit --amend + $gitcmd rebase --continue + basedir + $scriptdir/rebuildPatches.sh "$basedir" + ) + ;; + *) + echo "You must edit either the api or server." + ;; + esac + ;; + "setup") + if [[ -f ~/.bashrc ]] ; then + NAME="YAPFA" + if [[ ! -z "${2+x}" ]] ; then + NAME="$2" + fi + (grep "alias $NAME=" ~/.bashrc > /dev/null) && (sed -i "s|alias $NAME=.*|alias $NAME='. $SOURCE'|g" ~/.bashrc) || (echo "alias $NAME='. $SOURCE'" >> ~/.bashrc) + alias "$NAME=. $SOURCE" + echo "You can now just type '$NAME' at any time to access the YAPFA tool." + fi + ;; + *) + echo "YAPFA build tool command. This provides a variety of commands to build and manage the YAPFA build" + echo "environment. For all of the functionality of this command to be available, you must first run the" + echo "'setup' command. View below for details. For essential building and patching, you do not need to do the setup." + echo "" + echo " Normal commands:" + echo " * r, rebuild | Rebuild patches, can be called from anywhere." + echo " * p, patch | Apply all patches to top of Paper without building it. Can be run from anywhere." + echo " * u, update | Update and patch the Paper submodule. Can be run from anywhere." + echo " * b, build | Build the projects, including the API and the Server. Can be ran anywhere." + echo " * j, jar | Build the projects and build the launcher jar. Can be ran anywhere." + echo " * d, deploy | Build the projects and deploy through Maven. Can be ran anywhere." + echo "" + echo " These commands require the setup command before use:" + echo " * r, root | Change directory to the root of the project." + echo " * a. api | Move to the YAPFA-API directory." + echo " * s, server | Move to the YAPFA-Server directory." + echo " * e, edit | Use to edit a specific patch, give it the argument \"server\" or \"api\"" + echo " | respectively to edit the correct project. Use the argument \"continue\" after" + echo " | the changes have been made to finish and rebuild patches. Can be called from anywhere." + echo "" + echo " * setup | Add an alias to .bashrc to allow full functionality of this script. Run as:" + echo " | . ./YAPFA setup" + echo " | After you run this command you'll be able to just run 'YAPFA' from anywhere." + echo " | The default name for the resulting alias is 'YAPFA', you can give an argument to override" + echo " | this default, such as:" + echo " | . ./YAPFA setup example" + echo " | Which will allow you to run 'example' instead." + ;; esac -unset -f paperstash -unset -f paperunstash -if [ "$failed" == "1" ]; then +unset RCPATH +unset SOURCE +unset basedir +unset -f color +unset -f colorend +unset -f gitstash +unset -f gitunstash +if [[ "$failed" == "1" ]]; then unset failed false else