summaryrefslogtreecommitdiff
path: root/script/update/project/repo
blob: d951fb3bf1eb51a1d21b26bea74e8f73ab2367d0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#!/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()
{
	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"
	)
	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 files under config/git/
	EOF
}

main $@