Compare commits

..
28 changed files with 1114 additions and 2 deletions

No files matched your search

+7
View File
@@ -12,6 +12,13 @@ on:
- '*/*' - '*/*'
- '.github/workflows/update.yml' - '.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: permissions:
contents: write contents: write
+11 -2
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>`), release of **this** repository (tag `<pkgname>-<version>`),
3. updates the `PKGBUILD` (pkgver/pkgrel/sha256sums), test-builds it with 3. updates the `PKGBUILD` (pkgver/pkgrel/sha256sums), test-builds it with
`makepkg` and regenerates `.SRCINFO`, `makepkg` and regenerates `.SRCINFO`,
4. commits the changes back to this repository, and 4. commits the changes back to this repository,
5. pushes `PKGBUILD` + `.SRCINFO` to the AUR. 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 The AUR packages themselves only download the prebuilt asset from step 2, so
users don't need any build dependencies. users don't need any build dependencies.
@@ -23,6 +24,14 @@ users don't need any build dependencies.
|---|---|---| |---|---|---|
| `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) | | `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) | | `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) |
## Setup (one-time) ## Setup (one-time)
+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()
+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"
}
+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"
}
+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"
}
+19
View File
@@ -170,3 +170,22 @@ else
git push origin HEAD:master git push origin HEAD:master
echo "$pkg: pushed $ver-$rel to the AUR" echo "$pkg: pushed $ver-$rel to the AUR"
fi 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"
}
+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"
}
+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"
}