Files
OpenSK/maintainers/patches
Julien Cretin 37e9d6d64d Do not set the stack size outside prod (#415)
* Add support for multiple modules

* Add macos fix

* Update setup-submodules script
2021-11-30 18:11:42 +01:00

158 lines
3.8 KiB
Bash
Executable File

#!/bin/bash
set -e
shopt -s nullglob
PROGRAM="$0"
MODULES=(tock libtock-rs)
success() {
echo -e "\e[1;32mDone:\e[m $1"
exit 0
}
fail() {
echo -e "\e[1;31mError:\e[m $1"
exit 1
}
commit() {
local message="$1"
git add .
git commit -qm"${message}"
}
get_root() {
local module="$1"
git ls-tree HEAD:third_party | sed -En 's/^.* ([^ ]+)\t'"${module}"'$/\1/p'
}
get_head() {
git rev-parse HEAD
}
help() {
local root="$(get_root)"
cat <<EOF
Usage: ${PROGRAM} {apply|save}
apply Applies the patches to the submodules regardless of their state.
As a consequence this can always be called to get to a clean state
but may result in data loss if there are unsaved changes.
save Saves the submodules to the patches.
This should only be called after apply and when all changes have
been added to a commit. After saving, you can run ./setup.sh to
return to normal state. Otherwise you can continue editing the
submodules and calling save.
restore Restores the submodules to its normal state regardless of their
state. As a consequence this can always be called to get to a
clean state but may result in data loss if there are unsaved
changes.
Example:
1. Enter the edit state from the normal state:
${PROGRAM} apply
2. Edit files in the submodules:
cd third_party/<submodule>
edit <files>
3. For each edited submodule, create a fix commit per affected patch by
repeating the following commands until there are no more files to add:
git add -p
git commit -m'fix <patch#>'
4. For each edited submodule, merge the fixes into their patches by moving
their line below their patch and changing their "edit" into "fixup":
git rebase -i ${root}
5. Save the changes:
cd ../..
${PROGRAM} save
6. Either continue repeating steps 2 to 5, or return to the normal state:
${PROGRAM} restore
EOF
exit 0
}
apply() {
for module in "${MODULES[@]}"; do
local root="$(get_root "${module}")"
( set -e
cd third_party/"${module}"
git reset -q --hard
git clean -qfxd
git checkout -q "${root}"
if [[ "${module}" == tock ]]; then
cp -a ../../boards .
commit '00-boards'
fi
for file in ../../patches/"${module}"/*; do
git apply "${file}"
commit "$(basename "${file}" .patch)"
done
)
done
}
save() {
for module in "${MODULES[@]}"; do
local root="$(get_root "${module}")"
( set -e
cd third_party/"${module}"
[[ -z "$(git status -s)" ]] \
|| fail "The ${module} submodule is not clean."
rm -rf ../../patches/"${module}"
mkdir ../../patches/"${module}"
for file in $(git format-patch "${root}"); do
sed -n '/^diff/,$p' "${file}" \
| sed '/^-- $/,$d' > "../../patches/${module}/${file#*-}"
done
git clean -qfxd
top="$(get_head)"
git checkout -q "${root}"
if [[ "${module}" == tock ]]; then
rm -r boards
git apply --whitespace=nowarn ../../patches/"${module}"/00-boards.patch
rm ../../patches/tock/00-boards.patch
rm -r ../../boards
cp -a boards ../..
fi
git reset -q --hard
git clean -qfxd
git checkout -q "${top}"
)
done
}
grep -q third_party/tock .gitmodules 2>/dev/null \
|| fail 'Not running from OpenSK directory.'
[[ $# -eq 1 ]] || help
case $1 in
apply)
apply
success 'Applied the patches to the submodules.'
;;
save)
save
success 'Saved the submodules to the patches.'
;;
restore)
# Ovewrite the commit function to do nothing.
commit() { true; }
apply
success 'Restored the submodules.'
;;
*) fail 'Unexpected argument. Run without argument for help.' ;;
esac