summaryrefslogtreecommitdiff
path: root/fetch
blob: 502c0f76725bb9ae5d95ed36eff2d9b786eda772 (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
132
133
134
#!/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

name=""
revision=""
location=""
url=""
bkup_url=""
tmp_dir=""
depend=""

main()
{
	if [ -z "${1+x}" ]; then
		err 'Error: name not set'
	fi

	name=${1}

	read_config
	verify_config

	clone_project

	# dependencies are downloaded *after*
	# to account for cases like gnulib in grub where
	# the dependency (gnulib) goes inside the main repo (grub)
	if [ "${depend}" != "" ]; then
		./fetch ${depend} || exit 1
	fi

	# clean in case of failure
	rm -Rf ${tmp_dir} >/dev/null 2>&1 || exit 1
}

read_config()
{
	awkstr=" /\{.*${name}.*}{/ {flag=1;next} /\}/{flag=0} flag { print }"
	while read -r line ; do
		set ${line} >/dev/null 2>&1
		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()
{
	if [ -z "${revision+x}" ]; then
		err 'Error: revision not set'
	elif [ -z "${location+x}" ]; then
		err 'Error: location not set'
	elif [ -z "${url+x}" ]; then
		err 'Error: url not set'
	fi
}

clone_project()
{
	tmp_dir=$(mktemp -dt "${name}_XXXXX")

	git clone ${url} ${tmp_dir} || git clone ${bkup_url} ${tmp_dir} \
			|| err "ERROR: could not download ${name}"

	(
	cd ${tmp_dir} || err "tmpdir not created"
	git reset --hard ${revision} || err "Cannot reset revision"
	)

	patch_project

	if [ -d "${location}" ]; then
		rm -Rf ${location} || err "Cannot remove directory '${location}'"
	fi
	mv ${tmp_dir} ${location} && return 0

	printf "ERROR: Could not copy temp file to destination.\n"
	err " ${tmp_dir} > ${location} check permissions"
}

patch_project()
{
	patchdir="resources/${name}/patches"

	for patchfile in ${PWD}/${patchdir}/*.patch ; do
		if [ ! -f "${patchfile}" ]; then
			continue
		fi
		(
		cd ${tmp_dir} || err "tmpdir not created"
		git am ${patchfile} || err "Cannot patch project: $name"
		)
	done
}

usage()
{
	cat <<- EOF
	Usage: ./fetch [name]

	Options:
	name: Module name as specified in resources/git/revisions
	EOF
}

err()
{
	printf "${@}\n"
	usage
	rm -Rf ${tmp_dir} >/dev/null 2>&1
	exit 1
}

main $@