diff options
Diffstat (limited to 'script/update/project/repo')
-rwxr-xr-x | script/update/project/repo | 124 |
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 $@ |