summaryrefslogtreecommitdiff
path: root/script/update/project/repo
diff options
context:
space:
mode:
Diffstat (limited to 'script/update/project/repo')
-rwxr-xr-xscript/update/project/repo124
1 files changed, 124 insertions, 0 deletions
diff --git a/script/update/project/repo b/script/update/project/repo
new file mode 100755
index 00000000..270d6cb9
--- /dev/null
+++ b/script/update/project/repo
@@ -0,0 +1,124 @@
+#!/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=""
+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}" = "" ] || ./fetch ${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}' resources/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()
+{
+ tmp_dir=$(mktemp -dt "${name}_XXXXX")
+
+ 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}'"
+ mv "${tmp_dir}" "${location}" || \
+ fail "clone_project: could not copy temp file to destination"
+}
+
+patch_project()
+{
+ patchdir="resources/${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: ./fetch [name]
+
+ Options:
+ name: Module name as specified in resources/git/revisions
+ EOF
+}
+
+main $@