PaperMC/scripts/applyPatches.sh
Aikar c82b292ab0
Fix pooled buffer leak resulting in dynmap black spots - Fixes #3386
Dynmap accessed the raw bytes because it utilized NBT locally, but the
NBTTagcompound was garbage collected while the bytes were still being used.

This will return getBytes() back to being safe, and add a new PoolSafe method
that will prevent the additional allocations for general chunk loading.

Also fixed applyPatches for people with paths in their working directory
if they have mcdev sources built.
2020-05-20 00:55:30 -04:00

108 lines
3.1 KiB
Bash
Executable file

#!/usr/bin/env bash
(
PS1="$"
basedir="$(cd "$1" && pwd -P)"
workdir="$basedir/work"
minecraftversion=$(cat "$workdir/BuildData/info.json" | grep minecraftVersion | cut -d '"' -f 4)
gitcmd="git -c commit.gpgsign=false"
applycmd="$gitcmd am --3way --ignore-whitespace"
# Windows detection to workaround ARG_MAX limitation
windows="$([[ "$OSTYPE" == "cygwin" || "$OSTYPE" == "msys" ]] && echo "true" || echo "false")"
echo "Rebuilding Forked projects.... "
function applyPatch {
what=$1
what_name=$(basename "$what")
target=$2
branch=$3
cd "$basedir/$what"
$gitcmd fetch
$gitcmd branch -f upstream "$branch" >/dev/null
cd "$basedir"
if [ ! -d "$basedir/$target" ]; then
$gitcmd clone "$what" "$target"
fi
cd "$basedir/$target"
echo "Resetting $target to $what_name..."
$gitcmd remote rm upstream > /dev/null 2>&1
$gitcmd remote add upstream "$basedir/$what" >/dev/null 2>&1
$gitcmd checkout master 2>/dev/null || $gitcmd checkout -b master
$gitcmd fetch upstream >/dev/null 2>&1
$gitcmd reset --hard upstream/upstream
echo " Applying patches to $target..."
statusfile=".git/patch-apply-failed"
rm -f "$statusfile"
$gitcmd am --abort >/dev/null 2>&1
# Special case Windows handling because of ARG_MAX constraint
if [[ $windows == "true" ]]; then
echo " Using workaround for Windows ARG_MAX constraint"
find "$basedir/${what_name}-Patches/"*.patch -print0 | xargs -0 $applycmd
else
$applycmd "$basedir/${what_name}-Patches/"*.patch
fi
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"
# On Windows, finishing the patch apply will only fix the latest patch
# users will need to rebuild from that point and then re-run the patch
# process to continue
if [[ $windows == "true" ]]; then
echo ""
echo " Because you're on Windows you'll need to finish the AM,"
echo " rebuild all patches, and then re-run the patch apply again."
echo " Consider using the scripts with Windows Subsystem for Linux."
fi
exit 1
else
rm -f "$statusfile"
echo " Patches applied cleanly to $target"
fi
}
# Move into spigot dir
cd "$workdir/Spigot"
basedir=$(pwd)
# Apply Spigot
(
applyPatch ../Bukkit Spigot-API HEAD &&
applyPatch ../CraftBukkit Spigot-Server patched
) || (
echo "Failed to apply Spigot Patches"
exit 1
) || exit 1
# Move out of Spigot
basedir="$1"
cd "$basedir"
echo "Importing MC Dev"
./scripts/importmcdev.sh "$basedir" || exit 1
# Apply paper
(
applyPatch "work/Spigot/Spigot-API" Paper-API HEAD &&
applyPatch "work/Spigot/Spigot-Server" Paper-Server HEAD
cd "$basedir"
# if we have previously ran ./paper mcdev, update it
if [ -d "$workdir/Minecraft/$minecraftversion/src" ]; then
./scripts/makemcdevsrc.sh "$basedir"
fi
) || (
echo "Failed to apply Paper Patches"
exit 1
) || exit 1
) || exit 1