2023-05-23 18:50:30 +00:00
|
|
|
#!/bin/bash
|
|
|
|
|
|
|
|
job_start=0
|
|
|
|
|
|
|
|
job_start() {
|
|
|
|
# [*] job start - [target]:[job]
|
|
|
|
# bold
|
|
|
|
echo -e "\e[1m[*] job start - $1:$2\e[0m"
|
2023-05-24 02:02:12 +00:00
|
|
|
job_start=$(date +%s.%N)
|
2023-05-23 18:50:30 +00:00
|
|
|
}
|
|
|
|
job_success() {
|
|
|
|
# [*] success! [target]:[job] finished in 241.2s :)
|
2023-05-24 02:02:12 +00:00
|
|
|
end=$(date +%s.%N)
|
2023-05-24 18:00:21 +00:00
|
|
|
time=$( echo "$end - $job_start" | bc -l )
|
2023-05-23 18:50:30 +00:00
|
|
|
echo -e "\e[1m\e[32m[*] success! $1:$2 finished in $time seconds :)\e[0m"
|
|
|
|
}
|
|
|
|
job_fail() {
|
|
|
|
# [x] FAIL! [target]:[job] failed in 241.2s :(
|
2023-05-24 02:02:12 +00:00
|
|
|
end=$(date +%s.%N)
|
2023-05-24 18:00:21 +00:00
|
|
|
time=$( echo "$end - $job_start" | bc -l )
|
2023-05-23 18:50:30 +00:00
|
|
|
echo -e "\e[1m\e[31m[*] FAIL! $1:$2 failed in $time seconds :(\e[0m"
|
|
|
|
}
|
2023-05-24 02:02:12 +00:00
|
|
|
job_skip() {
|
|
|
|
# [-] skipped - [target]:[job] skipped in 241.2s
|
|
|
|
end=$(date +%s.%N)
|
2023-05-24 18:00:21 +00:00
|
|
|
time=$( echo "$end - $job_start" | bc -l )
|
2023-05-24 02:02:12 +00:00
|
|
|
echo -e "\e[1m\e[34m[-] skipped - $1:$2 skipped after $time seconds\e[0m"
|
|
|
|
}
|
2023-05-23 18:50:30 +00:00
|
|
|
|
|
|
|
sub_clone() {
|
|
|
|
job_start "scratch-blocks" "clone"
|
2023-05-24 02:02:12 +00:00
|
|
|
if [ -d "$(pwd)/scratch-blocks" ]; then
|
|
|
|
echo "Clone dir already exists"
|
|
|
|
job_skip "scratch-blocks" "clone"
|
|
|
|
else
|
|
|
|
git clone https://github.com/scratchfoundation/scratch-blocks scratch-blocks
|
|
|
|
if [ "$?" != "0" ]; then
|
|
|
|
job_fail "scratch-blocks" "clone"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
job_success "scratch-blocks" "clone"
|
2023-05-23 18:50:30 +00:00
|
|
|
fi
|
2023-05-24 02:02:12 +00:00
|
|
|
job_start "scratch-blocks" "checkout"
|
2023-05-24 12:23:20 +00:00
|
|
|
pbase=$(cat patches/blocks/PATCHBASE | tr -d '\n')
|
2023-05-24 02:02:12 +00:00
|
|
|
echo "Checking out scratch-blocks patchbase $pbase"
|
|
|
|
cd scratch-blocks || exit
|
|
|
|
git checkout "$pbase"
|
2023-05-23 18:50:30 +00:00
|
|
|
if [ "$?" != "0" ]; then
|
2023-05-24 02:02:12 +00:00
|
|
|
job_fail "scratch-blocks" "checkout"
|
2023-05-23 18:50:30 +00:00
|
|
|
exit 1
|
|
|
|
fi
|
2023-05-24 02:02:12 +00:00
|
|
|
cd .. || exit
|
|
|
|
job_success "scratch-blocks" "checkout"
|
2023-05-24 18:58:21 +00:00
|
|
|
|
|
|
|
job_start "scratch-gui" "clone"
|
|
|
|
if [ -d "$(pwd)/scratch-gui" ]; then
|
|
|
|
echo "Clone dir already exists"
|
|
|
|
job_skip "scratch-gui" "clone"
|
|
|
|
else
|
|
|
|
git clone https://github.com/scratchfoundation/scratch-gui scratch-gui
|
|
|
|
if [ "$?" != "0" ]; then
|
|
|
|
job_fail "scratch-gui" "clone"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
job_success "scratch-gui" "clone"
|
|
|
|
fi
|
|
|
|
job_start "scratch-gui" "checkout"
|
|
|
|
pbase=$(cat patches/gui/PATCHBASE | tr -d '\n')
|
|
|
|
echo "Checking out scratch-gui patchbase $pbase"
|
|
|
|
cd scratch-gui || exit
|
|
|
|
git checkout "$pbase"
|
|
|
|
if [ "$?" != "0" ]; then
|
|
|
|
job_fail "scratch-gui" "checkout"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
cd .. || exit
|
|
|
|
job_success "scratch-gui" "checkout"
|
2023-05-23 18:50:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
sub_patch() {
|
|
|
|
sub_clone
|
|
|
|
|
|
|
|
job_start "scratch-blocks" "patch"
|
|
|
|
|
|
|
|
cd scratch-blocks || exit
|
|
|
|
|
|
|
|
git am --abort >/dev/null 2>&1
|
|
|
|
|
2023-05-24 12:23:20 +00:00
|
|
|
git am --3way "../patches/blocks/"*.patch
|
2023-05-23 18:50:30 +00:00
|
|
|
if [ "$?" != "0" ]; then
|
|
|
|
echo "One or more patches did not apply cleanly to scratch-blocks. Check above message and try again".
|
|
|
|
job_fail "scratch-blocks" "patch"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
echo "[*] Patches applied cleanly to scratch-blocks"
|
|
|
|
|
2023-05-24 18:58:21 +00:00
|
|
|
cd .. || exit
|
|
|
|
|
2023-05-23 18:50:30 +00:00
|
|
|
job_success "scratch-blocks" "patch"
|
2023-05-24 18:58:21 +00:00
|
|
|
|
|
|
|
job_start "scratch-gui" "patch"
|
|
|
|
|
|
|
|
cd scratch-gui || exit
|
|
|
|
|
|
|
|
git am --abort >/dev/null 2>&1
|
|
|
|
|
|
|
|
git am --3way "../patches/gui/"*.patch
|
|
|
|
if [ "$?" != "0" ]; then
|
|
|
|
echo "One or more patches did not apply cleanly to scratch-gui. Check above message and try again".
|
|
|
|
job_fail "scratch-gui" "patch"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
echo "[*] Patches applied cleanly to scratch-gui"
|
|
|
|
|
|
|
|
cd .. || exit
|
|
|
|
|
|
|
|
job_success "scratch-gui" "patch"
|
2023-05-23 18:50:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
sub_compile() {
|
|
|
|
sub_patch
|
|
|
|
|
|
|
|
job_start "scratch-blocks" "compile"
|
|
|
|
|
2023-05-24 18:58:21 +00:00
|
|
|
cd scratch-blocks || exit
|
|
|
|
|
2023-05-23 18:50:30 +00:00
|
|
|
NODE_OPTIONS=--openssl-legacy-provider npm i
|
|
|
|
|
|
|
|
if [ "$?" != "0" ]; then
|
|
|
|
job_fail "scratch-blocks" "compile"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
2023-05-24 18:58:21 +00:00
|
|
|
npm link
|
|
|
|
|
|
|
|
if [ "$?" != "0" ]; then
|
|
|
|
echo "Unable to configure scratch-gui to use scratch-blocks. Check above message and try again".
|
|
|
|
job_fail "scratch-blocks" "compile"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
cd .. || exit
|
|
|
|
|
2023-05-23 18:50:30 +00:00
|
|
|
job_success "scratch-blocks" "compile"
|
2023-05-24 18:58:21 +00:00
|
|
|
|
|
|
|
job_start "scratch-gui" "compile"
|
|
|
|
|
|
|
|
cd scratch-gui || exit
|
|
|
|
|
|
|
|
npm link scratch-blocks
|
|
|
|
if [ "$?" != "0" ]; then
|
|
|
|
echo "Unable to configure scratch-gui to use scratch-blocks. Check above message and try again".
|
|
|
|
job_fail "scratch-gui" "compile"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
npm i
|
|
|
|
if [ "$?" != "0" ]; then
|
|
|
|
job_fail "scratch-gui" "compile"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
cd .. || exit
|
|
|
|
|
|
|
|
job_success "scratch-gui" "compile"
|
2023-05-23 18:50:30 +00:00
|
|
|
}
|
|
|
|
|
2023-05-24 13:58:42 +00:00
|
|
|
sub_patchc() {
|
|
|
|
job_start "generic" "patch-create:collect-info"
|
|
|
|
read -rp "Enter the current project name: " project
|
|
|
|
read -rp "Enter the patchlist ID (blocks for scratch-blocks): " plist
|
|
|
|
job_success "generic" "patch-create:collect-info"
|
|
|
|
job_start "$project" "patch-create"
|
|
|
|
cd "$project" || exit
|
|
|
|
fname=$(git format-patch -1 HEAD -o ../patches/"$plist"/)
|
|
|
|
base=$(basename "$fname")
|
|
|
|
patchnumnp=$(find ../patches/"$plist" -type f -name "*.patch" | wc -l)
|
|
|
|
patchnum=$(printf "%04d" "$patchnumnp")
|
|
|
|
nonumfname="$(echo "$base" | cut -c 5-)"
|
|
|
|
newfname="$patchnum$nonumfname"
|
|
|
|
newpath=$(echo "$fname" | sed "s/$base/$newfname/" -)
|
|
|
|
mv "$fname" "$newpath"
|
|
|
|
echo "Wrote out patch file to $newfname"
|
|
|
|
job_success "$project" "patch-create"
|
|
|
|
echo "Checking that patch file applies cleanly"
|
|
|
|
job_start "$project" "patch-check"
|
|
|
|
cd .. || exit
|
|
|
|
sub_patch
|
|
|
|
job_success "$project" "patch-check"
|
|
|
|
}
|
|
|
|
|
|
|
|
sub_reset() {
|
|
|
|
sub_clone
|
|
|
|
}
|
|
|
|
|
2023-05-23 18:50:30 +00:00
|
|
|
sub_help() {
|
2023-05-24 13:58:42 +00:00
|
|
|
echo "--- PyBlocks Build Tool ---"
|
|
|
|
echo "usage: ./pbt.sh [command]"
|
|
|
|
echo " clone - clone upstream source code"
|
|
|
|
echo " patch - (re)apply patches"
|
|
|
|
echo " compile - compile bundles"
|
|
|
|
echo " bundle - create prod bundles"
|
|
|
|
echo " patchc - create a patch for the current project"
|
|
|
|
echo " reset - reset to upstream patch base (equivalent to clone)"
|
2023-05-23 18:50:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
subcommand=$1
|
|
|
|
case $subcommand in
|
2023-05-24 18:00:21 +00:00
|
|
|
"" | "-h" | "--help" | "help")
|
|
|
|
sub_help
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
echo "[*] Running build command $subcommand"
|
|
|
|
shift
|
|
|
|
sub_"${subcommand}" "$@"
|
|
|
|
if [ $? = 127 ]; then
|
|
|
|
echo "Error: '$subcommand' is not a known subcommand." >&2
|
|
|
|
echo " Run 'pbt.sh --help' for a list of known subcommands." >&2
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
;;
|
2023-05-23 18:50:30 +00:00
|
|
|
esac
|