Files
lbmk/script/update/project/repo
Leah Rowe f45f5e625d update/project/*: remove redundant checks
these scripts used to be in the main directory of
lbmk, and thus needed to check for root user, and
also git credentials. now they are called by the main
lbmk script, which also runs the same checks.

avoid waste of resources by not running the same
check twice.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2023-09-09 22:30:22 +01:00

123 lines
2.7 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()
{
[ $# -gt 0 ] || fail "no argument given"
[ -z "${1+x}" ] && fail 'main(): name not set'
name=${1}
read_config
verify_config
clone_project
[ "${depend}" = "" ] || for d in ${depend} ; do
./update project repo ${d} || \
fail "Cannot fetch dependency, ${d}, for project, ${name}"
done
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="${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 $@