apkbuilds @ 307af8fd5a3e74ebcb64ac5bbe57493b59ead233

feat: shamelessly copy pkgkit from sr.ht-apkbuilds

Copy some code from sourcehut's alpine build[0] to build my own
packages.

[0]: https://git.sr.ht/~sircmpwn/sr.ht-apkbuilds
  1diff --git a/build.yml b/build.yml
  2index 7b2adf7c05a341c27875ea6143209169a1addb03..f1aa3721a6240f9cf5e7e484ac7774317400a172 100644
  3--- a/build.yml
  4+++ b/build.yml
  5@@ -9,9 +9,9 @@   - openssl
  6   - rsync
  7   - alpine-sdk
  8 environment:
  9-  deploy: builds@gabrielgio.me
 10-  target: artifacts.gabrielgio.me/repo/
 11-  packages: ["genpass", "midr"]
 12+  remote: builds@gabrielgio.me
 13+  remote_path: /var/www/artifacts.gabrielgio.me/repo/
 14+  packages: []
 15 sources:
 16   - https://git.sr.ht/~gabrielgio/apkbuilds
 17 secrets:
 18@@ -19,14 +19,12 @@   - 008c4f67-b864-47f8-9790-cd32f2ae8516
 19   - df9d57f4-43bb-4084-a748-dbf02848bdd0
 20 tasks:
 21   - setup: |
 22-      echo "PACKAGER_PRIVKEY=\"/home/build/.abuild/mail@gabrielgio.me-62ddc4dc.rsa\"" > ~/.abuild/abuild.conf
 23+      cd apkbuilds 
 24+      ./pkgkit add-repo -s apks ~/.abuild/mail@gabrielgio.me-62ddc4dc.rsa
 25   - build: |
 26       cd apkbuilds
 27-      for pkg in "${packages[@]}"; do
 28-        cd "$pkg"
 29-        abuild -r
 30-        cd ..
 31-      done
 32+      ./pkgkit build -cu "${packages[@]}"
 33   - deploy: |
 34-      sshopts="ssh -o StrictHostKeyChecking=no"
 35-      rsync --rsh="$sshopts" -rP ~/packages/apkbuilds/ $deploy:/var/www/$target
 36+      cd apkbuilds
 37+      echo "StrictHostKeyChecking=no" >> ~/.ssh/config
 38+      ./pkgkit upload "$remote" "$remote_path" "${packages[@]}"
 39diff --git a/gallery-dl/APKBUILD b/pkgs/gallery-dl/APKBUILD
 40rename from gallery-dl/APKBUILD
 41rename to pkgs/gallery-dl/APKBUILD
 42diff --git a/genpass/APKBUILD b/pkgs/genpass/APKBUILD
 43rename from genpass/APKBUILD
 44rename to pkgs/genpass/APKBUILD
 45diff --git a/genpass/genpass.nginx.conf b/pkgs/genpass/genpass.nginx.conf
 46rename from genpass/genpass.nginx.conf
 47rename to pkgs/genpass/genpass.nginx.conf
 48diff --git a/jsonpickle/APKBUILD b/pkgs/jsonpickle/APKBUILD
 49rename from jsonpickle/APKBUILD
 50rename to pkgs/jsonpickle/APKBUILD
 51diff --git a/jsonpickle/tests.patch b/pkgs/jsonpickle/tests.patch
 52rename from jsonpickle/tests.patch
 53rename to pkgs/jsonpickle/tests.patch
 54diff --git a/midr/APKBUILD b/pkgs/midr/APKBUILD
 55rename from midr/APKBUILD
 56rename to pkgs/midr/APKBUILD
 57diff --git a/midr/midr.confd b/pkgs/midr/midr.confd
 58rename from midr/midr.confd
 59rename to pkgs/midr/midr.confd
 60diff --git a/midr/midr.initd b/pkgs/midr/midr.initd
 61rename from midr/midr.initd
 62rename to pkgs/midr/midr.initd
 63diff --git a/midr/midr.pre-install b/pkgs/midr/midr.pre-install
 64rename from midr/midr.pre-install
 65rename to pkgs/midr/midr.pre-install
 66diff --git a/nextcloud-api-wrapper/APKBUILD b/pkgs/nextcloud-api-wrapper/APKBUILD
 67rename from nextcloud-api-wrapper/APKBUILD
 68rename to pkgs/nextcloud-api-wrapper/APKBUILD
 69diff --git a/pkgkit b/pkgkit
 70new file mode 100755
 71index 0000000000000000000000000000000000000000..327c0ec37b8e14705866eec99aa91bf104e16130
 72--- /dev/null
 73+++ b/pkgkit
 74@@ -0,0 +1,336 @@
 75+#!/bin/sh -eu
 76+usage() {
 77+	printf "%s\n\n" "Usage: $0 [command...] [flags...] [args...]"
 78+	printf "%s\n" "$0 add-repo [-s] <name> <key>"
 79+	printf "\t%s\n" "Trusts <key> and adds the local repo to /etc/apk/repositories"
 80+	printf "\t%s\n\n" "-s: set this key as default in abuild.conf"
 81+	printf "%s\n" "$0 build [-cu] [-v <pkgver>] <packages...>"
 82+	printf "\t%s\n" "Builds packages"
 83+	printf "\t%s\n" "-c: update checksums"
 84+	printf "\t%s\n" "-u: update pkgrel"
 85+	printf "\t%s\n\n" "-v <pkgver>: update pkgver"
 86+	printf "%s\n" "$0 pkgver"
 87+	printf "\t%s\n\n" "Prints the suggested package ver for this directory"
 88+	printf "%s\n" "$0 upload <ssh server> <remote path> <packages...>"
 89+	printf "\t%s\n" "Uploads packages via rsync and updates remote APKINDEX"
 90+}
 91+
 92+get_pkgvar() (
 93+	var="$1"
 94+	set +u
 95+	. APKBUILD
 96+	eval 'printf "%s\n" "$'"$var"'"'
 97+)
 98+
 99+find_repos() (
100+	find . -maxdepth 1 -type d -not -name . -not -name .git
101+)
102+
103+find_pkg_repo() (
104+	pkg=$1
105+	for repo in $(find_repos)
106+	do
107+		if [ -d "$repo"/"$pkg" ]
108+		then
109+			echo "$repo"
110+			return 0
111+		fi
112+	done
113+	return 1
114+)
115+
116+update_pkgrel() (
117+	pkg="$1"
118+	pkgver="$(get_pkgvar pkgver)"
119+	prev_ver=$(apk search -x "$pkg" | cut -c$((${#pkg}+2))-)
120+	prev_pkgver=$(printf "%s" "$prev_ver" | cut -d'-' -f1)
121+	prev_pkgrel=$(printf "%s" "$prev_ver" | cut -d'-' -f2 | cut -d'r' -f2-)
122+	if [ "$prev_pkgver" == "$pkgver" ]
123+	then
124+		pkgrel=$((prev_pkgrel + 1))
125+		sed -e "s/pkgrel=.*/pkgrel=$pkgrel/" -i APKBUILD
126+	fi
127+)
128+
129+update_pkgver() {
130+	pkgver="$1"
131+	prev_pkgver=$(apk search -x ${project} | cut -d '-' -f2)
132+	sed -e "s/pkgver=.*/pkgver=$pkgver/" -i APKBUILD
133+	if [ "$prev_pkgver" != "$pkgver" ]
134+	then
135+		sed -e "s/pkgrel=.*/pkgrel=0/" -i APKBUILD
136+	fi
137+}
138+
139+add_repo() {
140+	set_default=0
141+	while getopts s flag
142+	do
143+		case $flag in
144+			s) set_default=1 ;;
145+			*) usage && exit 1 ;;
146+		esac
147+	done
148+	shift $((OPTIND-1))
149+	echo "$@"
150+	if [ $# -ne 2 ]
151+	then
152+		usage
153+		exit 1
154+	fi
155+	repo="$1"
156+	key="$2"
157+	mkdir -p ~/packages/$repo
158+	echo ~/packages/$repo | cat - /etc/apk/repositories > /tmp/repositories
159+	sudo mv /tmp/repositories /etc/apk/repositories
160+	if ! [ -f "$key" ]
161+	then
162+		echo "Warning: generating new abuild key"
163+		key="$HOME/.abuild/abuild.rsa"
164+		mkdir -p $HOME/.abuild
165+		(
166+			umask 0007
167+			openssl genrsa -out "$key" 2048
168+		)
169+	fi
170+	sudo openssl rsa -in $key -pubout \
171+		-out /etc/apk/keys/$(basename "$key").pub
172+	if [ $set_default -eq 1 ]
173+	then
174+		echo "PACKAGER_PRIVKEY="'"'$key'"' >> \
175+			~/.abuild/abuild.conf
176+	fi
177+}
178+
179+build() (
180+	builddeps=0
181+	checksum=0
182+	updpkgrel=0
183+	pkgver=""
184+	# Disable progress on abuild-apk
185+	cat <<-"EOF" | sudo tee /usr/local/bin/abuild-apk
186+	#!/bin/sh
187+	exec /usr/bin/abuild-apk --no-progress $@
188+	EOF
189+	sudo chmod +x /usr/local/bin/abuild-apk
190+	export PATH=/usr/local/bin:$PATH
191+	while getopts Rcuv: flag
192+	do
193+		case $flag in
194+			R) builddeps=1 ;;
195+			c) checksum=1 ;;
196+			u) updpkgrel=1 ;;
197+			v) pkgver="$OPTARG" ;;
198+			*) usage && exit 1 ;;
199+		esac
200+	done
201+	shift $((OPTIND-1))
202+	if [ $# -eq 0 ]
203+	then
204+		echo "No packages specified."
205+		exit 1
206+	fi
207+	for pkg in $@
208+	do
209+		repo="$(find_pkg_repo "$pkg")"
210+		(
211+			cd "$repo"/"$pkg"
212+			if [ -n "$pkgver" ]
213+			then
214+				update_pkgver "$pkgver"
215+			fi
216+			if [ $updpkgrel -eq 1 ]
217+			then
218+				update_pkgrel "$pkg"
219+			fi
220+			if [ $checksum -eq 1 ]
221+			then
222+				abuild checksum
223+			fi
224+			if [ $builddeps -eq 1 ]
225+			then
226+				abuild -R
227+			else
228+				abuild -r
229+			fi
230+		)
231+	done
232+)
233+
234+print_pkgver() {
235+	if [ $# -ne 0 ]
236+	then
237+		usage
238+		exit 1
239+	fi
240+	if [ -d .git ]
241+	then
242+		set +e
243+		pkgver=$(git describe --abbrev=0 2>/dev/null)
244+		if [ $? -ne 0 ]
245+		then
246+			pkgver=0
247+		fi
248+		set -e
249+		if ! git describe --exact-match HEAD >/dev/null 2>&1
250+		then
251+			cdate=$(git show -s -1 --format='%ci' HEAD)
252+			cdate=$(echo "$cdate" | cut -d' ' -f1 | sed -e 's/-//g')
253+			pkgver="${pkgver}_git${cdate}"
254+		fi
255+	elif [ -d .hg ]
256+	then
257+		pkgver=$(hg id -T '{latesttag}')
258+		if [ "$(hg id -T '{latesttagdistance}')" -ne 0 ]
259+		then
260+			pkgver="$(hg id -T '{latesttag}_hg{sub("-", "", date|shortdate)}')"
261+		fi
262+	else
263+		pkgver=unknown_0000
264+	fi
265+	echo "$pkgver"
266+}
267+
268+mirror_ver() (
269+	mirror="$1"
270+	pkg="$2"
271+	apk policy "$pkg" | while read -r line
272+	do
273+		case "$line" in
274+			*:)
275+				ver="${line%:}"
276+				ver="${ver## }"
277+				;;
278+			*$mirror*)
279+				echo "$ver"
280+				;;
281+		esac
282+	done
283+)
284+
285+get_aver() {
286+	aver="${REPOSITORY:-}"
287+	if [ ${#aver} -eq 0 ]
288+	then
289+		. /etc/os-release
290+		aver="v$(printf "%s" "$VERSION_ID" | cut -d. -f1-2)"
291+	fi
292+	echo "$aver"
293+}
294+
295+upload_pkg() (
296+	repo="$1"
297+	pkg="$2"
298+	arch="$(uname -m)"
299+	aver="$(get_aver)"
300+
301+	set -x
302+	path="$remote_path/$aver/$repo/$arch"
303+	ssh "$remote" mkdir -p "$path"
304+
305+	url=$(echo "$remote" | cut -d@ -f2)
306+	prev_ver=$(mirror_ver "$url" "$pkg")
307+
308+	for ver in $prev_ver
309+	do
310+		if [ "$prev_ver" != "none" ]
311+		then
312+			ssh "$remote" rm -f "$path/$pkg-$ver.apk"
313+		fi
314+	done
315+	pkgver="$(get_pkgvar pkgver)"
316+	pkgrel="$(get_pkgvar pkgrel)"
317+
318+	rsync --blocking-io -rsP \
319+		~/packages/"$repo/$arch/$pkg-$pkgver-r$pkgrel.apk" "$remote":"$path/"
320+	set +x
321+)
322+
323+update_index() (
324+	repo="$1"
325+	arch="$(uname -m)"
326+
327+	. /etc/os-release
328+	aver="$(get_aver)"
329+
330+	path="$remote_path/$aver/$repo/$arch"
331+
332+	set -x
333+	ssh "$remote" \
334+		find "$path" -type f -name '*.apk' -print0 |
335+		ssh "$remote" xargs -0 apk index \
336+			--rewrite-arch "$(uname -m)" \
337+			-x "$path"/APKINDEX.tar.gz \
338+			-o "$path"/APKINDEX.unsigned.tar.gz
339+	rsync --blocking-io -rP \
340+		"$remote:$path/APKINDEX.unsigned.tar.gz" \
341+		/tmp/APKINDEX.tar.gz
342+	abuild-sign /tmp/APKINDEX.tar.gz
343+	rsync --blocking-io -rP /tmp/APKINDEX.tar.gz "$remote:$path/"
344+	set +x
345+)
346+
347+upload() (
348+	if [ $# -lt 2 ]
349+	then
350+		usage
351+		exit 1
352+	fi
353+	remote="$1"
354+	remote_path="$2"
355+	shift 2
356+	if [ $# -eq 0 ]
357+	then
358+		echo "No packages specified"
359+		exit 1
360+	fi
361+	repos=""
362+	for pkg in $@
363+	do
364+		repo=$(find_pkg_repo "$pkg")
365+		if ! echo "$repos" | grep "$repo" >/dev/null
366+		then
367+			repos="$repo $repos"
368+		fi
369+		(
370+			cd "$repo"/"$pkg"
371+			arch="$(get_pkgvar arch)"
372+			subpkgs="$pkg:_:$arch $(get_pkgvar subpackages)"
373+			for subpkg in $subpkgs
374+			do
375+				name="$(echo "$subpkg" | cut -d':' -f1)"
376+				upload_pkg "$repo" "$name"
377+			done
378+		)
379+	done
380+	for repo in $repos
381+	do
382+		update_index $repo
383+	done
384+)
385+
386+if [ $# -lt 1 ]
387+then
388+	usage
389+	exit 1
390+fi
391+cmd="$1"
392+shift
393+
394+case "$cmd" in
395+	add-repo)
396+		add_repo "$@"
397+		;;
398+	build)
399+		build "$@"
400+		;;
401+	pkgver)
402+		print_pkgver "$@"
403+		;;
404+	upload)
405+		upload "$@"
406+		;;
407+	help|-h)
408+		usage
409+		;;
410+esac
411diff --git a/reddit-nextcloud-importer/APKBUILD b/pkgs/reddit-nextcloud-importer/APKBUILD
412rename from reddit-nextcloud-importer/APKBUILD
413rename to pkgs/reddit-nextcloud-importer/APKBUILD
414diff --git a/reddit-nextcloud-importer/reddit-nextcloud-importer.confd b/pkgs/reddit-nextcloud-importer/reddit-nextcloud-importer.confd
415rename from reddit-nextcloud-importer/reddit-nextcloud-importer.confd
416rename to pkgs/reddit-nextcloud-importer/reddit-nextcloud-importer.confd
417diff --git a/reddit-nextcloud-importer/reddit-nextcloud-importer.initd b/pkgs/reddit-nextcloud-importer/reddit-nextcloud-importer.initd
418rename from reddit-nextcloud-importer/reddit-nextcloud-importer.initd
419rename to pkgs/reddit-nextcloud-importer/reddit-nextcloud-importer.initd
420diff --git a/reddit-nextcloud-importer/reddit-nextcloud-importer.pre-install b/pkgs/reddit-nextcloud-importer/reddit-nextcloud-importer.pre-install
421rename from reddit-nextcloud-importer/reddit-nextcloud-importer.pre-install
422rename to pkgs/reddit-nextcloud-importer/reddit-nextcloud-importer.pre-install
423diff --git a/submit-builds b/submit-builds
424new file mode 100755
425index 0000000000000000000000000000000000000000..de6c58d4512d8197c2239cf4e47a9c4bb3f6909e
426--- /dev/null
427+++ b/submit-builds
428@@ -0,0 +1,66 @@
429+#!/bin/sh
430+upstream=https://builds.sr.ht
431+manifest=build.yml
432+
433+if [ -e ~/.config/sr.ht ]
434+then
435+	. ~/.config/sr.ht
436+fi
437+
438+while getopts m:u:t:h flag
439+do
440+	case $flag in
441+		u)
442+			upstream="$OPTARG"
443+			;;
444+		t)
445+			bearer_token="$OPTARG"
446+			;;
447+		m)
448+			manifest="$OPTARG"
449+			;;
450+		h)
451+			echo "Usage: $0 [-u https://upstream...] [-t oauth token] <packages...>"
452+			exit 0
453+			;;
454+	esac
455+done
456+shift $((OPTIND-1))
457+
458+builds=""
459+note=""
460+for target in $*
461+do
462+	if [ "$builds" = "" ]
463+	then
464+		builds="'${target#sr.ht/}'"
465+		note="${target#sr.ht/}"
466+	else
467+		builds="$builds, '${target#sr.ht/}'"
468+		if [ "${#note}" -lt 128 ]
469+		then
470+			note="$note, ${target#sr.ht/}"
471+		fi
472+	fi
473+done
474+
475+vars="$(sed "s/packages: \\[\\]/packages: [$builds]/g" < $manifest | jq -sR '{
476+	"manifest": .,
477+	"tags": ["sr.ht-apkbuilds"],
478+	"note": "'"$note"'"
479+}')"
480+query="$(jq -sR '.' <<"EOF"
481+mutation SubmitJob($manifest: String!, $tags: [String!]!, $note: String!) {
482+	submit(manifest: $manifest, tags: $tags, note: $note) {
483+		id, tags
484+	}
485+}
486+EOF
487+)"
488+
489+curl --oauth2-bearer "$bearer_token" \
490+	-H Content-Type:application/json \
491+	-d '{
492+		"query": '"$query"',
493+		"variables": '"$vars"'
494+	}' "$upstream/query" | jq .