Compare commits

..
Author SHA1 Message Date
Felitendo 14deed65d7 gnome-network-displays-bin: add package (0.99.0-1) 2026-07-24 10:31:31 +02:00
github-actions[bot] 254a666c0d chiaki-ng-bin: update to 1.10.0-1 [skip ci] 2026-07-24 08:00:07 +00:00
Felitendo 83db919716 chiaki-ng-bin: apply Qt6GuiPrivate patch only when the tag lacks the fix 2026-07-24 09:56:46 +02:00
github-actions[bot] f42572b41a linux-wallpaperengine-bin: update to r627.b016d7d-1 [skip ci] 2026-07-24 07:32:57 +00:00
github-actions[bot] 1515c673ea bazaar-bin: update to 0.9.1-1 [skip ci] 2026-07-24 07:20:52 +00:00
Felitendo 66736f3fcb README: add the ten new packages to the table 2026-07-24 09:18:54 +02:00
Felitendo 4014aefcdd trayscale-bin: add package (0.18.9-1) 2026-07-24 09:18:54 +02:00
Felitendo 176c0b4e6e bazaar-bin, chiaki-ng-bin, linux-wallpaperengine-bin: add packages (built and published by CI) 2026-07-24 09:13:19 +02:00
Felitendo ca968f0e26 planify-bin: add package (4.19.5-1) 2026-07-24 09:13:19 +02:00
Felitendo 827762a6d4 librepods-bin: add package (1.0.0rc1-1) 2026-07-24 09:13:19 +02:00
Felitendo 41c6862577 snapx-bin: add package (0.4.0-1) 2026-07-24 09:13:19 +02:00
Felitendo b37fa50d17 modrinth-app-bin: add package (0.15.20-1) 2026-07-24 09:13:19 +02:00
Felitendo 9bdaa7d21e Clean up downloaded .deb files after checksum-mode updates 2026-07-24 09:13:19 +02:00
Felitendo d8e0993820 wiiudownloader-bin: add package (2.98-1) 2026-07-24 09:13:19 +02:00
Felitendo 051b93e662 vacuumtube-bin: add package (1.8.1-1) 2026-07-24 09:13:19 +02:00
github-actions[bot] 78ed7f1c67 bottles-bin: update to 64.1-1 [skip ci] 2026-07-24 06:27:25 +00:00
Felitendo 6210551a30 README: add bottles, faugus-launcher, protonplus and zapzap to the table 2026-07-24 08:26:27 +02:00
Felitendo 1cac0a49ba bottles-bin: add package (built and published by CI) 2026-07-24 08:26:27 +02:00
Felitendo 4daa234303 protonplus-bin: add package (0.5.21-1) 2026-07-24 08:26:27 +02:00
Felitendo f7ec4c0615 zapzap-bin: add package (7.0.3-1) 2026-07-24 08:26:27 +02:00
Felitendo 8098f4a62c faugus-launcher-bin: add package (2.0.2-1) 2026-07-24 08:26:27 +02:00
Felitendo ff38c61e10 README: add gearlever-bin to the package table 2026-07-24 02:10:35 +02:00
Felitendo ef3af9f483 gearlever-bin: add package (4.6.2-1) 2026-07-24 02:10:35 +02:00
Felitendo 89206f1cd5 README: add thonny-bin to the package table 2026-07-23 09:16:03 +02:00
Felitendo e509576181 thonny-bin: add package (5.0.0-1) 2026-07-23 09:03:28 +02:00
github-actions[bot] b14cd21d70 sharpemu-bin: update to 0.0.2_beta.5-1 [skip ci] 2026-07-23 01:08:19 +00:00
Felitendo 8b3302d335 sharpemu-bin: add package (0.0.2_beta.4-1) 2026-07-22 06:53:10 +02:00
Felitendo db74a6b65a Prune superseded GitHub releases after publishing 2026-07-21 13:36:03 +02:00
Felitendo 0d9fea0a51 Queue workflow runs instead of racing on AUR pushes 2026-07-21 13:32:03 +02:00
Felitendo f215a99c11 chromium-widevine-helper-bin: add package (1.0.8-1) 2026-07-21 13:22:18 +02:00
github-actions[bot] abe8b73474 timetable-bin: update to 4.2.1-1 [skip ci] 2026-07-21 01:06:19 +00:00
github-actions[bot] 18a2e308b8 timetable-bin: update to 4.1-1 [skip ci] 2026-07-18 18:57:34 +00:00
Felitendo 1a83bd9eb9 timetable-bin: add missing runtime deps (4.0-2)
Upstream 4.0 replaced python-webuntis with pyotp for authentication and
unconditionally imports libsecret (credential storage) and WebKitGTK 6.0
at startup. Add python-pyotp, libsecret and webkitgtk-6.0 to depends.

Stop bundling the webuntis wheel from the next artifact build on; the
existing 4.0 artifact is reused as-is (its bundled copy is unused and
inert).
2026-07-18 15:10:59 +02:00
github-actions[bot] be1973ee39 timetable-bin: update to 4.0-1 [skip ci] 2026-07-18 01:05:31 +00:00
Felitendo 6a29785de6 Move AUR commit email to a secret 2026-07-17 12:53:07 +02:00
Felitendo 04d0a09896 Add fluxer-bin; support packages with upstream-hosted binaries 2026-07-17 10:58:06 +02:00
Felitendo bd4ed84ab3 Pass AUR SSH key via GIT_SSH_COMMAND instead of ~/.ssh 2026-07-17 10:25:52 +02:00
Felitendo 7baaa60cf2 Fix dubious-ownership git error in CI container 2026-07-17 09:46:28 +02:00
70 changed files with 2448 additions and 90 deletions

No files matched your search

+10 -4
View File
@@ -8,11 +8,17 @@ on:
push:
branches: [main]
paths:
- '*/PKGBUILD'
- '*/pkg.sh'
- 'scripts/**'
# any package file (PKGBUILD, pkg.sh, .desktop, ...) and the shared script
- '*/*'
- '.github/workflows/update.yml'
# Never run twice at once: concurrent runs race on pushing to this repository
# and to the AUR (e.g. a push-triggered run and a manual dispatch both creating
# a new AUR repo). Queue instead of cancelling so every trigger still lands.
concurrency:
group: aur-update
cancel-in-progress: false
permissions:
contents: write
@@ -51,5 +57,5 @@ jobs:
env:
AUR_SSH_PRIVATE_KEY: ${{ secrets.AUR_SSH_PRIVATE_KEY }}
AUR_GIT_NAME: ${{ vars.AUR_GIT_NAME }}
AUR_GIT_EMAIL: ${{ vars.AUR_GIT_EMAIL }}
AUR_GIT_EMAIL: ${{ secrets.AUR_GIT_EMAIL }}
run: bash scripts/update-package.sh "${{ matrix.package }}"
+2
View File
@@ -1,5 +1,7 @@
# makepkg build leftovers and downloaded/built artifacts
*.tar.zst
*.tar.gz
*.pkg.tar.*
*/src/
*/pkg/
*.deb
+41 -11
View File
@@ -11,8 +11,9 @@ package's upstream for a new release. When one is found it:
release of **this** repository (tag `<pkgname>-<version>`),
3. updates the `PKGBUILD` (pkgver/pkgrel/sha256sums), test-builds it with
`makepkg` and regenerates `.SRCINFO`,
4. commits the changes back to this repository, and
5. pushes `PKGBUILD` + `.SRCINFO` to the AUR.
4. commits the changes back to this repository,
5. pushes `PKGBUILD` + `.SRCINFO` to the AUR, and
6. deletes the package's superseded releases (older versions, tag included).
The AUR packages themselves only download the prebuilt asset from step 2, so
users don't need any build dependencies.
@@ -22,6 +23,26 @@ users don't need any build dependencies.
| Package | Upstream | AUR |
|---|---|---|
| `timetable-bin` | [ostfriese4/untis](https://codeberg.org/ostfriese4/untis) — "Timetable", a GTK4 + LibAdwaita client for WebUntis | [timetable-bin](https://aur.archlinux.org/packages/timetable-bin) |
| `fluxer-bin` | [fluxer.app](https://fluxer.app) — Fluxer desktop client (Electron) | [fluxer-bin](https://aur.archlinux.org/packages/fluxer-bin) |
| `chromium-widevine-helper-bin` | [GloriousEggroll/chromium-widevine-helper](https://github.com/GloriousEggroll/chromium-widevine-helper) — extension + native helper installing Google's Widevine CDM into Chromium-based browser profiles | [chromium-widevine-helper-bin](https://aur.archlinux.org/packages/chromium-widevine-helper-bin) |
| `sharpemu-bin` | [sharpemu/sharpemu](https://github.com/sharpemu/sharpemu) — experimental PlayStation 5 emulator | [sharpemu-bin](https://aur.archlinux.org/packages/sharpemu-bin) |
| `thonny-bin` | [thonny/thonny](https://github.com/thonny/thonny) — Python IDE for beginners (bundles a standalone CPython + tcl/tk) | [thonny-bin](https://aur.archlinux.org/packages/thonny-bin) |
| `gearlever-bin` | [mijorus/gearlever](https://github.com/mijorus/gearlever) — "Gear Lever", a GTK4 + LibAdwaita AppImage manager | [gearlever-bin](https://aur.archlinux.org/packages/gearlever-bin) |
| `bottles-bin` | [bottlesdevs/Bottles](https://github.com/bottlesdevs/Bottles) — wine/proton prefix manager (GTK4 + LibAdwaita) | [bottles-bin](https://aur.archlinux.org/packages/bottles-bin) |
| `faugus-launcher-bin` | [Faugus/faugus-launcher](https://github.com/Faugus/faugus-launcher) — launcher for Windows games via UMU-Launcher | [faugus-launcher-bin](https://aur.archlinux.org/packages/faugus-launcher-bin) |
| `protonplus-bin` | [Vysp3r/ProtonPlus](https://github.com/Vysp3r/ProtonPlus) — compatibility-tools manager (Vala/GTK4) | [protonplus-bin](https://aur.archlinux.org/packages/protonplus-bin) |
| `zapzap-bin` | [rafatosta/zapzap](https://github.com/rafatosta/zapzap) — WhatsApp desktop client (PyQt6 + WebEngine) | [zapzap-bin](https://aur.archlinux.org/packages/zapzap-bin) |
| `vacuumtube-bin` | [shy1132/VacuumTube](https://github.com/shy1132/VacuumTube) — YouTube Leanback (TV UI) with built-in adblocker (repackaged upstream deb) | [vacuumtube-bin](https://aur.archlinux.org/packages/vacuumtube-bin) |
| `wiiudownloader-bin` | [Xpl0itU/WiiUDownloader](https://github.com/Xpl0itU/WiiUDownloader) — Wii U title downloader (Go + GTK3) | [wiiudownloader-bin](https://aur.archlinux.org/packages/wiiudownloader-bin) |
| `trayscale-bin` | [DeedleFake/trayscale](https://github.com/DeedleFake/trayscale) — GUI for the Tailscale CLI (Go + GTK4) | [trayscale-bin](https://aur.archlinux.org/packages/trayscale-bin) |
| `linux-wallpaperengine-bin` | [Almamu/linux-wallpaperengine](https://github.com/Almamu/linux-wallpaperengine) — Wallpaper Engine on Linux (commit snapshots, bundles CEF) | [linux-wallpaperengine-bin](https://aur.archlinux.org/packages/linux-wallpaperengine-bin) |
| `librepods-bin` | [librepods-org/librepods](https://github.com/librepods-org/librepods) — AirPods integration for Linux (Qt6) | [librepods-bin](https://aur.archlinux.org/packages/librepods-bin) |
| `planify-bin` | [alainm23/planify](https://github.com/alainm23/planify) — task manager with Todoist/Nextcloud support (Vala/GTK4, bundles gxml) | [planify-bin](https://aur.archlinux.org/packages/planify-bin) |
| `modrinth-app-bin` | [modrinth/code](https://github.com/modrinth/code) — Modrinth's Minecraft mod manager/launcher (repackaged upstream deb) | [modrinth-app-bin](https://aur.archlinux.org/packages/modrinth-app-bin) |
| `bazaar-bin` | [bazaar-org/bazaar](https://github.com/bazaar-org/bazaar) — GNOME app store for flatpaks/Flathub | [bazaar-bin](https://aur.archlinux.org/packages/bazaar-bin) |
| `snapx-bin` | [SnapXL/SnapX](https://github.com/SnapXL/SnapX) — ShareX-fork screenshot/sharing tool (repackaged upstream bundle) | [snapx-bin](https://aur.archlinux.org/packages/snapx-bin) |
| `chiaki-ng-bin` | [streetpea/chiaki-ng](https://github.com/streetpea/chiaki-ng) — PlayStation Remote Play client (Qt6) | [chiaki-ng-bin](https://aur.archlinux.org/packages/chiaki-ng-bin) |
| `gnome-network-displays-bin` | [GNOME/gnome-network-displays](https://gitlab.gnome.org/GNOME/gnome-network-displays) — GNOME screencasting (Miracast/Chromecast) | [gnome-network-displays-bin](https://aur.archlinux.org/packages/gnome-network-displays-bin) |
## Setup (one-time)
@@ -30,9 +51,9 @@ users don't need any build dependencies.
2. Add the matching **private** key as a repository secret named
`AUR_SSH_PRIVATE_KEY`
(Settings → Secrets and variables → Actions → New repository secret).
3. Optionally set the repository **variables** `AUR_GIT_NAME` and
`AUR_GIT_EMAIL` to control the commit identity used on the AUR
(defaults: `Felitendo` / `95575686+Felitendo@users.noreply.github.com`).
3. Optionally set the repository variable `AUR_GIT_NAME` and the repository
**secret** `AUR_GIT_EMAIL` to control the commit identity used on the AUR
(defaults: `Felitendo` / the maintainer's GitHub noreply address).
The first push to `ssh://aur@aur.archlinux.org/<pkgname>.git` creates the AUR
package automatically.
@@ -44,12 +65,21 @@ Create a new directory named after the AUR package containing:
- **`PKGBUILD`** — sources the prebuilt asset from
`https://github.com/Felitendo/PKGBUILDS/releases/download/<pkgname>-<pkgver>/<pkgname>-<pkgver>.tar.zst`.
`pkgver`, `pkgrel` and `sha256sums` are maintained by CI.
- **`pkg.sh`** — bash sourced by [scripts/update-package.sh](scripts/update-package.sh),
providing:
- `BUILD_DEPS` — array of Arch packages installed before building,
- `latest_version` — prints the latest upstream version (no `v` prefix),
- `build_artifact <version> <output-file>` — downloads/builds upstream and
writes the install tree (a tarball containing `usr/`) to `<output-file>`.
- **`pkg.sh`** — bash sourced by [scripts/update-package.sh](scripts/update-package.sh).
Always provides `latest_version` (prints the latest upstream version, no
`v` prefix), plus one of two modes:
- *upstream has no binaries* (e.g. `timetable-bin`): define
`build_artifact <version> <output-file>` (build upstream and write the
install tree as a tarball containing `usr/`) and `BUILD_DEPS` (array of
Arch packages needed to build). CI hosts the result as a GitHub release
asset which the PKGBUILD downloads.
- *upstream hosts binaries* (e.g. `fluxer-bin`): define
`refresh_checksums <version> <pkgbuild-path>` which updates the
`sha256sums*` lines for the new version. The PKGBUILD sources upstream
URLs directly and nothing is hosted here.
Other local source files in the directory (`.desktop` files, etc.) are
pushed to the AUR alongside `PKGBUILD` and `.SRCINFO`.
The workflow discovers package directories automatically. Trigger a run
manually via *Actions → Update AUR packages → Run workflow* to publish it
+39
View File
@@ -0,0 +1,39 @@
pkgbase = bazaar-bin
pkgdesc = App store for GNOME with a focus on flatpaks and Flathub (prebuilt)
pkgver = 0.9.1
pkgrel = 1
url = https://github.com/bazaar-org/bazaar
arch = x86_64
license = GPL-3.0-only
depends = appstream
depends = cairo
depends = dconf
depends = flatpak
depends = glib2
depends = glycin
depends = glycin-gtk4
depends = graphene
depends = gtk4
depends = gtksourceview5
depends = json-glib
depends = libadwaita
depends = libdex
depends = libheif
depends = libmalcontent
depends = libproxy
depends = libsecret
depends = libsoup3
depends = libxmlb
depends = libyaml
depends = md4c
depends = pango
depends = webkitgtk-6.0
depends = hicolor-icon-theme
optdepends = krunner-bazaar: krunner integration
optdepends = malcontent: parental controls
provides = bazaar
conflicts = bazaar
source = https://github.com/Felitendo/PKGBUILDS/releases/download/bazaar-bin-0.9.1/bazaar-bin-0.9.1.tar.zst
sha256sums = 236a8b672a9a67de9a240450f527b119bb4cbdfa0533e49578589fe83638e3dc
pkgname = bazaar-bin
+25
View File
@@ -0,0 +1,25 @@
# Maintainer: Felitendo
# This PKGBUILD is updated automatically:
# https://github.com/Felitendo/PKGBUILDS
pkgname=bazaar-bin
pkgver=0.9.1
pkgrel=1
pkgdesc="App store for GNOME with a focus on flatpaks and Flathub (prebuilt)"
arch=('x86_64')
url="https://github.com/bazaar-org/bazaar"
license=('GPL-3.0-only')
depends=('appstream' 'cairo' 'dconf' 'flatpak' 'glib2' 'glycin' 'glycin-gtk4'
'graphene' 'gtk4' 'gtksourceview5' 'json-glib' 'libadwaita' 'libdex'
'libheif' 'libmalcontent' 'libproxy' 'libsecret' 'libsoup3' 'libxmlb'
'libyaml' 'md4c' 'pango' 'webkitgtk-6.0' 'hicolor-icon-theme')
optdepends=('krunner-bazaar: krunner integration'
'malcontent: parental controls')
provides=('bazaar')
conflicts=('bazaar')
source=("https://github.com/Felitendo/PKGBUILDS/releases/download/${pkgname}-${pkgver}/${pkgname}-${pkgver}.tar.zst")
sha256sums=('236a8b672a9a67de9a240450f527b119bb4cbdfa0533e49578589fe83638e3dc')
package() {
cp -a "$srcdir/usr" "$pkgdir/"
}
+43
View File
@@ -0,0 +1,43 @@
# bazaar-bin - prebuilt package of https://github.com/bazaar-org/bazaar
# (GNOME app store focused on flatpaks/Flathub, C + GTK4/blueprint).
#
# Upstream tags releases but ships no binaries, so build_artifact() builds
# from the release tarball.
UPSTREAM_REPO="bazaar-org/bazaar"
# Installed in CI (pacman) before build_artifact runs.
BUILD_DEPS=(meson ninja blueprint-compiler glib2-devel python-babel gettext
gobject-introspection appstream flatpak gtk4 libadwaita
gtksourceview5 libdex glycin glycin-gtk4 webkitgtk-6.0 json-glib
libxmlb libyaml md4c libmalcontent libsecret libsoup3 libproxy
libheif)
latest_version() {
gh api "repos/$UPSTREAM_REPO/releases/latest" --jq '.tag_name' | sed 's/^v//'
}
# build_artifact <version> <output-file>
build_artifact() {
local ver="$1" outfile="$2"
local workdir destdir srctree
workdir="$(mktemp -d)"
destdir="$(mktemp -d)"
curl -sfL "https://github.com/$UPSTREAM_REPO/archive/refs/tags/v$ver.tar.gz" | tar -xz -C "$workdir"
srctree="$workdir/bazaar-$ver"
meson setup "$workdir/build" "$srctree" --prefix=/usr --buildtype=release
meson install -C "$workdir/build" --destdir "$destdir"
# These caches are generated by pacman hooks; shipping them would cause
# file conflicts on install.
rm -f "$destdir/usr/share/glib-2.0/schemas/gschemas.compiled" \
"$destdir/usr/share/applications/mimeinfo.cache" \
"$destdir/usr/share/icons/hicolor/icon-theme.cache"
tar --zstd --sort=name --owner=0 --group=0 --numeric-owner --mtime='@0' \
-cf "$outfile" -C "$destdir" usr
rm -rf "$workdir" "$destdir"
}
+46
View File
@@ -0,0 +1,46 @@
pkgbase = bottles-bin
pkgdesc = Easily manage wine and proton prefixes (prebuilt)
pkgver = 64.1
pkgrel = 1
url = https://usebottles.com
arch = any
license = GPL-3.0-only
depends = fvs2
depends = gtk4
depends = gtksourceview5
depends = hicolor-icon-theme
depends = icoextract
depends = libadwaita
depends = libportal-gtk4
depends = patool
depends = python
depends = python-cairo
depends = python-certifi
depends = python-chardet
depends = python-charset-normalizer
depends = python-gobject
depends = python-idna
depends = python-markdown
depends = python-orjson
depends = python-pathvalidate
depends = python-pefile
depends = python-pycurl
depends = python-requests
depends = python-urllib3
depends = python-yaml
depends = python-yara
depends = vkbasalt-cli
optdepends = vulkan-tools: vkcube test / Vulkan info
optdepends = xorg-xdpyinfo: display info detection
optdepends = imagemagick: icon/image conversion
optdepends = vmtouch: preload bottle files into memory
optdepends = mangohud: performance overlay
optdepends = gamemode: feral gamemode integration
optdepends = gamescope: gamescope session integration
optdepends = xterm: fallback terminal for "Run executable in terminal"
provides = bottles
conflicts = bottles
source = https://github.com/Felitendo/PKGBUILDS/releases/download/bottles-bin-64.1/bottles-bin-64.1.tar.zst
sha256sums = 0543000eb0d689b43a367d211c8b9abbda7a7e0b7ad037307432590fe62656a3
pkgname = bottles-bin
+34
View File
@@ -0,0 +1,34 @@
# Maintainer: Felitendo
# This PKGBUILD is updated automatically:
# https://github.com/Felitendo/PKGBUILDS
pkgname=bottles-bin
pkgver=64.1
pkgrel=1
pkgdesc="Easily manage wine and proton prefixes (prebuilt)"
arch=('any')
url="https://usebottles.com"
license=('GPL-3.0-only')
depends=('fvs2' 'gtk4' 'gtksourceview5' 'hicolor-icon-theme' 'icoextract'
'libadwaita' 'libportal-gtk4' 'patool' 'python' 'python-cairo'
'python-certifi' 'python-chardet' 'python-charset-normalizer'
'python-gobject' 'python-idna' 'python-markdown' 'python-orjson'
'python-pathvalidate' 'python-pefile' 'python-pycurl'
'python-requests' 'python-urllib3' 'python-yaml' 'python-yara'
'vkbasalt-cli')
optdepends=('vulkan-tools: vkcube test / Vulkan info'
'xorg-xdpyinfo: display info detection'
'imagemagick: icon/image conversion'
'vmtouch: preload bottle files into memory'
'mangohud: performance overlay'
'gamemode: feral gamemode integration'
'gamescope: gamescope session integration'
'xterm: fallback terminal for "Run executable in terminal"')
provides=('bottles')
conflicts=('bottles')
source=("https://github.com/Felitendo/PKGBUILDS/releases/download/${pkgname}-${pkgver}/${pkgname}-${pkgver}.tar.zst")
sha256sums=('0543000eb0d689b43a367d211c8b9abbda7a7e0b7ad037307432590fe62656a3')
package() {
cp -a "$srcdir/usr" "$pkgdir/"
}
+49
View File
@@ -0,0 +1,49 @@
# bottles-bin - prebuilt package of https://github.com/bottlesdevs/Bottles
# (GTK4 + LibAdwaita wine/proton prefix manager written in Python).
#
# Upstream only supports Flatpak officially and publishes no usable binary
# assets, so build_artifact() builds from the release tarball, carrying the
# same de-flatpak patch the AUR source package uses (upstream's meson refuses
# to configure outside a Flatpak sandbox and the code hard-requires the
# portal).
UPSTREAM_REPO="bottlesdevs/Bottles"
# Installed in CI (pacman) before build_artifact runs. blueprint-compiler
# resolves Gtk/Adw/GtkSource imports via their typelibs, hence the GUI libs.
BUILD_DEPS=(meson ninja blueprint-compiler gobject-introspection
desktop-file-utils appstream-glib gettext glib2-devel
python python-gobject gtk4 libadwaita gtksourceview5
libportal-gtk4)
latest_version() {
gh api "repos/$UPSTREAM_REPO/releases/latest" --jq '.tag_name' | sed 's/^v//'
}
# build_artifact <version> <output-file>
build_artifact() {
local ver="$1" outfile="$2"
local pkgdir workdir destdir srctree
pkgdir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
workdir="$(mktemp -d)"
destdir="$(mktemp -d)"
curl -sfL "https://github.com/$UPSTREAM_REPO/archive/refs/tags/$ver.tar.gz" | tar -xz -C "$workdir"
srctree="$workdir/Bottles-$ver"
patch -d "$srctree" -p1 < "$pkgdir/remove-flatpak-checks.patch"
meson setup "$workdir/build" "$srctree" --prefix=/usr --buildtype=release
meson install -C "$workdir/build" --destdir "$destdir"
# These caches are generated by pacman hooks; shipping them would cause
# file conflicts on install.
rm -f "$destdir/usr/share/glib-2.0/schemas/gschemas.compiled" \
"$destdir/usr/share/applications/mimeinfo.cache" \
"$destdir/usr/share/icons/hicolor/icon-theme.cache"
tar --zstd --sort=name --owner=0 --group=0 --numeric-owner --mtime='@0' \
-cf "$outfile" -C "$destdir" usr
rm -rf "$workdir" "$destdir"
}
+172
View File
@@ -0,0 +1,172 @@
diff -Naur Bottles-64.1-orig/bottles/frontend/meson.build Bottles-64.1/bottles/frontend/meson.build
--- Bottles-64.1-orig/bottles/frontend/meson.build 2026-05-30 13:20:17.000000000 +0200
+++ Bottles-64.1/bottles/frontend/meson.build 2026-06-25 20:16:08.858675375 +0200
@@ -23,12 +23,6 @@
configuration: conf
)
-fs = import('fs')
-
-if not fs.is_file('/' + '.flatpak-info')
- error('file does not exist')
-endif
-
bottles_sources = [
'__init__.py',
'main.py',
diff -Naur Bottles-64.1-orig/bottles/frontend/views/bottle_details.py Bottles-64.1/bottles/frontend/views/bottle_details.py
--- Bottles-64.1-orig/bottles/frontend/views/bottle_details.py 2026-05-30 13:20:17.000000000 +0200
+++ Bottles-64.1/bottles/frontend/views/bottle_details.py 2026-06-25 20:17:24.688847866 +0200
@@ -21,7 +21,7 @@
from gettext import gettext as _
from typing import Dict, List, Optional
-from gi.repository import Adw, Gdk, Gio, GLib, Gtk, Xdp
+from gi.repository import Adw, Gdk, Gio, GLib, Gtk
from bottles.backend.managers.backup import BackupManager
from bottles.backend.models.config import BottleConfig
@@ -692,20 +692,17 @@
dialog.connect("response", execute)
dialog.show()
- if Xdp.Portal.running_under_sandbox():
- if self.window.settings.get_boolean("show-sandbox-warning"):
- dialog = Adw.MessageDialog.new(
- self.window,
- _("Be Aware of Sandbox"),
- _(
- "Bottles is running in a sandbox, a restricted permission environment needed to keep you safe. If the program won't run, consider moving inside the bottle (3 dots icon on the top), then launch from there."
- ),
- )
- dialog.add_response("dismiss", _("_Dismiss"))
- dialog.connect("response", lambda *args: show_chooser())
- dialog.present()
- else:
- show_chooser()
+ if self.window.settings.get_boolean("show-sandbox-warning"):
+ dialog = Adw.MessageDialog.new(
+ self.window,
+ _("Be Aware of Sandbox"),
+ _(
+ "Bottles is running in a sandbox, a restricted permission environment needed to keep you safe. If the program won't run, consider moving inside the bottle (3 dots icon on the top), then launch from there."
+ ),
+ )
+ dialog.add_response("dismiss", _("_Dismiss"))
+ dialog.connect("response", lambda *args: show_chooser())
+ dialog.present()
else:
show_chooser()
diff -Naur Bottles-64.1-orig/bottles/frontend/views/bottle_preferences.py Bottles-64.1/bottles/frontend/views/bottle_preferences.py
--- Bottles-64.1-orig/bottles/frontend/views/bottle_preferences.py 2026-05-30 13:20:17.000000000 +0200
+++ Bottles-64.1/bottles/frontend/views/bottle_preferences.py 2026-06-25 20:17:51.920386139 +0200
@@ -20,7 +20,7 @@
import re
from gettext import gettext as _
-from gi.repository import Adw, Gdk, Gtk, Xdp
+from gi.repository import Adw, Gdk, Gtk
from bottles.backend.globals import (
gamemode_available,
@@ -141,7 +141,7 @@
self.queue = details.queue
self.details = details
- if not gamemode_available or not Xdp.Portal.running_under_sandbox():
+ if not gamemode_available:
return
_not_available = _("This feature is unavailable on your system.")
diff -Naur Bottles-64.1-orig/bottles/frontend/views/list.py Bottles-64.1/bottles/frontend/views/list.py
--- Bottles-64.1-orig/bottles/frontend/views/list.py 2026-05-30 13:20:17.000000000 +0200
+++ Bottles-64.1/bottles/frontend/views/list.py 2026-06-25 20:18:08.351774840 +0200
@@ -18,7 +18,7 @@
from datetime import datetime
from gettext import gettext as _, ngettext
-from gi.repository import Adw, GLib, Gtk, Xdp
+from gi.repository import Adw, GLib, Gtk
from bottles.backend.models.config import BottleConfig
from bottles.backend.models.result import Result
@@ -83,9 +83,6 @@
def run_executable(self, *_args):
"""Display file dialog for executable"""
- if not Xdp.Portal.running_under_sandbox():
- return
-
def set_path(_dialog, response):
if response != Gtk.ResponseType.ACCEPT:
return
diff -Naur Bottles-64.1-orig/bottles/frontend/views/new_bottle_dialog.py Bottles-64.1/bottles/frontend/views/new_bottle_dialog.py
--- Bottles-64.1-orig/bottles/frontend/views/new_bottle_dialog.py 2026-05-30 13:20:17.000000000 +0200
+++ Bottles-64.1/bottles/frontend/views/new_bottle_dialog.py 2026-06-25 20:18:22.465190406 +0200
@@ -20,7 +20,7 @@
from threading import Event
from typing import Any, Optional
-from gi.repository import Adw, Gio, GLib, GObject, Gtk, Pango, Xdp
+from gi.repository import Adw, Gio, GLib, GObject, Gtk, Pango
from pathvalidate import sanitize_filename
from bottles.backend.models.config import BottleConfig
@@ -86,7 +86,7 @@
super().__init__(**kwargs)
# common variables and references
self.window = GtkUtils.get_parent_window()
- if not self.window or not Xdp.Portal.running_under_sandbox():
+ if not self.window:
return
self.app = self.window.get_application()
diff -Naur Bottles-64.1-orig/bottles/frontend/windows/window.py Bottles-64.1/bottles/frontend/windows/window.py
--- Bottles-64.1-orig/bottles/frontend/windows/window.py 2026-05-30 13:20:17.000000000 +0200
+++ Bottles-64.1/bottles/frontend/windows/window.py 2026-06-25 20:18:50.936202160 +0200
@@ -22,7 +22,7 @@
from gettext import gettext as _
from typing import Optional
-from gi.repository import Adw, Gdk, Gio, GLib, GObject, Gtk, Xdp
+from gi.repository import Adw, Gdk, Gio, GLib, GObject, Gtk
from bottles.backend.globals import Paths
from bottles.backend.health import HealthChecker
@@ -125,35 +125,6 @@
manager = Adw.StyleManager.get_default()
manager.set_color_scheme(Adw.ColorScheme.FORCE_DARK)
- # Be VERY explicit that non-sandboxed environments are unsupported
- if not Xdp.Portal.running_under_sandbox():
-
- def response(dialog, response, *args):
- if response == "close":
- quit(1)
-
- body = _(
- "Bottles is only supported within a sandboxed environment. Official sources of Bottles are available at"
- )
- download_url = "usebottles.com/download"
-
- error_dialog = Adw.AlertDialog.new(
- _("Unsupported Environment"),
- f"{body} <a href='https://{download_url}' title='https://{download_url}'>{download_url}.</a>",
- )
-
- error_dialog.add_response("close", _("Close"))
- error_dialog.set_body_use_markup(True)
- error_dialog.connect("response", response)
- error_dialog.present(self)
- logging.error(
- _(
- "Bottles is only supported within a sandboxed format. Official sources of Bottles are available at:"
- )
- )
- logging.error("https://usebottles.com/download/")
- return
-
# Loading view
self.page_loading = LoadingView()
+40
View File
@@ -0,0 +1,40 @@
pkgbase = chiaki-ng-bin
pkgdesc = Free and Open Source PlayStation Remote Play client (prebuilt)
pkgver = 1.10.0
pkgrel = 1
url = https://streetpea.github.io/chiaki-ng/
arch = x86_64
license = LicenseRef-AGPL-3.0-only-OpenSSL
depends = curl
depends = ffmpeg
depends = fftw
depends = gcc-libs
depends = glibc
depends = hicolor-icon-theme
depends = hidapi
depends = json-c
depends = libidn2
depends = libplacebo
depends = libpsl
depends = libssh2
depends = miniupnpc
depends = openssl
depends = opus
depends = qt6-base
depends = qt6-declarative
depends = qt6-svg
depends = qt6-webengine
depends = sdl2
depends = speexdsp
depends = zlib
optdepends = intel-media-driver: vaapi backend for Intel GPUs [>= Broadwell]
optdepends = libva-intel-driver: vaapi backend for Intel GPUs [<= Haswell]
optdepends = libva-mesa-driver: vaapi backend for AMD GPUs
provides = chiaki-ng
provides = chiaki
conflicts = chiaki-ng
conflicts = chiaki
source = https://github.com/Felitendo/PKGBUILDS/releases/download/chiaki-ng-bin-1.10.0/chiaki-ng-bin-1.10.0.tar.zst
sha256sums = 76c55be0342c651a65ffe5df5ed14930d43b844590cac9f4ea67d23e80557599
pkgname = chiaki-ng-bin
+26
View File
@@ -0,0 +1,26 @@
# Maintainer: Felitendo
# This PKGBUILD is updated automatically:
# https://github.com/Felitendo/PKGBUILDS
pkgname=chiaki-ng-bin
pkgver=1.10.0
pkgrel=1
pkgdesc="Free and Open Source PlayStation Remote Play client (prebuilt)"
arch=('x86_64')
url="https://streetpea.github.io/chiaki-ng/"
license=('LicenseRef-AGPL-3.0-only-OpenSSL')
depends=('curl' 'ffmpeg' 'fftw' 'gcc-libs' 'glibc' 'hicolor-icon-theme'
'hidapi' 'json-c' 'libidn2' 'libplacebo' 'libpsl' 'libssh2'
'miniupnpc' 'openssl' 'opus' 'qt6-base' 'qt6-declarative' 'qt6-svg'
'qt6-webengine' 'sdl2' 'speexdsp' 'zlib')
optdepends=('intel-media-driver: vaapi backend for Intel GPUs [>= Broadwell]'
'libva-intel-driver: vaapi backend for Intel GPUs [<= Haswell]'
'libva-mesa-driver: vaapi backend for AMD GPUs')
provides=('chiaki-ng' 'chiaki')
conflicts=('chiaki-ng' 'chiaki')
source=("https://github.com/Felitendo/PKGBUILDS/releases/download/${pkgname}-${pkgver}/${pkgname}-${pkgver}.tar.zst")
sha256sums=('76c55be0342c651a65ffe5df5ed14930d43b844590cac9f4ea67d23e80557599')
package() {
cp -a "$srcdir/usr" "$pkgdir/"
}
+18
View File
@@ -0,0 +1,18 @@
--- a/gui/CMakeLists.txt 2025-10-11 20:52:37.048868767 +0100
+++ b/gui/CMakeLists.txt 2025-10-11 20:52:42.506427662 +0100
@@ -7,7 +7,7 @@
enable_language(OBJCXX)
endif()
-find_package(Qt6 REQUIRED COMPONENTS Core Gui Concurrent Svg Qml Quick Widgets)
+find_package(Qt6 REQUIRED COMPONENTS Core Gui Concurrent Svg Qml Quick Widgets GuiPrivate)
find_package(Qt6 COMPONENTS WebEngineQuick)
find_package(Qt6 COMPONENTS DBus)
@@ -154,4 +154,4 @@
BUNDLE DESTINATION bin)
install(FILES chiaking.desktop DESTINATION share/applications)
install(FILES chiaking.png DESTINATION share/icons/hicolor/512x512/apps)
-install(FILES io.github.streetpea.Chiaki4deck.appdata.xml DESTINATION share/metainfo)
\ No newline at end of file
+install(FILES io.github.streetpea.Chiaki4deck.appdata.xml DESTINATION share/metainfo)
+60
View File
@@ -0,0 +1,60 @@
# chiaki-ng-bin - prebuilt package of https://github.com/streetpea/chiaki-ng
# (free PlayStation Remote Play client, C/C++ + Qt6).
#
# Upstream ships no plain Linux binaries (only AppImage/flatpak), so
# build_artifact() builds from a git checkout of the release tag (the source
# tarballs lack the required submodules). Mirrors the AUR source package:
# system curl instead of the vendored submodule, plus the Qt6GuiPrivate
# CMake fix carried in this directory.
UPSTREAM_REPO="streetpea/chiaki-ng"
# Installed in CI (pacman) before build_artifact runs.
BUILD_DEPS=(cmake git python-protobuf python-setuptools protobuf
vulkan-headers qt6-base qt6-declarative qt6-svg qt6-webengine
sdl2 ffmpeg fftw hidapi json-c libplacebo miniupnpc opus speexdsp
openssl curl libssh2)
latest_version() {
gh api "repos/$UPSTREAM_REPO/releases/latest" --jq '.tag_name' | sed 's/^v//'
}
# build_artifact <version> <output-file>
build_artifact() {
local ver="$1" outfile="$2"
local pkgdir workdir destdir srctree
pkgdir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
workdir="$(mktemp -d)"
destdir="$(mktemp -d)"
srctree="$workdir/src"
git clone --branch "v$ver" --depth 1 "https://github.com/$UPSTREAM_REPO.git" "$srctree"
# use the system curl instead of the vendored submodule
git -C "$srctree" rm -q third-party/curl
sed -i 's:libcurl_shared:libcurl:' "$srctree/lib/CMakeLists.txt"
# newer tags (>= 1.10.0) carry the GuiPrivate fix themselves
if ! grep -q 'GuiPrivate' "$srctree/gui/CMakeLists.txt"; then
patch -d "$srctree" -p1 < "$pkgdir/Qt6GuiPrivate-fix.patch"
fi
git -C "$srctree" submodule update --init
CFLAGS="${CFLAGS:-} -std=gnu17" cmake -B "$workdir/build" -S "$srctree" -Wno-dev \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr \
-DCHIAKI_USE_SYSTEM_CURL=ON
cmake --build "$workdir/build" -j"$(nproc)"
DESTDIR="$destdir" cmake --install "$workdir/build"
# AGPL-3.0-only-OpenSSL: not a common license, ship the texts
mkdir -p "$destdir/usr/share/licenses/chiaki-ng-bin"
install -m644 "$srctree/LICENSES/"* "$destdir/usr/share/licenses/chiaki-ng-bin/"
rm -f "$destdir/usr/share/applications/mimeinfo.cache" \
"$destdir/usr/share/icons/hicolor/icon-theme.cache"
tar --zstd --sort=name --owner=0 --group=0 --numeric-owner --mtime='@0' \
-cf "$outfile" -C "$destdir" usr
rm -rf "$workdir" "$destdir"
}
+27
View File
@@ -0,0 +1,27 @@
pkgbase = chromium-widevine-helper-bin
pkgdesc = Extension + native helper that installs Google's Widevine CDM into Chromium-based browser profiles (prebuilt)
pkgver = 1.0.8
pkgrel = 1
url = https://github.com/GloriousEggroll/chromium-widevine-helper
arch = any
license = GPL-3.0-only
depends = python
depends = procps-ng
depends = ca-certificates
provides = chromium-widevine-helper
conflicts = chromium-widevine-helper
backup = etc/helium/native-messaging-hosts/org.chromium.widevine.json
backup = etc/net.imput.helium/native-messaging-hosts/org.chromium.widevine.json
backup = etc/chromium/native-messaging-hosts/org.chromium.widevine.json
backup = etc/chromium-browser/native-messaging-hosts/org.chromium.widevine.json
backup = etc/opt/chrome/native-messaging-hosts/org.chromium.widevine.json
backup = etc/opt/edge/native-messaging-hosts/org.chromium.widevine.json
backup = etc/brave/native-messaging-hosts/org.chromium.widevine.json
backup = etc/vivaldi/native-messaging-hosts/org.chromium.widevine.json
backup = etc/opera/native-messaging-hosts/org.chromium.widevine.json
backup = etc/thorium/native-messaging-hosts/org.chromium.widevine.json
backup = etc/iridium/native-messaging-hosts/org.chromium.widevine.json
source = https://github.com/Felitendo/PKGBUILDS/releases/download/chromium-widevine-helper-bin-1.0.8/chromium-widevine-helper-bin-1.0.8.tar.zst
sha256sums = efb70f082652176710b403a2629333220c1b8b96e3f27f398ba7efb496982829
pkgname = chromium-widevine-helper-bin
+31
View File
@@ -0,0 +1,31 @@
# Maintainer: Felitendo
# This PKGBUILD is updated automatically:
# https://github.com/Felitendo/PKGBUILDS
pkgname=chromium-widevine-helper-bin
pkgver=1.0.8
pkgrel=1
pkgdesc="Extension + native helper that installs Google's Widevine CDM into Chromium-based browser profiles (prebuilt)"
arch=('any')
url="https://github.com/GloriousEggroll/chromium-widevine-helper"
license=('GPL-3.0-only')
depends=('python' 'procps-ng' 'ca-certificates')
provides=('chromium-widevine-helper')
conflicts=('chromium-widevine-helper')
backup=('etc/helium/native-messaging-hosts/org.chromium.widevine.json'
'etc/net.imput.helium/native-messaging-hosts/org.chromium.widevine.json'
'etc/chromium/native-messaging-hosts/org.chromium.widevine.json'
'etc/chromium-browser/native-messaging-hosts/org.chromium.widevine.json'
'etc/opt/chrome/native-messaging-hosts/org.chromium.widevine.json'
'etc/opt/edge/native-messaging-hosts/org.chromium.widevine.json'
'etc/brave/native-messaging-hosts/org.chromium.widevine.json'
'etc/vivaldi/native-messaging-hosts/org.chromium.widevine.json'
'etc/opera/native-messaging-hosts/org.chromium.widevine.json'
'etc/thorium/native-messaging-hosts/org.chromium.widevine.json'
'etc/iridium/native-messaging-hosts/org.chromium.widevine.json')
source=("https://github.com/Felitendo/PKGBUILDS/releases/download/${pkgname}-${pkgver}/${pkgname}-${pkgver}.tar.zst")
sha256sums=('efb70f082652176710b403a2629333220c1b8b96e3f27f398ba7efb496982829')
package() {
cp -a "$srcdir/usr" "$srcdir/etc" "$pkgdir/"
}
+77
View File
@@ -0,0 +1,77 @@
# chromium-widevine-helper-bin - prebuilt package of
# https://github.com/GloriousEggroll/chromium-widevine-helper
# (Chromium extension + native messaging helper that installs Google's
# Widevine CDM into Chromium-based browser profiles).
#
# Upstream publishes neither releases nor tags; the canonical version lives in
# the Fedora RPM spec on the main branch. build_artifact() snapshots main,
# verifies the snapshot still carries the requested version and assembles the
# install tree following upstream's spec - with Fedora's /usr/libexec
# relocated to /usr/lib, which Arch uses instead.
UPSTREAM_REPO="GloriousEggroll/chromium-widevine-helper"
SPEC_PATH="Packaging/rpm/chromium-widevine-helper.spec"
# Pure noarch install tree (Python script + JSON + extension assets).
BUILD_DEPS=()
spec_version() {
grep -Po '^%global helper_version \K[0-9.]+'
}
latest_version() {
curl -sf "https://raw.githubusercontent.com/$UPSTREAM_REPO/main/$SPEC_PATH" \
| spec_version
}
# build_artifact <version> <output-file>
build_artifact() {
local ver="$1" outfile="$2"
local workdir destdir
workdir="$(mktemp -d)"
destdir="$(mktemp -d)"
curl -sfL "https://github.com/$UPSTREAM_REPO/archive/refs/heads/main.tar.gz" \
| tar -xz -C "$workdir" --strip-components=1
# main may have moved between the version check and this download.
local specver
specver="$(spec_version < "$workdir/$SPEC_PATH")"
if [[ "$specver" != "$ver" ]]; then
echo "snapshot of main is $specver, not the requested $ver - try again" >&2
return 1
fi
install -Dm755 "$workdir/helper/chromium-widevine" \
"$destdir/usr/lib/chromium-widevine/chromium-widevine"
install -d "$destdir/usr/bin"
ln -s /usr/lib/chromium-widevine/chromium-widevine "$destdir/usr/bin/chromium-widevine"
# The extension is shipped so it can be loaded unpacked from
# chrome://extensions (chromium-widevine --install-native-hosts then
# registers whatever ID the browser assigned it).
mkdir -p "$destdir/usr/share/chromium-widevine"
cp -a "$workdir/extension" "$destdir/usr/share/chromium-widevine/extension"
find "$destdir/usr/share/chromium-widevine" -type d -exec chmod 755 {} +
find "$destdir/usr/share/chromium-widevine" -type f -exec chmod 644 {} +
install -Dm644 "$workdir/README.md" \
"$destdir/usr/share/doc/chromium-widevine-helper-bin/README.md"
# System-wide native messaging host manifests for the same browser lookup
# roots upstream's RPM covers.
local hostdir
for hostdir in helium net.imput.helium chromium chromium-browser \
opt/chrome opt/edge brave vivaldi opera thorium iridium; do
install -Dm644 "$workdir/helper/chromium-widevine-native-host.json" \
"$destdir/etc/$hostdir/native-messaging-hosts/org.chromium.widevine.json"
done
# The upstream manifest hardcodes Fedora's /usr/libexec helper path.
find "$destdir/etc" -name 'org.chromium.widevine.json' -exec \
sed -i 's|/usr/libexec/chromium-widevine/|/usr/lib/chromium-widevine/|' {} +
tar --zstd --sort=name --owner=0 --group=0 --numeric-owner --mtime='@0' \
-cf "$outfile" -C "$destdir" usr etc
rm -rf "$workdir" "$destdir"
}
+27
View File
@@ -0,0 +1,27 @@
pkgbase = faugus-launcher-bin
pkgdesc = Simple and lightweight app for running Windows games using UMU-Launcher (prebuilt)
pkgver = 2.0.2
pkgrel = 1
url = https://github.com/Faugus/faugus-launcher
arch = any
license = MIT
depends = gtk4
depends = libadwaita
depends = libmanette
depends = icoextract
depends = python
depends = python-gobject
depends = python-requests
depends = python-pillow
depends = python-vdf
depends = python-psutil
depends = python-dbus
depends = umu-launcher
optdepends = mangohud: performance overlay
optdepends = gamemode: feral gamemode integration
provides = faugus-launcher
conflicts = faugus-launcher
source = https://github.com/Felitendo/PKGBUILDS/releases/download/faugus-launcher-bin-2.0.2/faugus-launcher-bin-2.0.2.tar.zst
sha256sums = 5fcf441cccb1ccc0ac554760e93744d557fd05a3fc4335132a59e55aefe902af
pkgname = faugus-launcher-bin
+24
View File
@@ -0,0 +1,24 @@
# Maintainer: Felitendo
# This PKGBUILD is updated automatically:
# https://github.com/Felitendo/PKGBUILDS
pkgname=faugus-launcher-bin
pkgver=2.0.2
pkgrel=1
pkgdesc="Simple and lightweight app for running Windows games using UMU-Launcher (prebuilt)"
arch=('any')
url="https://github.com/Faugus/faugus-launcher"
license=('MIT')
depends=('gtk4' 'libadwaita' 'libmanette' 'icoextract' 'python'
'python-gobject' 'python-requests' 'python-pillow' 'python-vdf'
'python-psutil' 'python-dbus' 'umu-launcher')
optdepends=('mangohud: performance overlay'
'gamemode: feral gamemode integration')
provides=('faugus-launcher')
conflicts=('faugus-launcher')
source=("https://github.com/Felitendo/PKGBUILDS/releases/download/${pkgname}-${pkgver}/${pkgname}-${pkgver}.tar.zst")
sha256sums=('5fcf441cccb1ccc0ac554760e93744d557fd05a3fc4335132a59e55aefe902af')
package() {
cp -a "$srcdir/usr" "$pkgdir/"
}
+54
View File
@@ -0,0 +1,54 @@
# faugus-launcher-bin - prebuilt package of https://github.com/Faugus/faugus-launcher
# (GTK4 game launcher for running Windows games through UMU-Launcher, Python).
#
# Upstream ships AppImage/deb/rpm but no Arch-friendly binary, so
# build_artifact() builds the meson project from the release tarball.
UPSTREAM_REPO="Faugus/faugus-launcher"
# Installed in CI (pacman) before build_artifact runs.
# (Translations ship as prebuilt .mo files, so no gettext needed.)
BUILD_DEPS=(meson ninja python)
latest_version() {
gh api "repos/$UPSTREAM_REPO/releases/latest" --jq '.tag_name' | sed 's/^v//'
}
# build_artifact <version> <output-file>
build_artifact() {
local ver="$1" outfile="$2"
local workdir destdir srctree sitedir
workdir="$(mktemp -d)"
destdir="$(mktemp -d)"
curl -sfL "https://github.com/$UPSTREAM_REPO/archive/refs/tags/$ver.tar.gz" | tar -xz -C "$workdir"
srctree="$workdir/faugus-launcher-$ver"
meson setup "$workdir/build" "$srctree" --prefix=/usr --buildtype=release
meson install -C "$workdir/build" --destdir "$destdir"
# meson installs the python modules into site-packages, whose path changes
# with every Python minor bump and would silently break a prebuilt package.
# Relocate to a fixed dir and put it on the launcher's PYTHONPATH (the
# launcher script already appends any pre-set PYTHONPATH to its own).
sitedir="$(find "$destdir/usr/lib" -maxdepth 2 -type d -name site-packages)"
[[ -d "$sitedir/faugus" ]] || { echo "faugus module not found in $sitedir" >&2; return 1; }
mkdir -p "$destdir/usr/lib/faugus-launcher"
mv "$sitedir/faugus" "$destdir/usr/lib/faugus-launcher/"
rm -rf "$destdir/usr/lib/python"*
head -1 "$destdir/usr/bin/faugus-launcher" | grep -qx '#!/bin/sh' \
|| { echo "unexpected launcher script format" >&2; return 1; }
sed -i '1a export PYTHONPATH="/usr/lib/faugus-launcher${PYTHONPATH:+:$PYTHONPATH}"' \
"$destdir/usr/bin/faugus-launcher"
# These caches are generated by pacman hooks; shipping them would cause
# file conflicts on install.
rm -f "$destdir/usr/share/applications/mimeinfo.cache" \
"$destdir/usr/share/icons/hicolor/icon-theme.cache"
tar --zstd --sort=name --owner=0 --group=0 --numeric-owner --mtime='@0' \
-cf "$outfile" -C "$destdir" usr
rm -rf "$workdir" "$destdir"
}
+20
View File
@@ -0,0 +1,20 @@
pkgbase = fluxer-bin
pkgdesc = Fluxer Desktop Application
pkgver = 0.0.8
pkgrel = 1
url = https://fluxer.app
arch = x86_64
arch = aarch64
license = AGPL-3.0-only
depends = gtk3
depends = nss
depends = alsa-lib
options = !strip
source = fluxer.desktop
sha256sums = 981daa8015b823fef254bb8e79fe6b28f77dda02cdc374796443bd64f5041de1
source_x86_64 = fluxer-0.0.8-x64.tar.gz::https://api.fluxer.app/dl/desktop/stable/linux/x64/0.0.8/tar_gz
sha256sums_x86_64 = acf6398fa6810720fed85b06c011b324e7db4fec6bf2fc7ad93c2446c3600f2d
source_aarch64 = fluxer-0.0.8-arm64.tar.gz::https://api.fluxer.app/dl/desktop/stable/linux/arm64/0.0.8/tar_gz
sha256sums_aarch64 = 77b874a98caf48de5bc4ccf03119f45262fe26fd7be085b57d7b40b1505d0ec8
pkgname = fluxer-bin
+54
View File
@@ -0,0 +1,54 @@
# Maintainer: Felitendo
# Contributor: Cosmo <cptncosmo@gmail.com>
# This PKGBUILD is updated automatically:
# https://github.com/Felitendo/PKGBUILDS
pkgname=fluxer-bin
pkgver=0.0.8
pkgrel=1
pkgdesc="Fluxer Desktop Application"
arch=('x86_64' 'aarch64')
url="https://fluxer.app"
license=('AGPL-3.0-only')
depends=('gtk3' 'nss' 'alsa-lib')
options=('!strip')
source=("fluxer.desktop")
sha256sums=('981daa8015b823fef254bb8e79fe6b28f77dda02cdc374796443bd64f5041de1')
source_x86_64=("fluxer-${pkgver}-x64.tar.gz::https://api.fluxer.app/dl/desktop/stable/linux/x64/${pkgver}/tar_gz")
sha256sums_x86_64=('acf6398fa6810720fed85b06c011b324e7db4fec6bf2fc7ad93c2446c3600f2d')
source_aarch64=("fluxer-${pkgver}-arm64.tar.gz::https://api.fluxer.app/dl/desktop/stable/linux/arm64/${pkgver}/tar_gz")
sha256sums_aarch64=('77b874a98caf48de5bc4ccf03119f45262fe26fd7be085b57d7b40b1505d0ec8')
package() {
local _dir
case "$CARCH" in
x86_64) _dir="fluxer-stable-${pkgver}-x64" ;;
aarch64) _dir="fluxer-stable-${pkgver}-arm64" ;;
esac
# upstream has changed the archive layout before - fall back to a glob
if [ ! -d "$srcdir/$_dir" ]; then
_dir=$(cd "$srcdir" && ls -d [Ff]luxer*"${pkgver}"*/ 2>/dev/null | head -n1)
_dir="${_dir%/}"
fi
if [ -z "$_dir" ] || [ ! -d "$srcdir/$_dir" ]; then
echo "Error: could not find extracted directory for $CARCH" >&2
ls -la "$srcdir" >&2
return 1
fi
install -d "$pkgdir/opt/$pkgname"
cp -a "$srcdir/$_dir/." "$pkgdir/opt/$pkgname/"
install -d "$pkgdir/usr/bin"
ln -s "/opt/$pkgname/fluxer" "$pkgdir/usr/bin/fluxer"
install -Dm644 "$srcdir/fluxer.desktop" "$pkgdir/usr/share/applications/fluxer.desktop"
if [ -f "$pkgdir/opt/$pkgname/resources/512x512.png" ]; then
install -Dm644 "$pkgdir/opt/$pkgname/resources/512x512.png" \
"$pkgdir/usr/share/icons/hicolor/512x512/apps/fluxer.png"
fi
}
+8
View File
@@ -0,0 +1,8 @@
[Desktop Entry]
Name=Fluxer
Comment=Fluxer Desktop App
Exec=/usr/bin/fluxer
Icon=fluxer
Terminal=false
Type=Application
Categories=Network;
+30
View File
@@ -0,0 +1,30 @@
# fluxer-bin - Fluxer Desktop (https://fluxer.app), an Electron app.
#
# Upstream hosts versioned prebuilt binaries itself, so there is no
# build_artifact() here: on a new version only pkgver and the checksums
# are refreshed and the result is pushed to the AUR.
DL_BASE="https://api.fluxer.app/dl/desktop/stable/linux"
latest_version() {
# the download API exposes the current version in the attachment filename,
# e.g. content-disposition: attachment; filename="fluxer-stable-0.0.8-x64.tar.gz"
curl -sfI "$DL_BASE/x64/latest/tar_gz" \
| grep -oiP 'filename="fluxer-(stable-)?\K[0-9][^"]*(?=-x64\.tar\.gz)'
}
# refresh_checksums <version> <pkgbuild-path>
refresh_checksums() {
local ver="$1" pkgbuild="$2"
local sha_desktop sha_x64 sha_arm64
sha_desktop="$(sha256sum "$(dirname "$pkgbuild")/fluxer.desktop" | cut -d' ' -f1)"
sha_x64="$(curl -sfL "$DL_BASE/x64/$ver/tar_gz" | sha256sum | cut -d' ' -f1)"
sha_arm64="$(curl -sfL "$DL_BASE/arm64/$ver/tar_gz" | sha256sum | cut -d' ' -f1)"
sed -i \
-e "s|^sha256sums=.*|sha256sums=('$sha_desktop')|" \
-e "s|^sha256sums_x86_64=.*|sha256sums_x86_64=('$sha_x64')|" \
-e "s|^sha256sums_aarch64=.*|sha256sums_aarch64=('$sha_arm64')|" \
"$pkgbuild"
}
+31
View File
@@ -0,0 +1,31 @@
pkgbase = gearlever-bin
pkgdesc = Manage AppImages with ease (prebuilt)
pkgver = 4.6.2
pkgrel = 1
url = https://gearlever.mijorus.it
arch = any
license = GPL-3.0-or-later
depends = gtk4
depends = libadwaita
depends = glib2
depends = dconf
depends = hicolor-icon-theme
depends = python
depends = python-gobject
depends = python-dbus
depends = python-requests
depends = python-pyxdg
depends = python-ftputil
depends = python-desktop-entry-lib
depends = 7zip
depends = binutils
depends = squashfs-tools
depends = fuse2
optdepends = dwarfs: extract AppImages that use a DwarFS filesystem
optdepends = libxml2-legacy: required by the LibreOffice AppImage
provides = gearlever
conflicts = gearlever
source = https://github.com/Felitendo/PKGBUILDS/releases/download/gearlever-bin-4.6.2/gearlever-bin-4.6.2.tar.zst
sha256sums = 319841a5dffd942b6f3b86822ac4d9d52a5b4ee559ea03ee5c2a6318a5161546
pkgname = gearlever-bin
+25
View File
@@ -0,0 +1,25 @@
# Maintainer: Felitendo
# This PKGBUILD is updated automatically:
# https://github.com/Felitendo/PKGBUILDS
pkgname=gearlever-bin
pkgver=4.6.2
pkgrel=1
pkgdesc="Manage AppImages with ease (prebuilt)"
arch=('any')
url="https://gearlever.mijorus.it"
license=('GPL-3.0-or-later')
depends=('gtk4' 'libadwaita' 'glib2' 'dconf' 'hicolor-icon-theme' 'python'
'python-gobject' 'python-dbus' 'python-requests' 'python-pyxdg'
'python-ftputil' 'python-desktop-entry-lib'
'7zip' 'binutils' 'squashfs-tools' 'fuse2')
optdepends=('dwarfs: extract AppImages that use a DwarFS filesystem'
'libxml2-legacy: required by the LibreOffice AppImage')
provides=('gearlever')
conflicts=('gearlever')
source=("https://github.com/Felitendo/PKGBUILDS/releases/download/${pkgname}-${pkgver}/${pkgname}-${pkgver}.tar.zst")
sha256sums=('319841a5dffd942b6f3b86822ac4d9d52a5b4ee559ea03ee5c2a6318a5161546')
package() {
cp -a "$srcdir/usr" "$pkgdir/"
}
+56
View File
@@ -0,0 +1,56 @@
# gearlever-bin - prebuilt package of https://github.com/mijorus/gearlever
# ("Gear Lever", a GTK4 + LibAdwaita AppImage manager written in Python).
#
# Upstream only publishes a Flatpak bundle, so build_artifact() builds the
# app from the release tarball and the resulting install tree is published as
# a GitHub release asset of this repository, which the PKGBUILD then uses.
UPSTREAM_REPO="mijorus/gearlever"
# Installed in CI (pacman) before build_artifact runs.
BUILD_DEPS=(meson ninja glib2 glib2-devel python gettext)
latest_version() {
# gh instead of curl: unauthenticated GitHub API calls are rate-limited on
# shared CI runner IPs.
gh api "repos/$UPSTREAM_REPO/releases/latest" --jq '.tag_name' | sed 's/^v//'
}
# build_artifact <version> <output-file>
build_artifact() {
local ver="$1" outfile="$2"
local workdir destdir srctree
workdir="$(mktemp -d)"
destdir="$(mktemp -d)"
curl -sfL "https://github.com/$UPSTREAM_REPO/archive/refs/tags/$ver.tar.gz" | tar -xz -C "$workdir"
srctree="$workdir/gearlever-$ver"
# Arch's 7zip package ships /usr/bin/7z, not the 7zz binary the Flatpak
# bundles, and the ELF-offset helper lives in /usr/lib/gearlever instead of
# somewhere on $PATH.
sed -i -e 's/7zz/7z/g' \
-e 's|get_appimage_offset|/usr/lib/gearlever/get_appimage_offset|g' \
"$srctree/src/providers/AppImageProvider.py"
meson setup "$workdir/build" "$srctree" --prefix=/usr --buildtype=release
meson install -C "$workdir/build" --destdir "$destdir"
install -Dm755 "$srctree/build-aux/get_appimage_offset.sh" \
"$destdir/usr/lib/gearlever/get_appimage_offset"
# src/meson.build uses install_subdir('.'), which drags the meson.build
# files themselves into the install tree.
find "$destdir" -name meson.build -delete
# These caches are generated by pacman hooks; shipping them would cause
# file conflicts on install.
rm -f "$destdir/usr/share/glib-2.0/schemas/gschemas.compiled" \
"$destdir/usr/share/applications/mimeinfo.cache" \
"$destdir/usr/share/icons/hicolor/icon-theme.cache"
tar --zstd --sort=name --owner=0 --group=0 --numeric-owner --mtime='@0' \
-cf "$outfile" -C "$destdir" usr
rm -rf "$workdir" "$destdir"
}
+34
View File
@@ -0,0 +1,34 @@
pkgbase = gnome-network-displays-bin
pkgdesc = Screencasting for GNOME - Miracast and Chromecast (prebuilt)
pkgver = 0.99.0
pkgrel = 1
url = https://gitlab.gnome.org/GNOME/gnome-network-displays
arch = x86_64
license = GPL-3.0-or-later
depends = avahi
depends = dnsmasq
depends = gst-plugin-pipewire
depends = gst-plugins-bad
depends = gst-plugins-good
depends = gst-plugins-ugly
depends = gst-rtsp-server
depends = gstreamer
depends = gtk4
depends = json-glib
depends = libadwaita
depends = libnm
depends = libportal
depends = libportal-gtk4
depends = libpulse
depends = libsoup3
depends = networkmanager
depends = protobuf-c
depends = xdg-desktop-portal
depends = hicolor-icon-theme
optdepends = gstreamer-vaapi: hardware accelerated encoding
provides = gnome-network-displays
conflicts = gnome-network-displays
source = https://github.com/Felitendo/PKGBUILDS/releases/download/gnome-network-displays-bin-0.99.0/gnome-network-displays-bin-0.99.0.tar.zst
sha256sums = 6e7f93f491226bab6ae54139dcaf009d9cedd8e983b04b5128701c3250936ac1
pkgname = gnome-network-displays-bin
+25
View File
@@ -0,0 +1,25 @@
# Maintainer: Felitendo
# This PKGBUILD is updated automatically:
# https://github.com/Felitendo/PKGBUILDS
pkgname=gnome-network-displays-bin
pkgver=0.99.0
pkgrel=1
pkgdesc="Screencasting for GNOME - Miracast and Chromecast (prebuilt)"
arch=('x86_64')
url="https://gitlab.gnome.org/GNOME/gnome-network-displays"
license=('GPL-3.0-or-later')
depends=('avahi' 'dnsmasq' 'gst-plugin-pipewire' 'gst-plugins-bad'
'gst-plugins-good' 'gst-plugins-ugly' 'gst-rtsp-server' 'gstreamer'
'gtk4' 'json-glib' 'libadwaita' 'libnm' 'libportal' 'libportal-gtk4'
'libpulse' 'libsoup3' 'networkmanager' 'protobuf-c'
'xdg-desktop-portal' 'hicolor-icon-theme')
optdepends=('gstreamer-vaapi: hardware accelerated encoding')
provides=('gnome-network-displays')
conflicts=('gnome-network-displays')
source=("https://github.com/Felitendo/PKGBUILDS/releases/download/${pkgname}-${pkgver}/${pkgname}-${pkgver}.tar.zst")
sha256sums=('6e7f93f491226bab6ae54139dcaf009d9cedd8e983b04b5128701c3250936ac1')
package() {
cp -a "$srcdir/usr" "$pkgdir/"
}
+47
View File
@@ -0,0 +1,47 @@
# gnome-network-displays-bin - prebuilt package of
# https://gitlab.gnome.org/GNOME/gnome-network-displays
# (GNOME screencasting via Miracast/Chromecast, C + GTK4/LibAdwaita).
#
# Upstream publishes no binary assets, so build_artifact() builds from the
# GitLab release tarball.
GITLAB_PROJECT="GNOME%2Fgnome-network-displays"
# Installed in CI (pacman) before build_artifact runs.
BUILD_DEPS=(meson ninja glib2-devel gettext gtk4 libadwaita gstreamer
gst-rtsp-server gst-plugins-bad json-glib libnm libportal
libportal-gtk4 libpulse libsoup3 protobuf-c avahi)
latest_version() {
curl -sf "https://gitlab.gnome.org/api/v4/projects/$GITLAB_PROJECT/releases?per_page=1" \
| jq -r '.[0].tag_name' | sed 's/^v//'
}
# build_artifact <version> <output-file>
build_artifact() {
local ver="$1" outfile="$2"
local workdir destdir srctree
workdir="$(mktemp -d)"
destdir="$(mktemp -d)"
curl -sfL "https://gitlab.gnome.org/GNOME/gnome-network-displays/-/archive/$ver/gnome-network-displays-$ver.tar.gz" \
| tar -xz -C "$workdir"
srctree="$workdir/gnome-network-displays-$ver"
# Arch has no /usr/libexec; same fix as the AUR source package
sed -i 's/libexec/lib/g' "$srctree/src/nd-systemd-helpers.c" "$srctree/src/meson.build"
meson setup "$workdir/build" "$srctree" --prefix=/usr --buildtype=release
meson install -C "$workdir/build" --destdir "$destdir"
# These caches are generated by pacman hooks; shipping them would cause
# file conflicts on install.
rm -f "$destdir/usr/share/glib-2.0/schemas/gschemas.compiled" \
"$destdir/usr/share/applications/mimeinfo.cache" \
"$destdir/usr/share/icons/hicolor/icon-theme.cache"
tar --zstd --sort=name --owner=0 --group=0 --numeric-owner --mtime='@0' \
-cf "$outfile" -C "$destdir" usr
rm -rf "$workdir" "$destdir"
}
+21
View File
@@ -0,0 +1,21 @@
pkgbase = librepods-bin
pkgdesc = AirPods liberated from Apple's ecosystem (prebuilt)
pkgver = 1.0.0rc1
pkgrel = 1
url = https://github.com/librepods-org/librepods
arch = x86_64
license = GPL-3.0-only
depends = glibc
depends = gcc-libs
depends = hicolor-icon-theme
depends = libpulse
depends = openssl
depends = qt6-base
depends = qt6-connectivity
depends = qt6-declarative
provides = librepods
conflicts = librepods
source = https://github.com/Felitendo/PKGBUILDS/releases/download/librepods-bin-1.0.0rc1/librepods-bin-1.0.0rc1.tar.zst
sha256sums = 69ce19414a0205d1d19fb851f6adea6c231013df6ec8a32bc8122d5fd6e9dd52
pkgname = librepods-bin
+21
View File
@@ -0,0 +1,21 @@
# Maintainer: Felitendo
# This PKGBUILD is updated automatically:
# https://github.com/Felitendo/PKGBUILDS
pkgname=librepods-bin
pkgver=1.0.0rc1
pkgrel=1
pkgdesc="AirPods liberated from Apple's ecosystem (prebuilt)"
arch=('x86_64')
url="https://github.com/librepods-org/librepods"
license=('GPL-3.0-only')
depends=('glibc' 'gcc-libs' 'hicolor-icon-theme' 'libpulse' 'openssl'
'qt6-base' 'qt6-connectivity' 'qt6-declarative')
provides=('librepods')
conflicts=('librepods')
source=("https://github.com/Felitendo/PKGBUILDS/releases/download/${pkgname}-${pkgver}/${pkgname}-${pkgver}.tar.zst")
sha256sums=('69ce19414a0205d1d19fb851f6adea6c231013df6ec8a32bc8122d5fd6e9dd52')
package() {
cp -a "$srcdir/usr" "$pkgdir/"
}
+46
View File
@@ -0,0 +1,46 @@
# librepods-bin - prebuilt package of https://github.com/librepods-org/librepods
# (AirPods integration for Linux, Qt6/C++ client in the linux/ subdirectory).
#
# Upstream releases carry only Android APKs, so build_artifact() builds the
# Linux client from the release tarball. Upstream tags look like v1.0.0-rc1;
# pkgver strips the hyphen (1.0.0rc1, sorts before 1.0.0 in vercmp) and
# build_artifact re-inserts it for the tag URL.
UPSTREAM_REPO="librepods-org/librepods"
# Installed in CI (pacman) before build_artifact runs.
BUILD_DEPS=(cmake qt6-base qt6-connectivity qt6-declarative qt6-tools
libpulse openssl)
latest_version() {
gh api "repos/$UPSTREAM_REPO/releases/latest" --jq '.tag_name' | sed 's/^v//; s/-//g'
}
# build_artifact <version> <output-file>
build_artifact() {
local ver="$1" outfile="$2"
local upver workdir destdir srctree
upver="$(sed -E 's/([a-z])/-\1/' <<< "$ver")"
workdir="$(mktemp -d)"
destdir="$(mktemp -d)"
curl -sfL "https://github.com/$UPSTREAM_REPO/archive/refs/tags/v$upver.tar.gz" | tar -xz -C "$workdir"
srctree="$workdir/librepods-$upver"
cmake -B "$workdir/build" -S "$srctree/linux" -Wno-dev \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr \
-DCMAKE_SKIP_RPATH=TRUE
cmake --build "$workdir/build" -j"$(nproc)"
DESTDIR="$destdir" cmake --install "$workdir/build"
# These caches are generated by pacman hooks; shipping them would cause
# file conflicts on install.
rm -f "$destdir/usr/share/applications/mimeinfo.cache" \
"$destdir/usr/share/icons/hicolor/icon-theme.cache"
tar --zstd --sort=name --owner=0 --group=0 --numeric-owner --mtime='@0' \
-cf "$outfile" -C "$destdir" usr
rm -rf "$workdir" "$destdir"
}
+29
View File
@@ -0,0 +1,29 @@
pkgbase = linux-wallpaperengine-bin
pkgdesc = Use Steam's Wallpaper Engine wallpapers on Linux (prebuilt snapshot of main)
pkgver = r627.b016d7d
pkgrel = 1
url = https://github.com/Almamu/linux-wallpaperengine
arch = x86_64
license = GPL-3.0-only
depends = lz4
depends = ffmpeg
depends = mpv
depends = glfw
depends = glew
depends = freeglut
depends = libpulse
depends = libcups
depends = at-spi2-core
depends = nss
depends = libxcomposite
depends = libxdamage
depends = nspr
provides = linux-wallpaperengine
conflicts = linux-wallpaperengine
conflicts = linux-wallpaperengine-git
options = !strip
options = !debug
source = https://github.com/Felitendo/PKGBUILDS/releases/download/linux-wallpaperengine-bin-r627.b016d7d/linux-wallpaperengine-bin-r627.b016d7d.tar.zst
sha256sums = ed71a7ca046003c368b6af7aa9766dee36cd5da84921a4a34991248d62d7bc6b
pkgname = linux-wallpaperengine-bin
+23
View File
@@ -0,0 +1,23 @@
# Maintainer: Felitendo
# This PKGBUILD is updated automatically:
# https://github.com/Felitendo/PKGBUILDS
pkgname=linux-wallpaperengine-bin
pkgver=r627.b016d7d
pkgrel=1
pkgdesc="Use Steam's Wallpaper Engine wallpapers on Linux (prebuilt snapshot of main)"
arch=('x86_64')
url="https://github.com/Almamu/linux-wallpaperengine"
license=('GPL-3.0-only')
depends=('lz4' 'ffmpeg' 'mpv' 'glfw' 'glew' 'freeglut' 'libpulse' 'libcups'
'at-spi2-core' 'nss' 'libxcomposite' 'libxdamage' 'nspr')
provides=('linux-wallpaperengine')
conflicts=('linux-wallpaperengine' 'linux-wallpaperengine-git')
options=('!strip' '!debug')
source=("https://github.com/Felitendo/PKGBUILDS/releases/download/${pkgname}-${pkgver}/${pkgname}-${pkgver}.tar.zst")
sha256sums=('ed71a7ca046003c368b6af7aa9766dee36cd5da84921a4a34991248d62d7bc6b')
package() {
cp -a "$srcdir/usr" "$pkgdir/"
cp -a "$srcdir/opt" "$pkgdir/"
}
+71
View File
@@ -0,0 +1,71 @@
# linux-wallpaperengine-bin - prebuilt package of
# https://github.com/Almamu/linux-wallpaperengine (Wallpaper Engine backgrounds
# on Linux, C++/CMake, bundles CEF for web wallpapers).
#
# Upstream has no releases or tags, so versions are commit snapshots of main
# in the same "r<commit count>.<short sha>" format the AUR -git package uses.
# Every new upstream commit therefore produces a new build.
UPSTREAM_REPO="Almamu/linux-wallpaperengine"
# Installed in CI (pacman) before build_artifact runs.
BUILD_DEPS=(cmake git sdl2 glm wayland-protocols xorg-xrandr lz4 ffmpeg mpv
glfw glew freeglut libpulse libcups at-spi2-core nss libxcomposite
libxdamage nspr dbus freetype2)
latest_version() {
local sha count
sha="$(gh api "repos/$UPSTREAM_REPO/commits/main" --jq '.sha')" || return 1
# total commit count on main, from the Link pagination header
count="$(gh api -i "repos/$UPSTREAM_REPO/commits?sha=main&per_page=1" \
| grep -oiP 'page=\K[0-9]+(?=>; rel="last")')" || return 1
[[ -n "$sha" && -n "$count" ]] || return 1
echo "r${count}.${sha:0:7}"
}
# build_artifact <version> <output-file>
build_artifact() {
local ver="$1" outfile="$2"
local sha="${ver##*.}"
local workdir destdir srctree actual
workdir="$(mktemp -d)"
destdir="$(mktemp -d)"
srctree="$workdir/src"
git clone "https://github.com/$UPSTREAM_REPO.git" "$srctree"
git -C "$srctree" checkout "$sha"
git -C "$srctree" submodule update --init --recursive
# make sure the checkout is really the snapshot the version claims to be
actual="r$(git -C "$srctree" rev-list --count HEAD).$(git -C "$srctree" rev-parse --short=7 HEAD)"
if [[ "$actual" != "$ver" ]]; then
echo "snapshot mismatch: checked out $actual, expected $ver" >&2
return 1
fi
# flags as in the AUR -git package; CEF is fetched by CMake during setup
cmake -B "$workdir/build" -S "$srctree" \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/opt/linux-wallpaperengine \
-Wno-dev \
-DCMAKE_CXX_FLAGS='-ffat-lto-objects -Wno-builtin-macro-redefined' \
-DCMAKE_C_FLAGS='-Wno-builtin-macro-redefined'
cmake --build "$workdir/build" -j"$(nproc)"
DESTDIR="$destdir" cmake --install "$workdir/build"
chmod 755 "$destdir/opt/linux-wallpaperengine/linux-wallpaperengine"
# forwarding script, as in the AUR -git package
mkdir -p "$destdir/usr/bin"
cat > "$destdir/usr/bin/linux-wallpaperengine" << 'EOF'
#!/bin/bash
export LD_LIBRARY_PATH="/opt/linux-wallpaperengine/lib:$LD_LIBRARY_PATH"
cd /opt/linux-wallpaperengine
exec ./linux-wallpaperengine "$@"
EOF
chmod 755 "$destdir/usr/bin/linux-wallpaperengine"
tar --zstd --sort=name --owner=0 --group=0 --numeric-owner --mtime='@0' \
-cf "$outfile" -C "$destdir" usr opt
rm -rf "$workdir" "$destdir"
}
+19
View File
@@ -0,0 +1,19 @@
pkgbase = modrinth-app-bin
pkgdesc = Minecraft mod manager and launcher from Modrinth (upstream binary)
pkgver = 0.15.20
pkgrel = 1
url = https://modrinth.com/app
arch = x86_64
license = GPL-3.0-only
depends = webkit2gtk-4.1
depends = gtk3
depends = hicolor-icon-theme
provides = modrinth-app
conflicts = modrinth-app
noextract = modrinth-app-bin-0.15.20.deb
options = !strip
options = !debug
source = modrinth-app-bin-0.15.20.deb::https://github.com/modrinth/code/releases/download/v0.15.20/Modrinth.App_0.15.20_amd64.deb
sha256sums = b88f8f4b5b2017ad99fb3e89cbfe1dc1a6693aa67c2edf7e94ee959a42fb533a
pkgname = modrinth-app-bin
+24
View File
@@ -0,0 +1,24 @@
# Maintainer: Felitendo
# This PKGBUILD is updated automatically:
# https://github.com/Felitendo/PKGBUILDS
pkgname=modrinth-app-bin
pkgver=0.15.20
pkgrel=1
pkgdesc="Minecraft mod manager and launcher from Modrinth (upstream binary)"
arch=('x86_64')
url="https://modrinth.com/app"
license=('GPL-3.0-only')
depends=('webkit2gtk-4.1' 'gtk3' 'hicolor-icon-theme')
provides=('modrinth-app')
conflicts=('modrinth-app')
options=('!strip' '!debug')
source=("${pkgname}-${pkgver}.deb::https://github.com/modrinth/code/releases/download/v${pkgver}/Modrinth.App_${pkgver}_amd64.deb")
noextract=("${pkgname}-${pkgver}.deb")
sha256sums=('b88f8f4b5b2017ad99fb3e89cbfe1dc1a6693aa67c2edf7e94ee959a42fb533a')
package() {
bsdtar -xOf "$srcdir/${pkgname}-${pkgver}.deb" 'data.tar.*' \
| bsdtar -xpf - -C "$pkgdir" usr
ln -s ModrinthApp "$pkgdir/usr/bin/modrinth-app"
}
+21
View File
@@ -0,0 +1,21 @@
# modrinth-app-bin - Modrinth App (https://github.com/modrinth/code),
# Minecraft mod manager/launcher, Tauri.
#
# Upstream publishes a bundled .deb per release, so there is no
# build_artifact() here: on a new version only pkgver and the checksum are
# refreshed and the PKGBUILD repackages the deb directly.
UPSTREAM_REPO="modrinth/code"
latest_version() {
gh api "repos/$UPSTREAM_REPO/releases/latest" --jq '.tag_name' | sed 's/^v//'
}
# refresh_checksums <version> <pkgbuild-path>
refresh_checksums() {
local ver="$1" pkgbuild="$2"
local sha
sha="$(curl -sfL "https://github.com/$UPSTREAM_REPO/releases/download/v$ver/Modrinth.App_${ver}_amd64.deb" \
| sha256sum | cut -d' ' -f1)"
sed -i "s|^sha256sums=.*|sha256sums=('$sha')|" "$pkgbuild"
}
+29
View File
@@ -0,0 +1,29 @@
pkgbase = planify-bin
pkgdesc = Task manager with Todoist and Nextcloud support (prebuilt, bundles gxml)
pkgver = 4.19.5
pkgrel = 1
url = https://useplanify.com
arch = x86_64
license = GPL-3.0-or-later
depends = evolution-data-server
depends = gtk4
depends = gtksourceview5
depends = icu
depends = json-glib
depends = libadwaita
depends = libgee
depends = libical
depends = libportal
depends = libportal-gtk4
depends = libsecret
depends = libsoup3
depends = libspelling
depends = sqlite
depends = hicolor-icon-theme
provides = planify
conflicts = planify
conflicts = elementary-planner
source = https://github.com/Felitendo/PKGBUILDS/releases/download/planify-bin-4.19.5/planify-bin-4.19.5.tar.zst
sha256sums = 563a80c7660b207f6c139e0f78bcb49631e8369be29369a7a984b022816b8c0f
pkgname = planify-bin
+22
View File
@@ -0,0 +1,22 @@
# Maintainer: Felitendo
# This PKGBUILD is updated automatically:
# https://github.com/Felitendo/PKGBUILDS
pkgname=planify-bin
pkgver=4.19.5
pkgrel=1
pkgdesc="Task manager with Todoist and Nextcloud support (prebuilt, bundles gxml)"
arch=('x86_64')
url="https://useplanify.com"
license=('GPL-3.0-or-later')
depends=('evolution-data-server' 'gtk4' 'gtksourceview5' 'icu' 'json-glib'
'libadwaita' 'libgee' 'libical' 'libportal' 'libportal-gtk4'
'libsecret' 'libsoup3' 'libspelling' 'sqlite' 'hicolor-icon-theme')
provides=('planify')
conflicts=('planify' 'elementary-planner')
source=("https://github.com/Felitendo/PKGBUILDS/releases/download/${pkgname}-${pkgver}/${pkgname}-${pkgver}.tar.zst")
sha256sums=('563a80c7660b207f6c139e0f78bcb49631e8369be29369a7a984b022816b8c0f')
package() {
cp -a "$srcdir/usr" "$pkgdir/"
}
+57
View File
@@ -0,0 +1,57 @@
# planify-bin - prebuilt package of https://github.com/alainm23/planify
# (task manager with Todoist/Nextcloud support, Vala/GTK4 + LibAdwaita).
#
# Upstream publishes no binary assets, so build_artifact() builds from the
# release tarball. The chrono and gxml dependencies are resolved through the
# meson wrap subprojects upstream ships (gxml is not packaged in the official
# Arch repos, so the library ends up bundled inside this package).
UPSTREAM_REPO="alainm23/planify"
# Installed in CI (pacman) before build_artifact runs. gxml is deliberately
# absent: meson then falls back to the bundled gxml-0.20.wrap subproject.
BUILD_DEPS=(meson ninja vala git gobject-introspection gettext glib2-devel
gtk4 libadwaita libgee gtksourceview5 json-glib libical libportal
libportal-gtk4 libsecret libsoup3 libspelling sqlite
evolution-data-server icu)
latest_version() {
gh api "repos/$UPSTREAM_REPO/releases/latest" --jq '.tag_name' | sed 's/^v//'
}
# build_artifact <version> <output-file>
build_artifact() {
local ver="$1" outfile="$2"
local workdir destdir srctree
workdir="$(mktemp -d)"
destdir="$(mktemp -d)"
curl -sfL "https://github.com/$UPSTREAM_REPO/archive/refs/tags/v$ver.tar.gz" | tar -xz -C "$workdir"
srctree="$workdir/planify-$ver"
# The preferences dialog suggests a flatpak-only quick-add command; point it
# at the plain binary instead (same fix as the AUR source package).
grep -q 'flatpak run --command=io.github.alainm23.planify.quick-add' \
"$srctree/src/Dialogs/Preferences/Pages/QuickAdd.vala" \
&& sed -i 's|flatpak run --command=io.github.alainm23.planify.quick-add|io.github.alainm23.planify.quick-add|' \
"$srctree/src/Dialogs/Preferences/Pages/QuickAdd.vala" \
|| echo "WARNING: quick-add flatpak command not found, sed skipped" >&2
meson setup "$workdir/build" "$srctree" --prefix=/usr --buildtype=release
meson install -C "$workdir/build" --destdir "$destdir"
# convenience names, as in the AUR source package
ln -s io.github.alainm23.planify "$destdir/usr/bin/planify"
ln -s io.github.alainm23.planify.quick-add "$destdir/usr/bin/planify.quick-add"
# These caches are generated by pacman hooks; shipping them would cause
# file conflicts on install.
rm -f "$destdir/usr/share/glib-2.0/schemas/gschemas.compiled" \
"$destdir/usr/share/applications/mimeinfo.cache" \
"$destdir/usr/share/icons/hicolor/icon-theme.cache"
tar --zstd --sort=name --owner=0 --group=0 --numeric-owner --mtime='@0' \
-cf "$outfile" -C "$destdir" usr
rm -rf "$workdir" "$destdir"
}
+20
View File
@@ -0,0 +1,20 @@
pkgbase = protonplus-bin
pkgdesc = Modern compatibility tools manager (prebuilt)
pkgver = 0.5.21
pkgrel = 1
url = https://github.com/Vysp3r/ProtonPlus
arch = x86_64
license = GPL-3.0-or-later
depends = gtk4
depends = json-glib
depends = libadwaita
depends = libarchive
depends = libgee
depends = libsoup3
depends = hicolor-icon-theme
provides = protonplus
conflicts = protonplus
source = https://github.com/Felitendo/PKGBUILDS/releases/download/protonplus-bin-0.5.21/protonplus-bin-0.5.21.tar.zst
sha256sums = 144992c7ad6a614cb05742ba2106cdc6a03329631fd64905932e11dd3636d7f2
pkgname = protonplus-bin
+21
View File
@@ -0,0 +1,21 @@
# Maintainer: Felitendo
# This PKGBUILD is updated automatically:
# https://github.com/Felitendo/PKGBUILDS
pkgname=protonplus-bin
pkgver=0.5.21
pkgrel=1
pkgdesc="Modern compatibility tools manager (prebuilt)"
arch=('x86_64')
url="https://github.com/Vysp3r/ProtonPlus"
license=('GPL-3.0-or-later')
depends=('gtk4' 'json-glib' 'libadwaita' 'libarchive' 'libgee' 'libsoup3'
'hicolor-icon-theme')
provides=('protonplus')
conflicts=('protonplus')
source=("https://github.com/Felitendo/PKGBUILDS/releases/download/${pkgname}-${pkgver}/${pkgname}-${pkgver}.tar.zst")
sha256sums=('144992c7ad6a614cb05742ba2106cdc6a03329631fd64905932e11dd3636d7f2')
package() {
cp -a "$srcdir/usr" "$pkgdir/"
}
+40
View File
@@ -0,0 +1,40 @@
# protonplus-bin - prebuilt package of https://github.com/Vysp3r/ProtonPlus
# (GTK4 + LibAdwaita compatibility-tools manager written in Vala).
#
# Upstream publishes no binary release assets, so build_artifact() compiles
# the Vala project from the release tarball (native x86_64 binary).
UPSTREAM_REPO="Vysp3r/ProtonPlus"
# Installed in CI (pacman) before build_artifact runs.
BUILD_DEPS=(meson ninja vala gtk4 libadwaita json-glib libgee libsoup3
libarchive gettext glib2-devel)
latest_version() {
gh api "repos/$UPSTREAM_REPO/releases/latest" --jq '.tag_name' | sed 's/^v//'
}
# build_artifact <version> <output-file>
build_artifact() {
local ver="$1" outfile="$2"
local workdir destdir srctree
workdir="$(mktemp -d)"
destdir="$(mktemp -d)"
curl -sfL "https://github.com/$UPSTREAM_REPO/archive/refs/tags/v$ver.tar.gz" | tar -xz -C "$workdir"
srctree="$workdir/ProtonPlus-$ver"
meson setup "$workdir/build" "$srctree" --prefix=/usr --buildtype=release -Dstrip=true
meson install -C "$workdir/build" --destdir "$destdir"
# These caches are generated by pacman hooks; shipping them would cause
# file conflicts on install.
rm -f "$destdir/usr/share/glib-2.0/schemas/gschemas.compiled" \
"$destdir/usr/share/applications/mimeinfo.cache" \
"$destdir/usr/share/icons/hicolor/icon-theme.cache"
tar --zstd --sort=name --owner=0 --group=0 --numeric-owner --mtime='@0' \
-cf "$outfile" -C "$destdir" usr
rm -rf "$workdir" "$destdir"
}
+114 -61
View File
@@ -1,12 +1,15 @@
#!/usr/bin/env bash
# Update one package directory:
# 1. determine the latest upstream version (pkg.sh: latest_version)
# 2. build the binary artifact if the matching GitHub release asset is
# missing (pkg.sh: build_artifact), otherwise reuse the published one
# 3. refresh PKGBUILD (pkgver/pkgrel/sha256sums), test-build it with
# makepkg and regenerate .SRCINFO
# 4. commit changes back to this repository
# 5. push PKGBUILD + .SRCINFO to the AUR
# 2. bring the PKGBUILD up to date:
# - packages we build ourselves (pkg.sh defines build_artifact): make
# sure the GitHub release asset for that version exists - building and
# uploading it if necessary - and sync pkgver/sha256sums with it
# - packages prebuilt by upstream (no build_artifact): on a new version,
# set pkgver and let pkg.sh's refresh_checksums update the sums
# 3. if the PKGBUILD changed: set pkgrel and run a makepkg test build
# 4. regenerate .SRCINFO and commit changes back to this repository
# 5. push the package files to the AUR if it differs
#
# Requires: GH_TOKEN (GitHub release + repo push), AUR_SSH_PRIVATE_KEY.
# Optional: AUR_GIT_NAME / AUR_GIT_EMAIL for the AUR commit identity.
@@ -17,6 +20,13 @@ repo_root="$(cd "$(dirname "$0")/.." && pwd)"
cd "$repo_root"
pkg="${pkg%/}"
# In the CI container the checkout is owned by a different uid than root;
# git (also invoked internally by gh) refuses to touch it without this.
if [[ "${CI:-}" == "true" ]]; then
git config --global --add safe.directory "$repo_root"
fi
BUILD_DEPS=()
source "$pkg/pkg.sh"
ver="$(latest_version || true)"
@@ -28,65 +38,85 @@ echo "$pkg: latest upstream version is $ver"
oldver="$(grep -Po '^pkgver=\K.*' "$pkg/PKGBUILD")"
oldrel="$(grep -Po '^pkgrel=\K.*' "$pkg/PKGBUILD")"
oldsha="$(grep -Po "^sha256sums=\('\K[0-9a-f]{64}" "$pkg/PKGBUILD" || true)"
tag="$pkg-$ver"
asset="$pkg-$ver.tar.zst"
### 2: bring the PKGBUILD up to date ########################################
### 1+2: make sure the release asset exists, get a local copy of it #########
if declare -f build_artifact >/dev/null; then
# We build the binary artifact and host it as a GitHub release asset.
tag="$pkg-$ver"
asset="$pkg-$ver.tar.zst"
if gh release view "$tag" --json assets -q '.assets[].name' 2>/dev/null | grep -qxF "$asset"; then
echo "$pkg: release $tag already contains $asset - reusing it"
gh release download "$tag" --pattern "$asset" --dir "$pkg" --clobber
if gh release view "$tag" --json assets -q '.assets[].name' 2>/dev/null | grep -qxF "$asset"; then
echo "$pkg: release $tag already contains $asset - reusing it"
gh release download "$tag" --pattern "$asset" --dir "$pkg" --clobber
else
echo "$pkg: building $asset"
if [[ "${CI:-}" == "true" && "${#BUILD_DEPS[@]}" -gt 0 ]]; then
pacman -S --noconfirm --needed "${BUILD_DEPS[@]}"
fi
build_artifact "$ver" "$repo_root/$pkg/$asset"
gh release view "$tag" >/dev/null 2>&1 || \
gh release create "$tag" --title "$tag" \
--notes "Automated build of $pkg $ver (upstream: ${UPSTREAM_REPO:-unknown})."
gh release upload "$tag" "$pkg/$asset" --clobber
fi
sha="$(sha256sum "$pkg/$asset" | cut -d' ' -f1)"
sed -i \
-e "s|^pkgver=.*|pkgver=$ver|" \
-e "s|^sha256sums=.*|sha256sums=('$sha')|" \
"$pkg/PKGBUILD"
else
echo "$pkg: building $asset"
if [[ "${CI:-}" == "true" && "${#BUILD_DEPS[@]}" -gt 0 ]]; then
pacman -S --noconfirm --needed "${BUILD_DEPS[@]}"
# Upstream publishes the binaries itself; only refresh version + checksums.
if [[ "$ver" != "$oldver" ]]; then
sed -i "s|^pkgver=.*|pkgver=$ver|" "$pkg/PKGBUILD"
refresh_checksums "$ver" "$pkg/PKGBUILD"
else
echo "$pkg: $ver is current"
fi
build_artifact "$ver" "$repo_root/$pkg/$asset"
gh release view "$tag" >/dev/null 2>&1 || \
gh release create "$tag" --title "$tag" \
--notes "Automated build of $pkg $ver (upstream: ${UPSTREAM_REPO:-unknown})."
gh release upload "$tag" "$pkg/$asset" --clobber
fi
sha="$(sha256sum "$pkg/$asset" | cut -d' ' -f1)"
### 3: pkgrel + test build if the PKGBUILD changed ##########################
### 3: refresh PKGBUILD, test-build, regenerate .SRCINFO ####################
# makepkg refuses to run as root (the CI container), so hand it to an
# unprivileged user there.
run_makepkg() {
if [[ "$EUID" -eq 0 ]]; then
useradd -m builder 2>/dev/null || true
chown -R builder "$pkg"
(cd "$pkg" && runuser -u builder -- makepkg "$@")
else
(cd "$pkg" && makepkg "$@")
fi
}
if [[ "$ver" != "$oldver" ]]; then
rel=1
elif [[ "$sha" != "$oldsha" ]]; then
rel=$((oldrel + 1))
else
if git diff --quiet -- "$pkg/PKGBUILD"; then
rel="$oldrel"
fi
sed -i \
-e "s|^pkgver=.*|pkgver=$ver|" \
-e "s|^pkgrel=.*|pkgrel=$rel|" \
-e "s|^sha256sums=.*|sha256sums=('$sha')|" \
"$pkg/PKGBUILD"
# makepkg refuses to run as root (the CI container), so hand the build to an
# unprivileged user there. -d: the runner only needs to package, not run.
if [[ "$EUID" -eq 0 ]]; then
useradd -m builder 2>/dev/null || true
chown -R builder "$pkg"
(cd "$pkg" && runuser -u builder -- makepkg -fdc)
(cd "$pkg" && runuser -u builder -- makepkg --printsrcinfo > .SRCINFO)
chown -R 0:0 "$pkg"
else
(cd "$pkg" && makepkg -fdc)
(cd "$pkg" && makepkg --printsrcinfo > .SRCINFO)
if [[ "$ver" != "$oldver" ]]; then
rel=1
else
rel=$((oldrel + 1))
fi
sed -i "s|^pkgrel=.*|pkgrel=$rel|" "$pkg/PKGBUILD"
# -d: the runner only needs to package, not run the result
run_makepkg -fdc
echo "$pkg: makepkg test build succeeded"
fi
echo "$pkg: makepkg test build succeeded"
rm -f "$pkg/$asset" "$pkg"/*.pkg.tar.*
# .SRCINFO regeneration is cheap - do it every run so it can never go stale
run_makepkg --printsrcinfo > "$pkg/.SRCINFO.new"
mv "$pkg/.SRCINFO.new" "$pkg/.SRCINFO"
[[ "$EUID" -eq 0 ]] && chown -R 0:0 "$pkg"
# drop downloaded sources and build leftovers (all gitignored, never tracked)
rm -rf "$pkg/src" "$pkg/pkg"
rm -f "$pkg"/*.pkg.tar.* "$pkg"/*.tar.zst "$pkg"/*.tar.gz "$pkg"/*.deb
### 4: commit back to this repository ########################################
if [[ "${CI:-}" == "true" ]]; then
git config --global --add safe.directory "$repo_root"
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
@@ -108,27 +138,31 @@ if [[ -z "${AUR_SSH_PRIVATE_KEY:-}" ]]; then
exit 1
fi
mkdir -p ~/.ssh && chmod 700 ~/.ssh
printf '%s\n' "$AUR_SSH_PRIVATE_KEY" > ~/.ssh/aur_key
chmod 600 ~/.ssh/aur_key
cat >> ~/.ssh/config <<'EOF'
Host aur.archlinux.org
User aur
IdentityFile ~/.ssh/aur_key
IdentitiesOnly yes
EOF
# Pass the key and known_hosts explicitly instead of via ~/.ssh: in the CI
# container $HOME and the passwd home directory disagree, and ssh resolves
# "~" through the latter, silently ignoring anything written to $HOME/.ssh.
sshdir="$(mktemp -d)"
printf '%s\n' "$AUR_SSH_PRIVATE_KEY" > "$sshdir/key"
chmod 600 "$sshdir/key"
# Pinned host key, see https://aur.archlinux.org
echo 'aur.archlinux.org ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEuBKrPzbawxA/k2g6NcyV5jmqwJ2s+zpgZGZ7tpLIcN' \
>> ~/.ssh/known_hosts
> "$sshdir/known_hosts"
export GIT_SSH_COMMAND="ssh -i $sshdir/key -o UserKnownHostsFile=$sshdir/known_hosts -o IdentitiesOnly=yes"
aurdir="$(mktemp -d)"
git clone "ssh://aur@aur.archlinux.org/$pkg.git" "$aurdir"
cp "$pkg/PKGBUILD" "$pkg/.SRCINFO" "$aurdir/"
# every tracked file of the package except our automation glue belongs on
# the AUR (PKGBUILD, .SRCINFO, .desktop files, .install files, ...)
while IFS= read -r f; do
[[ "$(basename "$f")" == "pkg.sh" ]] && continue
cp "$f" "$aurdir/"
done < <(git ls-files "$pkg")
cd "$aurdir"
git config user.name "${AUR_GIT_NAME:-Felitendo}"
git config user.email "${AUR_GIT_EMAIL:-95575686+Felitendo@users.noreply.github.com}"
git add PKGBUILD .SRCINFO
git add -A
if git diff --cached --quiet && [[ -n "$(git ls-remote origin)" ]]; then
echo "$pkg: AUR package is already up to date"
else
@@ -136,3 +170,22 @@ else
git push origin HEAD:master
echo "$pkg: pushed $ver-$rel to the AUR"
fi
### 6: prune superseded GitHub releases ######################################
# Build-mode packages get one release per version; once a newer version is
# fully published (asset built, PKGBUILD updated, AUR pushed - i.e. we got
# this far) the older releases are no longer referenced by anything, so drop
# them together with their tags. Runs every time to also catch leftovers.
cd "$repo_root"
if declare -f build_artifact >/dev/null; then
while IFS= read -r tag; do
[[ "$tag" == "$pkg-$ver" ]] && continue
rest="${tag#"$pkg-"}"
# only this package's tags: "<pkg>-<version>" (a pkgver never contains
# "-", which also keeps prefix-sharing package names apart)
[[ "$tag" == "$pkg-"* && "$rest" != *-* ]] || continue
echo "$pkg: deleting superseded release $tag"
gh release delete "$tag" --cleanup-tag --yes
done < <(gh release list --limit 100 --json tagName -q '.[].tagName')
fi
+27
View File
@@ -0,0 +1,27 @@
pkgbase = sharpemu-bin
pkgdesc = Experimental PlayStation 5 emulator (prebuilt)
pkgver = 0.0.2_beta.5
pkgrel = 1
url = https://github.com/sharpemu/sharpemu
arch = x86_64
license = GPL-2.0-or-later
depends = glibc
depends = gcc-libs
depends = icu
depends = openssl
depends = vulkan-icd-loader
depends = libx11
depends = libxcursor
depends = libxi
depends = libxinerama
depends = libxrandr
depends = libxkbcommon
depends = wayland
provides = sharpemu
conflicts = sharpemu
noextract = sharpemu-0.0.2-beta.5-linux-x64.tar.gz
options = !strip
source_x86_64 = https://github.com/sharpemu/sharpemu/releases/download/v0.0.2-beta.5/sharpemu-0.0.2-beta.5-linux-x64.tar.gz
sha256sums_x86_64 = 5e75173da220832e8ca56d4b88fd7effc77772da9b785bfb721ff138d5664cc4
pkgname = sharpemu-bin
+39
View File
@@ -0,0 +1,39 @@
# Maintainer: Felitendo
# This PKGBUILD is updated automatically:
# https://github.com/Felitendo/PKGBUILDS
pkgname=sharpemu-bin
pkgver=0.0.2_beta.5
pkgrel=1
pkgdesc="Experimental PlayStation 5 emulator (prebuilt)"
arch=('x86_64')
url="https://github.com/sharpemu/sharpemu"
license=('GPL-2.0-or-later')
# The self-contained .NET binary bundles its own libglfw.so.3, which in turn
# dlopens the X11/Wayland client libraries at runtime.
depends=('glibc' 'gcc-libs' 'icu' 'openssl' 'vulkan-icd-loader'
'libx11' 'libxcursor' 'libxi' 'libxinerama' 'libxrandr'
'libxkbcommon' 'wayland')
provides=('sharpemu')
conflicts=('sharpemu')
options=('!strip')
# upstream tags use hyphens (v0.0.2-beta.4), which pkgver must not contain
_upver="${pkgver//_/-}"
noextract=("sharpemu-${_upver}-linux-x64.tar.gz")
source_x86_64=("https://github.com/sharpemu/sharpemu/releases/download/v${_upver}/sharpemu-${_upver}-linux-x64.tar.gz")
sha256sums_x86_64=('5e75173da220832e8ca56d4b88fd7effc77772da9b785bfb721ff138d5664cc4')
package() {
# extracted straight into pkgdir so new files in future upstream archives
# are picked up automatically
install -d "$pkgdir/opt/$pkgname"
tar -xzf "$srcdir/sharpemu-${_upver}-linux-x64.tar.gz" -C "$pkgdir/opt/$pkgname"
chmod 755 "$pkgdir/opt/$pkgname/SharpEmu"
install -d "$pkgdir/usr/bin"
ln -s "/opt/$pkgname/SharpEmu" "$pkgdir/usr/bin/sharpemu"
install -Dm644 "$pkgdir/opt/$pkgname/LICENSE.txt" \
"$pkgdir/usr/share/licenses/$pkgname/LICENSE.txt"
}
+28
View File
@@ -0,0 +1,28 @@
# sharpemu-bin - SharpEmu (https://github.com/sharpemu/sharpemu), an
# experimental PlayStation 5 emulator written in C#.
#
# Upstream publishes prebuilt linux-x64 release assets itself, so there is no
# build_artifact() here: on a new version only pkgver and the checksums are
# refreshed and the result is pushed to the AUR.
#
# Upstream versions contain hyphens (v0.0.2-beta.4), which an Arch pkgver
# must not; latest_version therefore reports the underscored form
# (0.0.2_beta.4) and the PKGBUILD derives the upstream form back via _upver.
UPSTREAM_REPO="sharpemu/sharpemu"
latest_version() {
# gh instead of plain curl: authenticated API calls, so shared-IP rate
# limits on the CI runners can't bite.
gh api "repos/$UPSTREAM_REPO/releases/latest" --jq '.tag_name' \
| sed -e 's/^v//' -e 's/-/_/g'
}
# refresh_checksums <version> <pkgbuild-path>
refresh_checksums() {
local ver="$1" pkgbuild="$2"
local upver="${ver//_/-}" sha
sha="$(curl -sfL "https://github.com/$UPSTREAM_REPO/releases/download/v$upver/sharpemu-$upver-linux-x64.tar.gz" \
| sha256sum | cut -d' ' -f1)"
sed -i "s|^sha256sums_x86_64=.*|sha256sums_x86_64=('$sha')|" "$pkgbuild"
}
+18
View File
@@ -0,0 +1,18 @@
pkgbase = snapx-bin
pkgdesc = Screenshot tool that handles images, text, and video - ShareX fork, Avalonia UI (upstream binary)
pkgver = 0.4.0
pkgrel = 1
url = https://github.com/SnapXL/SnapX
arch = x86_64
license = GPL-3.0-or-later
depends = glibc
depends = gcc-libs
depends = hicolor-icon-theme
provides = snapx-ui
conflicts = snapx-ui
options = !strip
options = !debug
source = https://github.com/Felitendo/PKGBUILDS/releases/download/snapx-bin-0.4.0/snapx-bin-0.4.0.tar.zst
sha256sums = d2098cac542bca82e68be0a4fa98db22f2d84d35c683d18582382dc9206eb5ee
pkgname = snapx-bin
+22
View File
@@ -0,0 +1,22 @@
# Maintainer: Felitendo
# This PKGBUILD is updated automatically:
# https://github.com/Felitendo/PKGBUILDS
pkgname=snapx-bin
pkgver=0.4.0
pkgrel=1
pkgdesc="Screenshot tool that handles images, text, and video - ShareX fork, Avalonia UI (upstream binary)"
arch=('x86_64')
url="https://github.com/SnapXL/SnapX"
license=('GPL-3.0-or-later')
depends=('glibc' 'gcc-libs' 'hicolor-icon-theme')
provides=('snapx-ui')
conflicts=('snapx-ui')
options=('!strip' '!debug')
source=("https://github.com/Felitendo/PKGBUILDS/releases/download/${pkgname}-${pkgver}/${pkgname}-${pkgver}.tar.zst")
sha256sums=('d2098cac542bca82e68be0a4fa98db22f2d84d35c683d18582382dc9206eb5ee')
package() {
cp -a "$srcdir/usr" "$pkgdir/"
cp -a "$srcdir/opt" "$pkgdir/"
}
+52
View File
@@ -0,0 +1,52 @@
# snapx-bin - SnapX (https://github.com/SnapXL/SnapX), screenshot/sharing
# tool forked from ShareX, C#/.NET Avalonia UI.
#
# Upstream ships a self-contained Linux bundle per (pre)release, but the
# asset names embed build metadata (e.g. ...-0.4.0-alpha.0+g7eafb0f-X64...)
# that cannot be derived from the version alone. build_artifact() therefore
# resolves the asset by pattern via the GitHub API and repackages it under
# our own predictable name. All upstream releases are marked prerelease, so
# latest_version() reads the release list instead of /latest.
UPSTREAM_REPO="SnapXL/SnapX"
BUILD_DEPS=()
latest_version() {
gh api "repos/$UPSTREAM_REPO/releases" --jq '.[0].tag_name' | sed 's/^v//'
}
# build_artifact <version> <output-file>
build_artifact() {
local ver="$1" outfile="$2"
local workdir destdir asset
workdir="$(mktemp -d)"
destdir="$(mktemp -d)"
asset="$(gh api "repos/$UPSTREAM_REPO/releases/tags/v$ver" --jq '.assets[].name' \
| grep '^SnapX-UI-Release-Linux-' | grep -v musl | grep -- '-X64\.tar\.zst$')"
[[ "$(wc -l <<< "$asset")" -eq 1 ]] || { echo "expected exactly one UI asset, got: $asset" >&2; return 1; }
gh release download "v$ver" -R "$UPSTREAM_REPO" --pattern "$asset" --dir "$workdir"
mkdir -p "$destdir/opt/snapx"
tar -xf "$workdir/$asset" -C "$destdir/opt/snapx"
chmod 755 "$destdir/opt/snapx/snapx-ui"
# upstream's launcher resolves its own directory, so a symlink from
# /usr/bin would break it - use a wrapper instead
mkdir -p "$destdir/usr/bin"
cat > "$destdir/usr/bin/snapx-ui" << 'EOF'
#!/bin/sh
exec /opt/snapx/snapx-ui "$@"
EOF
chmod 755 "$destdir/usr/bin/snapx-ui"
# desktop file, icons and metainfo from the source tree
curl -sfL "https://github.com/$UPSTREAM_REPO/archive/refs/tags/v$ver.tar.gz" | tar -xz -C "$workdir"
cp -a "$workdir/SnapX-$ver/packaging/usr/share" "$destdir/usr/"
tar --zstd --sort=name --owner=0 --group=0 --numeric-owner --mtime='@0' \
-cf "$outfile" -C "$destdir" usr opt
rm -rf "$workdir" "$destdir"
}
+17
View File
@@ -0,0 +1,17 @@
pkgbase = thonny-bin
pkgdesc = Python IDE for beginners (prebuilt, with bundled Python runtime)
pkgver = 5.0.0
pkgrel = 1
url = https://github.com/thonny/thonny
arch = x86_64
license = MIT
depends = glibc
depends = gcc-libs
optdepends = libnotify: desktop notifications (dlopened by Tk)
provides = thonny
conflicts = thonny
options = !strip
source = https://github.com/Felitendo/PKGBUILDS/releases/download/thonny-bin-5.0.0/thonny-bin-5.0.0.tar.zst
sha256sums = 7baea7ff70d7aa6e86fa1153ba8f156d8f5a402ddb5279d8e15ceceb4aaa53e5
pkgname = thonny-bin
+24
View File
@@ -0,0 +1,24 @@
# Maintainer: Felitendo
# This PKGBUILD is updated automatically:
# https://github.com/Felitendo/PKGBUILDS
pkgname=thonny-bin
pkgver=5.0.0
pkgrel=1
pkgdesc="Python IDE for beginners (prebuilt, with bundled Python runtime)"
arch=('x86_64')
url="https://github.com/thonny/thonny"
license=('MIT')
# The bundled standalone CPython (python-build-standalone) links everything
# else - including tcl/tk 9 and its X11 client libraries - statically.
depends=('glibc' 'gcc-libs')
optdepends=('libnotify: desktop notifications (dlopened by Tk)')
provides=('thonny')
conflicts=('thonny')
options=('!strip')
source=("https://github.com/Felitendo/PKGBUILDS/releases/download/${pkgname}-${pkgver}/${pkgname}-${pkgver}.tar.zst")
sha256sums=('7baea7ff70d7aa6e86fa1153ba8f156d8f5a402ddb5279d8e15ceceb4aaa53e5')
package() {
cp -a "$srcdir/opt" "$srcdir/usr" "$pkgdir/"
}
+102
View File
@@ -0,0 +1,102 @@
# thonny-bin - Thonny (https://github.com/thonny/thonny), a Python IDE for
# beginners.
#
# Since 5.0 upstream ships no prebuilt Linux bundle anymore - the official
# installer script just creates a venv from the system Python and
# pip-installs thonny plus a pinned set of extras. A venv tied to the system
# Python would silently break on every Arch Python minor bump, so
# build_artifact() instead bundles a relocatable standalone CPython
# (astral-sh/python-build-standalone, tkinter included) into /opt/thonny-bin
# and pip-installs into that, mirroring the dependency pins of upstream's
# installer script. The install tree is published as a GitHub release asset
# of this repository, which the PKGBUILD then uses.
UPSTREAM_REPO="thonny/thonny"
# Series of the bundled CPython; bump deliberately (thonny 5.x supports
# Python 3.9-3.15).
PYTHON_SERIES="3.13"
BUILD_DEPS=()
latest_version() {
# gh instead of plain curl: authenticated API calls, so shared-IP rate
# limits on the CI runners can't bite.
gh api "repos/$UPSTREAM_REPO/releases/latest" --jq '.tag_name' | sed 's/^v//'
}
# build_artifact <version> <output-file>
build_artifact() {
local ver="$1" outfile="$2"
local workdir root prefix py
workdir="$(mktemp -d)"
root="$workdir/root"
prefix="$root/opt/thonny-bin"
mkdir -p "$prefix"
gh release download -R astral-sh/python-build-standalone \
--pattern "cpython-${PYTHON_SERIES}.*-x86_64-unknown-linux-gnu-install_only_stripped.tar.gz" \
--dir "$workdir"
tar -xzf "$workdir"/cpython-*.tar.gz -C "$workdir"
cp -a "$workdir/python/." "$prefix/"
py="$prefix/bin/python3"
# Upstream's installer script is the authority on which extra packages
# (and pins) belong to a release - parse its pip install line instead of
# hardcoding a list that would go stale.
curl -sfL "https://github.com/$UPSTREAM_REPO/releases/download/v$ver/thonny-$ver.bash" \
-o "$workdir/installer.bash"
local extras=()
mapfile -t extras < <(grep -m1 -- "-m pip install '" "$workdir/installer.bash" \
| grep -oP "'[^']*'" | sed "s/^'//; s/'\$//")
if [[ ${#extras[@]} -eq 0 ]]; then
echo "thonny-bin: could not parse the extras list from the installer script" >&2
return 1
fi
"$py" -m pip install --no-cache-dir --no-compile "${extras[@]}" "thonny==$ver"
# pip wrote the staging path into the script shebangs; point them at the
# final install location.
local f
for f in "$prefix/bin/"*; do
[[ -f "$f" && ! -L "$f" && "$(head -c 2 "$f")" == '#!' ]] || continue
sed -i "1s|$prefix|/opt/thonny-bin|" "$f"
done
# Precompile with the final paths recorded in the .pyc files - users can't
# write __pycache__ under /opt at runtime. Some packages ship
# intentionally uncompilable files, hence the || true.
"$py" -m compileall -q -s "$root" "$prefix/lib" || true
local sitepkg
sitepkg="$("$py" -c 'import os, thonny; print(os.path.dirname(thonny.__file__))')"
install -d "$root/usr/bin" "$root/usr/share/applications" \
"$root/usr/share/pixmaps" "$root/usr/share/licenses/thonny-bin"
ln -s /opt/thonny-bin/bin/thonny "$root/usr/bin/thonny"
cp "$sitepkg/res/thonny.png" "$root/usr/share/pixmaps/thonny.png"
curl -sfL "https://raw.githubusercontent.com/$UPSTREAM_REPO/v$ver/LICENSE.txt" \
-o "$root/usr/share/licenses/thonny-bin/LICENSE.txt"
# Mirrors the launcher that upstream's installer script generates.
cat > "$root/usr/share/applications/thonny.desktop" <<'EOF'
[Desktop Entry]
Type=Application
Name=Thonny
GenericName=Python IDE
Comment=Python IDE for beginners
Exec=/opt/thonny-bin/bin/thonny %F
Icon=thonny
StartupWMClass=Thonny
Terminal=false
Categories=Development;IDE;
Keywords=programming;education;
MimeType=text/x-python;
EOF
tar --zstd --sort=name --owner=0 --group=0 --numeric-owner --mtime='@0' \
-cf "$outfile" -C "$root" opt usr
rm -rf "$workdir"
}
+7 -4
View File
@@ -1,22 +1,25 @@
pkgbase = timetable-bin
pkgdesc = GTK4 + LibAdwaita client for WebUntis (prebuilt, bundles python-webuntis)
pkgver = 3.1
pkgdesc = GTK4 + LibAdwaita client for WebUntis (prebuilt)
pkgver = 4.2.1
pkgrel = 1
url = https://codeberg.org/ostfriese4/untis
arch = any
license = GPL-3.0-or-later
depends = gtk4
depends = libadwaita
depends = webkitgtk-6.0
depends = libsecret
depends = python
depends = python-gobject
depends = python-requests
depends = python-pyotp
depends = glib2
depends = hicolor-icon-theme
provides = untis
provides = timetable
conflicts = untis
conflicts = timetable
source = https://github.com/Felitendo/PKGBUILDS/releases/download/timetable-bin-3.1/timetable-bin-3.1.tar.zst
sha256sums = ffd735d1a08204fe18e563815813b3a62f7625bce5bd5d4c086f1456422e0590
source = https://github.com/Felitendo/PKGBUILDS/releases/download/timetable-bin-4.2.1/timetable-bin-4.2.1.tar.zst
sha256sums = c68179716fdb5eb6268203168207a1ea7d03a75456c00de38d152dc6098bd0dc
pkgname = timetable-bin
+5 -4
View File
@@ -3,17 +3,18 @@
# https://github.com/Felitendo/PKGBUILDS
pkgname=timetable-bin
pkgver=3.1
pkgver=4.2.1
pkgrel=1
pkgdesc="GTK4 + LibAdwaita client for WebUntis (prebuilt, bundles python-webuntis)"
pkgdesc="GTK4 + LibAdwaita client for WebUntis (prebuilt)"
arch=('any')
url="https://codeberg.org/ostfriese4/untis"
license=('GPL-3.0-or-later')
depends=('gtk4' 'libadwaita' 'python' 'python-gobject' 'python-requests' 'glib2' 'hicolor-icon-theme')
depends=('gtk4' 'libadwaita' 'webkitgtk-6.0' 'libsecret' 'python' 'python-gobject'
'python-requests' 'python-pyotp' 'glib2' 'hicolor-icon-theme')
provides=('untis' 'timetable')
conflicts=('untis' 'timetable')
source=("https://github.com/Felitendo/PKGBUILDS/releases/download/${pkgname}-${pkgver}/${pkgname}-${pkgver}.tar.zst")
sha256sums=('ffd735d1a08204fe18e563815813b3a62f7625bce5bd5d4c086f1456422e0590')
sha256sums=('c68179716fdb5eb6268203168207a1ea7d03a75456c00de38d152dc6098bd0dc')
package() {
cp -a "$srcdir/usr" "$pkgdir/"
+1 -6
View File
@@ -8,7 +8,7 @@
UPSTREAM_REPO="ostfriese4/untis"
# Installed in CI (pacman) before build_artifact runs.
BUILD_DEPS=(meson ninja glib2 glib2-devel gtk4 libadwaita python python-gobject python-pip gettext)
BUILD_DEPS=(meson ninja glib2 glib2-devel gtk4 libadwaita python python-gobject gettext)
latest_version() {
curl -sf "https://codeberg.org/api/v1/repos/$UPSTREAM_REPO/releases/latest" \
@@ -31,11 +31,6 @@ build_artifact() {
meson setup "$workdir/build" "$workdir/untis" --prefix=/usr --buildtype=release
meson install -C "$workdir/build" --destdir "$destdir"
# Bundle the pure-python webuntis library: it is packaged neither in the
# Arch repos nor on the AUR. /usr/share/untis is on the launcher's sys.path.
pip download --no-deps --only-binary :all: --dest "$workdir/wheels" webuntis
python -m zipfile -e "$workdir"/wheels/webuntis-*.whl "$destdir/usr/share/untis/"
# These caches are generated by pacman hooks; shipping them would cause
# file conflicts on install.
rm -f "$destdir/usr/share/glib-2.0/schemas/gschemas.compiled" \
+17
View File
@@ -0,0 +1,17 @@
pkgbase = trayscale-bin
pkgdesc = Unofficial GUI wrapper for the Tailscale CLI client (prebuilt)
pkgver = 0.18.9
pkgrel = 1
url = https://github.com/DeedleFake/trayscale
arch = x86_64
license = MIT
depends = gtk4
depends = libadwaita
depends = hicolor-icon-theme
optdepends = tailscale: provides the daemon that manages the connection
provides = trayscale
conflicts = trayscale
source = https://github.com/Felitendo/PKGBUILDS/releases/download/trayscale-bin-0.18.9/trayscale-bin-0.18.9.tar.zst
sha256sums = 1b24f332a64a682e972e94fecfc11a7d719a1c74c5fd897c45c08cbd17d0ae93
pkgname = trayscale-bin
+21
View File
@@ -0,0 +1,21 @@
# Maintainer: Felitendo
# This PKGBUILD is updated automatically:
# https://github.com/Felitendo/PKGBUILDS
pkgname=trayscale-bin
pkgver=0.18.9
pkgrel=1
pkgdesc="Unofficial GUI wrapper for the Tailscale CLI client (prebuilt)"
arch=('x86_64')
url="https://github.com/DeedleFake/trayscale"
license=('MIT')
depends=('gtk4' 'libadwaita' 'hicolor-icon-theme')
optdepends=('tailscale: provides the daemon that manages the connection')
provides=('trayscale')
conflicts=('trayscale')
source=("https://github.com/Felitendo/PKGBUILDS/releases/download/${pkgname}-${pkgver}/${pkgname}-${pkgver}.tar.zst")
sha256sums=('1b24f332a64a682e972e94fecfc11a7d719a1c74c5fd897c45c08cbd17d0ae93')
package() {
cp -a "$srcdir/usr" "$pkgdir/"
}
+36
View File
@@ -0,0 +1,36 @@
# trayscale-bin - prebuilt package of https://github.com/DeedleFake/trayscale
# (unofficial GTK4 + LibAdwaita GUI for the Tailscale CLI, written in Go).
#
# Upstream publishes no Linux binary assets, so build_artifact() builds the
# Go binary from the release tarball via upstream's dist.sh (slow: the gotk4
# bindings take a while to compile).
UPSTREAM_REPO="DeedleFake/trayscale"
# Installed in CI (pacman) before build_artifact runs.
BUILD_DEPS=(go gtk4 libadwaita gobject-introspection)
latest_version() {
gh api "repos/$UPSTREAM_REPO/releases/latest" --jq '.tag_name' | sed 's/^v//'
}
# build_artifact <version> <output-file>
build_artifact() {
local ver="$1" outfile="$2"
local workdir destdir srctree
workdir="$(mktemp -d)"
destdir="$(mktemp -d)"
curl -sfL "https://github.com/$UPSTREAM_REPO/archive/refs/tags/v$ver.tar.gz" | tar -xz -C "$workdir"
srctree="$workdir/trayscale-$ver"
(cd "$srctree" && \
GOMODCACHE="$workdir/gomodcache" GOFLAGS="-modcacherw" \
./dist.sh build "v$ver" && \
./dist.sh install "$destdir/usr")
tar --zstd --sort=name --owner=0 --group=0 --numeric-owner --mtime='@0' \
-cf "$outfile" -C "$destdir" usr
rm -rf "$workdir" "$destdir"
}
+27
View File
@@ -0,0 +1,27 @@
pkgbase = vacuumtube-bin
pkgdesc = YouTube Leanback (TV UI) in Electron, with a built-in adblocker (upstream binary)
pkgver = 1.8.1
pkgrel = 1
url = https://github.com/shy1132/VacuumTube
arch = x86_64
license = MIT
depends = gtk3
depends = nss
depends = alsa-lib
depends = libnotify
depends = libxss
depends = libxtst
depends = xdg-utils
depends = at-spi2-core
depends = util-linux-libs
depends = libsecret
optdepends = libappindicator-gtk3: tray icon support
provides = vacuumtube
conflicts = vacuumtube
noextract = vacuumtube-bin-1.8.1.deb
options = !strip
options = !debug
source = vacuumtube-bin-1.8.1.deb::https://github.com/shy1132/VacuumTube/releases/download/v1.8.1/VacuumTube-amd64.deb
sha256sums = 652be4e29e85ed31d3a1bae4dad00e6d39967ad0cf7cc47547b0ec94bacd0d51
pkgname = vacuumtube-bin
+27
View File
@@ -0,0 +1,27 @@
# Maintainer: Felitendo
# This PKGBUILD is updated automatically:
# https://github.com/Felitendo/PKGBUILDS
pkgname=vacuumtube-bin
pkgver=1.8.1
pkgrel=1
pkgdesc="YouTube Leanback (TV UI) in Electron, with a built-in adblocker (upstream binary)"
arch=('x86_64')
url="https://github.com/shy1132/VacuumTube"
license=('MIT')
depends=('gtk3' 'nss' 'alsa-lib' 'libnotify' 'libxss' 'libxtst' 'xdg-utils'
'at-spi2-core' 'util-linux-libs' 'libsecret')
optdepends=('libappindicator-gtk3: tray icon support')
provides=('vacuumtube')
conflicts=('vacuumtube')
options=('!strip' '!debug')
source=("${pkgname}-${pkgver}.deb::https://github.com/shy1132/VacuumTube/releases/download/v${pkgver}/VacuumTube-amd64.deb")
noextract=("${pkgname}-${pkgver}.deb")
sha256sums=('652be4e29e85ed31d3a1bae4dad00e6d39967ad0cf7cc47547b0ec94bacd0d51')
package() {
bsdtar -xOf "$srcdir/${pkgname}-${pkgver}.deb" 'data.tar.*' \
| bsdtar -xpf - -C "$pkgdir" --exclude './usr/share/doc' ./opt ./usr
install -d "$pkgdir/usr/bin"
ln -s /opt/VacuumTube/vacuumtube "$pkgdir/usr/bin/vacuumtube"
}
+21
View File
@@ -0,0 +1,21 @@
# vacuumtube-bin - VacuumTube (https://github.com/shy1132/VacuumTube),
# YouTube Leanback (TV UI) wrapper, Electron.
#
# Upstream publishes a bundled .deb per release, so there is no
# build_artifact() here: on a new version only pkgver and the checksum are
# refreshed and the PKGBUILD repackages the deb directly.
UPSTREAM_REPO="shy1132/VacuumTube"
latest_version() {
gh api "repos/$UPSTREAM_REPO/releases/latest" --jq '.tag_name' | sed 's/^v//'
}
# refresh_checksums <version> <pkgbuild-path>
refresh_checksums() {
local ver="$1" pkgbuild="$2"
local sha
sha="$(curl -sfL "https://github.com/$UPSTREAM_REPO/releases/download/v$ver/VacuumTube-amd64.deb" \
| sha256sum | cut -d' ' -f1)"
sed -i "s|^sha256sums=.*|sha256sums=('$sha')|" "$pkgbuild"
}
+22
View File
@@ -0,0 +1,22 @@
pkgbase = wiiudownloader-bin
pkgdesc = Download encrypted Wii U files from Nintendo's official servers (prebuilt)
pkgver = 2.98
pkgrel = 1
url = https://github.com/Xpl0itU/WiiUDownloader
arch = x86_64
license = GPL-3.0-or-later
depends = glibc
depends = glib2
depends = hicolor-icon-theme
depends = libx11
depends = gtk3
depends = gdk-pixbuf2
depends = cairo
depends = pango
depends = fontconfig
provides = wiiudownloader
conflicts = wiiudownloader
source = https://github.com/Felitendo/PKGBUILDS/releases/download/wiiudownloader-bin-2.98/wiiudownloader-bin-2.98.tar.zst
sha256sums = 5b2bd57e6531aee1774ca3b9acc70bc402eab585a2532a666f4484584412622e
pkgname = wiiudownloader-bin
+21
View File
@@ -0,0 +1,21 @@
# Maintainer: Felitendo
# This PKGBUILD is updated automatically:
# https://github.com/Felitendo/PKGBUILDS
pkgname=wiiudownloader-bin
pkgver=2.98
pkgrel=1
pkgdesc="Download encrypted Wii U files from Nintendo's official servers (prebuilt)"
arch=('x86_64')
url="https://github.com/Xpl0itU/WiiUDownloader"
license=('GPL-3.0-or-later')
depends=('glibc' 'glib2' 'hicolor-icon-theme' 'libx11' 'gtk3' 'gdk-pixbuf2'
'cairo' 'pango' 'fontconfig')
provides=('wiiudownloader')
conflicts=('wiiudownloader')
source=("https://github.com/Felitendo/PKGBUILDS/releases/download/${pkgname}-${pkgver}/${pkgname}-${pkgver}.tar.zst")
sha256sums=('5b2bd57e6531aee1774ca3b9acc70bc402eab585a2532a666f4484584412622e')
package() {
cp -a "$srcdir/usr" "$pkgdir/"
}
+55
View File
@@ -0,0 +1,55 @@
# wiiudownloader-bin - prebuilt package of https://github.com/Xpl0itU/WiiUDownloader
# (Go + GTK3 downloader for Wii U titles from Nintendo's official servers).
#
# Upstream only ships AppImages, so build_artifact() builds the Go binary
# from the release tarball (grabTitles.py generates the title database that
# is compiled in).
UPSTREAM_REPO="Xpl0itU/WiiUDownloader"
# Installed in CI (pacman) before build_artifact runs.
BUILD_DEPS=(go gtk3 python)
latest_version() {
gh api "repos/$UPSTREAM_REPO/releases/latest" --jq '.tag_name' | sed 's/^v//'
}
# build_artifact <version> <output-file>
build_artifact() {
local ver="$1" outfile="$2"
local workdir destdir srctree
workdir="$(mktemp -d)"
destdir="$(mktemp -d)"
curl -sfL "https://github.com/$UPSTREAM_REPO/archive/refs/tags/v$ver.tar.gz" | tar -xz -C "$workdir"
srctree="$workdir/WiiUDownloader-$ver"
(cd "$srctree" && python3 grabTitles.py)
(cd "$srctree/cmd/WiiUDownloader" && \
GOPATH="$workdir/gopath" \
GOFLAGS="-buildmode=pie -trimpath -mod=readonly -modcacherw" \
go build -v -o "$destdir/wiiudownloader" .)
install -Dm755 "$destdir/wiiudownloader" "$destdir/usr/bin/wiiudownloader"
rm "$destdir/wiiudownloader"
install -Dm644 "$srctree/data/WiiUDownloader.png" \
"$destdir/usr/share/icons/hicolor/256x256/apps/wiiudownloader.png"
mkdir -p "$destdir/usr/share/applications"
cat > "$destdir/usr/share/applications/wiiudownloader.desktop" << 'EOF'
[Desktop Entry]
Type=Application
Name=WiiUDownloader
Comment=Download Wii U titles from Nintendo's official servers
Exec=wiiudownloader
Icon=wiiudownloader
Terminal=false
Categories=Utility;
EOF
tar --zstd --sort=name --owner=0 --group=0 --numeric-owner --mtime='@0' \
-cf "$outfile" -C "$destdir" usr
rm -rf "$workdir" "$destdir"
}
+19
View File
@@ -0,0 +1,19 @@
pkgbase = zapzap-bin
pkgdesc = WhatsApp desktop client written in PyQt6 + PyQt6-WebEngine (prebuilt)
pkgver = 7.0.3
pkgrel = 1
url = https://github.com/rafatosta/zapzap
arch = any
license = GPL-3.0-or-later
depends = python
depends = python-pyqt6
depends = python-pyqt6-webengine
depends = python-dbus
depends = qt6-wayland
optdepends = hunspell: spell check
provides = zapzap
conflicts = zapzap
source = https://github.com/Felitendo/PKGBUILDS/releases/download/zapzap-bin-7.0.3/zapzap-bin-7.0.3.tar.zst
sha256sums = 73e5415a7de9b6e3d7d3f8760c23ad3fec901a48e714d964f54293845804e3c8
pkgname = zapzap-bin
+22
View File
@@ -0,0 +1,22 @@
# Maintainer: Felitendo
# This PKGBUILD is updated automatically:
# https://github.com/Felitendo/PKGBUILDS
pkgname=zapzap-bin
pkgver=7.0.3
pkgrel=1
pkgdesc="WhatsApp desktop client written in PyQt6 + PyQt6-WebEngine (prebuilt)"
arch=('any')
url="https://github.com/rafatosta/zapzap"
license=('GPL-3.0-or-later')
depends=('python' 'python-pyqt6' 'python-pyqt6-webengine' 'python-dbus'
'qt6-wayland')
optdepends=('hunspell: spell check')
provides=('zapzap')
conflicts=('zapzap')
source=("https://github.com/Felitendo/PKGBUILDS/releases/download/${pkgname}-${pkgver}/${pkgname}-${pkgver}.tar.zst")
sha256sums=('73e5415a7de9b6e3d7d3f8760c23ad3fec901a48e714d964f54293845804e3c8')
package() {
cp -a "$srcdir/usr" "$pkgdir/"
}
+65
View File
@@ -0,0 +1,65 @@
# zapzap-bin - prebuilt package of https://github.com/rafatosta/zapzap
# (WhatsApp desktop client written in PyQt6 + PyQt6-WebEngine).
#
# Upstream ships deb/AppImage bundles that vendor all of Qt; instead we build
# the (pure-Python) wheel and install it against the system PyQt6 packages,
# like the AUR source package does.
UPSTREAM_REPO="rafatosta/zapzap"
# Installed in CI (pacman) before build_artifact runs.
BUILD_DEPS=(python python-build python-installer python-setuptools python-wheel)
latest_version() {
gh api "repos/$UPSTREAM_REPO/releases/latest" --jq '.tag_name' | sed 's/^v//'
}
# build_artifact <version> <output-file>
build_artifact() {
local ver="$1" outfile="$2"
local workdir destdir srctree staging sitedir entry
workdir="$(mktemp -d)"
destdir="$(mktemp -d)"
staging="$(mktemp -d)"
curl -sfL "https://github.com/$UPSTREAM_REPO/archive/refs/tags/$ver.tar.gz" | tar -xz -C "$workdir"
srctree="$workdir/zapzap-$ver"
(cd "$srctree" && python -m build --wheel --no-isolation)
python -m installer --destdir="$staging" "$srctree"/dist/*.whl
# The wheel installs into site-packages, whose path changes with every
# Python minor bump and would silently break a prebuilt package. Relocate
# to a fixed dir and use our own launcher instead of the generated console
# script (entry point parsed from pyproject.toml).
sitedir="$(find "$staging/usr/lib" -maxdepth 2 -type d -name site-packages)"
[[ -d "$sitedir/zapzap" ]] || { echo "zapzap module not found in $sitedir" >&2; return 1; }
mkdir -p "$destdir/usr/lib/zapzap"
mv "$sitedir/zapzap" "$sitedir"/zapzap-*.dist-info "$destdir/usr/lib/zapzap/"
entry="$(python -c "import tomllib; print(tomllib.load(open('$srctree/pyproject.toml','rb'))['project']['scripts']['zapzap'])")"
mkdir -p "$destdir/usr/bin"
cat > "$destdir/usr/bin/zapzap" << EOF
#!/usr/bin/python3
import sys
sys.path.insert(0, "/usr/lib/zapzap")
from ${entry%%:*} import ${entry#*:}
sys.exit(${entry#*:}())
EOF
chmod 755 "$destdir/usr/bin/zapzap"
# Icon, desktop file and metainfo are not part of the wheel.
install -Dm644 "$srctree/share/icons/com.rtosta.zapzap.svg" \
"$destdir/usr/share/icons/hicolor/scalable/apps/com.rtosta.zapzap.svg"
install -Dm644 "$srctree/share/applications/com.rtosta.zapzap.desktop" \
"$destdir/usr/share/applications/com.rtosta.zapzap.desktop"
install -Dm644 "$srctree/share/metainfo/com.rtosta.zapzap.appdata.xml" \
"$destdir/usr/share/metainfo/com.rtosta.zapzap.appdata.xml"
tar --zstd --sort=name --owner=0 --group=0 --numeric-owner --mtime='@0' \
-cf "$outfile" -C "$destdir" usr
rm -rf "$workdir" "$destdir" "$staging"
}