mirror of
https://codeberg.org/libreboot/lbmk.git
synced 2026-07-11 14:02:52 +02:00
4d3b16da38
My previous patch b0rked memtest and others because when making sure their parent directory (the project root) exists, it would instead create the project directory (memtest86lus). The later move would then put the git repo inside that (memtest86plus/memtest86plus_123456). We just need to make sure we don't create the target directory itself. This way, there's no need to hardcode any project names. Tested by ./updating rpi-pico-serprog, memtest86plus, grub and seabios. Signed-off-by: Riku Viitanen <riku.viitanen@protonmail.com>
128 lines
2.9 KiB
Bash
Executable File
128 lines
2.9 KiB
Bash
Executable File
#!/usr/bin/env sh
|
|
|
|
# SPDX-FileCopyrightText: 2022 Caleb La Grange <thonkpeasant@protonmail.com>
|
|
# SPDX-FileCopyrightText: 2022 Ferass El Hafidi <vitali64pmemail@protonmail.com>
|
|
# SPDX-FileCopyrightText: 2023 Leah Rowe <leah@libreboot.org>
|
|
# SPDX-License-Identifier: GPL-3.0-only
|
|
|
|
. "include/err.sh"
|
|
|
|
name=""
|
|
revision=""
|
|
location=""
|
|
url=""
|
|
bkup_url=""
|
|
tmp_dir="tmp/gitclone"
|
|
depend=""
|
|
|
|
main()
|
|
{
|
|
id -u 1>/dev/null 2>/dev/null || \
|
|
fail "cannot ascertain user id"
|
|
if [ "$(id -u)" = "0" ]; then
|
|
fail "running lbmk as root is not permitted"
|
|
fi
|
|
./checkgit || err "Please read: https://libreboot.org/docs/build/"
|
|
|
|
[ $# -gt 0 ] || fail "no argument given"
|
|
|
|
[ -z "${1+x}" ] && fail 'main(): name not set'
|
|
name=${1}
|
|
|
|
read_config
|
|
verify_config
|
|
|
|
clone_project
|
|
[ "${depend}" = "" ] || ./update project repo ${depend} || \
|
|
fail "Cannot fetch dependency, ${depend}, for project, ${name}"
|
|
|
|
rm -Rf "${tmp_dir}" || fail "cannot remove tmpdir, ${tmp_dir}"
|
|
}
|
|
|
|
read_config()
|
|
{
|
|
awkstr=" /\{.*${name}.*}{/ {flag=1;next} /\}/{flag=0} flag { print }"
|
|
while read -r line ; do
|
|
set ${line} || fail "read_config: set line"
|
|
case ${line} in
|
|
rev:*)
|
|
revision=${2} ;;
|
|
loc:*)
|
|
location=${2} ;;
|
|
url:*)
|
|
url=${2} ;;
|
|
bkup_url:*)
|
|
bkup_url=${2} ;;
|
|
depend:*)
|
|
depend=${2} ;;
|
|
esac
|
|
done << EOF
|
|
$(eval "awk '${awkstr}' config/git/revisions")
|
|
EOF
|
|
}
|
|
|
|
verify_config()
|
|
{
|
|
[ -z "${revision+x}" ] && fail 'verify_config: revision not set'
|
|
[ -z "${location+x}" ] && fail 'verify_config: location not set'
|
|
[ -z "${url+x}" ] && fail 'verify_config: url not set'
|
|
}
|
|
|
|
clone_project()
|
|
{
|
|
rm -Rf "${tmp_dir}" || fail "clone_project: cannot remove old tmpdir"
|
|
mkdir -p "${tmp_dir%/*}" || fail "clone_project: can't mkdir"
|
|
|
|
git clone ${url} "${tmp_dir}" || git clone ${bkup_url} "${tmp_dir}" || \
|
|
fail "clone_project: could not download ${name}"
|
|
(
|
|
cd "${tmp_dir}" || fail "clone_project: tmpdir not created"
|
|
git reset --hard ${revision} || \
|
|
fail "clone_project: Cannot reset revision"
|
|
)
|
|
patch_project
|
|
|
|
[ ! -d "${location}" ] || \
|
|
rm -Rf "${location}" || \
|
|
fail "clone_project: Can't remove directory '${location}'"
|
|
[ "${location}" = "${location%/*}" ] || mkdir -p ${location%/*} || \
|
|
fail "clone_project: cannot make directory for ${name}"
|
|
mv "${tmp_dir}" "${location}" || \
|
|
fail "clone_project: could not copy temp file to destination"
|
|
}
|
|
|
|
patch_project()
|
|
{
|
|
patchdir="config/${name}/patches"
|
|
|
|
for patchfile in "${PWD}/${patchdir}"/*.patch ; do
|
|
[ -f "${patchfile}" ] || continue
|
|
(
|
|
cd "${tmp_dir}" || fail "patch_project: tmpdir unavailable"
|
|
git am "${patchfile}" || \
|
|
fail "patch_project: Cannot patch project: $name"
|
|
)
|
|
done
|
|
}
|
|
|
|
fail()
|
|
{
|
|
for x in "${location}" "${tmp_dir}"; do
|
|
[ -z "${x}" ] || [ ! -d "${x}" ] || rm -Rf "${location}" || :
|
|
done
|
|
usage
|
|
err "${1}"
|
|
}
|
|
|
|
usage()
|
|
{
|
|
cat <<- EOF
|
|
Usage: ./update project repo [name]
|
|
|
|
Options:
|
|
name: Module name as specified in config/git/revisions
|
|
EOF
|
|
}
|
|
|
|
main $@
|