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 .