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 $@  | 
