Paper/scripts/rebuildPatches.sh
Aikar 96f8b1af6c
Improve upstream merge script to rebuild patches
this will help ensure that upstreams apply as cleanly as it does manually

the filtering makes the patches more fragile, but usually not an issue for small updates.

this will unfilter, apply the cleanest patches, then the next rebuild will
filter out unnecessary changes
2019-04-02 23:25:48 -04:00

77 lines
2.6 KiB
Bash
Executable File

#!/usr/bin/env bash
(
PS1="$"
basedir="$(cd "$1" && pwd -P)"
workdir="$basedir/work"
source "$basedir/scripts/functions.sh"
gitcmd="git -c commit.gpgsign=false -c core.safecrlf=false"
echo "Rebuilding patch files from current fork state..."
nofilter="0"
if [ "$2" = "nofilter" ]; then
nofilter="1"
fi
function cleanupPatches {
cd "$1"
for patch in *.patch; do
echo "$patch"
gitver=$(tail -n 2 "$patch" | grep -ve "^$" | tail -n 1)
diffs=$($gitcmd diff --staged "$patch" | grep --color=none -E "^(\+|\-)" | grep --color=none -Ev "(From [a-f0-9]{32,}|\-\-\- a|\+\+\+ b|^.index)")
testver=$(echo "$diffs" | tail -n 2 | grep --color=none -ve "^$" | tail -n 1 | grep --color=none "$gitver")
if [ "x$testver" != "x" ]; then
diffs=$(echo "$diffs" | sed 'N;$!P;$!D;$d')
fi
if [ "x$diffs" == "x" ] ; then
$gitcmd reset HEAD "$patch" >/dev/null
$gitcmd checkout -- "$patch" >/dev/null
fi
done
}
function savePatches {
what=$1
what_name=$(basename "$what")
target=$2
echo "Formatting patches for $what..."
cd "$basedir/${what_name}-Patches/"
if [ -d "$basedir/$target/.git/rebase-apply" ]; then
# in middle of a rebase, be smarter
echo "REBASE DETECTED - PARTIAL SAVE"
last=$(cat "$basedir/$target/.git/rebase-apply/last")
next=$(cat "$basedir/$target/.git/rebase-apply/next")
orderedfiles=$(find . -name "*.patch" | sort)
for i in $(seq -f "%04g" 1 1 $last)
do
if [ $i -lt $next ]; then
rm $(echo "$orderedfiles{@}" | sed -n "${i}p")
fi
done
else
rm -rf *.patch
fi
cd "$basedir/$target"
$gitcmd format-patch --no-stat -N -o "$basedir/${what_name}-Patches/" upstream/upstream >/dev/null
cd "$basedir"
$gitcmd add -A "$basedir/${what_name}-Patches"
if [ "$nofilter" == "0" ]; then
cleanupPatches "$basedir/${what_name}-Patches"
fi
echo " Patches saved for $what to $what_name-Patches/"
}
savePatches "$workdir/Spigot/Spigot-API" "Paper-API"
if [ -f "$basedir/Paper-API/.git/patch-apply-failed" ]; then
echo "$(color 1 31)[[[ WARNING ]]] $(color 1 33)- Not saving Paper-Server as it appears Paper-API did not apply clean.$(colorend)"
echo "$(color 1 33)If this is a mistake, delete $(color 1 34)Paper-API/.git/patch-apply-failed$(color 1 33) and run rebuild again.$(colorend)"
echo "$(color 1 33)Otherwise, rerun ./paper patch to have a clean Paper-API apply so the latest Paper-Server can build.$(colorend)"
else
savePatches "$workdir/Spigot/Spigot-Server" "Paper-Server"
fi
) || exit 1