#!/usr/bin/env sh # SPDX-License-Identifier: GPL-3.0-only # SPDX-FileCopyrightText: 2022 Caleb La Grange # SPDX-FileCopyrightText: 2022 Ferass El Hafidi # SPDX-FileCopyrightText: 2023 Leah Rowe . "include/err.sh" . "include/git.sh" name="" revision="" location="" url="" bkup_url="" tmp_dir="${PWD}/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() { revfile="$(mktemp -t gitrevisions.XXXXXXXXXX)" || \ fail "read_config: Cannot initialise tmpfile" cat config/git/* > "${revfile}" || \ fail "read_config: Cannot concatenate revision files" 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}\" \"${revfile}\"") EOF rm -f "${revfile}" || \ fail "read_config: can't remove tmp revfile" } 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" ) git_am_patches "${tmp_dir}" "${PWD}/config/${name}/patches" "fail" || \ fail "clone_project ${location}/: cannot apply patches" [ ! -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" } 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 files under config/git/ EOF } main $@