aboutsummaryrefslogtreecommitdiff
path: root/tools/cpm/package/util/fetch.sh
blob: 7db568f3e69bd7c3a8076750c4024d8dcd9a809c (plain) (blame)
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
#!/bin/sh -e

# SPDX-FileCopyrightText: Copyright 2026 crueter
# SPDX-License-Identifier: LGPL-3.0-or-later

# shellcheck disable=SC1091
. "$SCRIPTS"/../common.sh

download_package() {
	mkdir -p "$CPM_SOURCE_CACHE"

	tmp=$(make_temp_dir)

	FILENAME=$(basename "$DOWNLOAD")

	OUTFILE="$tmp/$FILENAME"

	OUTDIR="${CPM_SOURCE_CACHE}/${LOWER_PACKAGE}/${KEY}"
	if [ -d "$OUTDIR" ]; then return; fi

	curl "$DOWNLOAD" -sS -L -o "$OUTFILE"

	ACTUAL_HASH=$(sha512sum "$OUTFILE" | cut -d" " -f1)
	if [ "$ACTUAL_HASH" != "$HASH" ]; then
		echo "!! $FILENAME did not match expected hash; expected $HASH but got $ACTUAL_HASH" >&2
		exit 1
	fi

	TMPDIR="$tmp/extracted"
	mkdir -p "$OUTDIR"
	mkdir -p "$TMPDIR"

	PREVDIR="$PWD"
	mkdir -p "$TMPDIR"
	cd "$TMPDIR"

	case "$FILENAME" in
	*.7z)
		must_install 7z
		7z x "$OUTFILE" >/dev/null
		;;
	*.tar*)
		# TODO: Extensions
		must_install tar
		tar xf "$OUTFILE" >/dev/null
		;;
	*.zip)
		must_install unzip
		unzip "$OUTFILE" >/dev/null
		;;
	esac

	# basically if only one real item exists at the top we just move everything from there
	# since github and some vendors hate me
	DIRS=$(find . -maxdepth 1 -type d -o -type f)

	# thanks gnu
	if [ "$(echo "$DIRS" | wc -l)" -eq 2 ]; then
		SUBDIR=$(find . -maxdepth 1 -type d -not -name ".")
		mv "$SUBDIR"/* "$OUTDIR"
		mv "$SUBDIR"/.* "$OUTDIR" 2>/dev/null || true
		rmdir "$SUBDIR"
	else
		mv ./* "$OUTDIR"
		mv ./.* "$OUTDIR" 2>/dev/null || true
	fi

	cd "$OUTDIR"

	# TODO: Common custom patch/source cache dirs
	if echo "$JSON" | grep -e "patches" >/dev/null; then
		PATCHES=$(echo "$JSON" | jq -r '.patches | join(" ")')
		for patch in $PATCHES; do
			abs_patch="$CPMUTIL_PATCH_DIR/$PACKAGE/$patch"
			if [ ! -f "$abs_patch" ]; then
				echo "-- * Attempted to apply nonexistent patch $patch!"
				continue
			fi

			echo "-- * Applying patch $patch"
			patch --binary -p1 <"$abs_patch"
		done
	fi

	cd "$PREVDIR"

	rm -rf "$tmp"
}

# TODO: individual platform fetch?
ci_package() {
	[ "$REPO" != null ] || { echo "-- ! No repo defined" && return; }
	mkdir -p "$CPM_SOURCE_CACHE"

	echo "-- CI package $PACKAGE_NAME"

	for platform in \
		windows-amd64 windows-arm64 \
		mingw-amd64 mingw-arm64 \
		android-aarch64 android-x86_64 \
		linux-amd64 linux-aarch64 \
		macos-universal ios-aarch64; do
		echo "-- * platform $platform"

		case $DISABLED in
		*"$platform"*)
			echo "-- * -- disabled"
			continue
			;;
		esac

		FILENAME="${NAME}-${platform}-${VERSION}.${EXT}"
		DOWNLOAD="https://$GIT_HOST/${REPO}/releases/download/v${VERSION}/${FILENAME}"
		KEY="$platform-$VERSION"

		OUTDIR="${CPM_SOURCE_CACHE}/${LOWER_PACKAGE}/${KEY}"
		[ -d "$OUTDIR" ] && continue

		HASH_URL="${DOWNLOAD}.sha512sum"

		HASH=$(curl "$HASH_URL" -sS -q -L -o -)

		download_package
	done
}

fetch_package() {
	if [ "$CI" = "true" ]; then
		ci_package
	else
		echo "-- Downloading regular package $PACKAGE, with key $KEY, from $DOWNLOAD"
		download_package
	fi
}