5 Commits
Author SHA1 Message Date
Uyanide dd09e85b9e 🐛 fix: update version in CMakeLists.txt
Release / Build and Release (push) Successful in 43s
2026-08-22 03:00:46 +02:00
Uyanide 7ea701de5c 🚀 CD: add release.yml
Release / Build and Release (push) Failing after 26s
2026-08-22 02:55:49 +02:00
Uyanide 64b62246d7 🚀 CD: remove workflow 2026-08-21 18:04:41 +02:00
Uyanide a9f7d9c770 🔧 chore: update email in LICENSE 2026-08-21 17:43:19 +02:00
Uyanide 5d85acecf4 🐛 fix: pick QML controls style explicitly 2026-08-21 17:43:02 +02:00
4 changed files with 96 additions and 154 deletions
+57 -143
View File
@@ -3,160 +3,74 @@ name: Release
on:
push:
tags:
- 'v*'
- 'v*.*.*'
jobs:
build-arch:
name: Build ArchLinux Package
runs-on: ubuntu-latest
release:
name: Build and Release
runs-on: ubuntu-24.04
steps:
- name: Checkout Code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Extract Version
run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV
- name: Generate PKGBUILD
- name: Verify Tag Matches Project Version
run: |
TAR_URL="https://git.uyani.de/Uyanide/WallReel/archive/v${{ env.VERSION }}.tar.gz"
TAG_VERSION="${GITHUB_REF_NAME#v}"
CMAKE_VERSION=$(sed -n 's/^project(WallReel VERSION \([0-9.]\+\).*/\1/p' CMakeLists.txt)
if [ "$TAG_VERSION" != "$CMAKE_VERSION" ]; then
echo "::error::Tag v${TAG_VERSION} does not match project(WallReel VERSION ${CMAKE_VERSION})"
exit 1
fi
echo "VERSION=${TAG_VERSION}" >> "$GITHUB_ENV"
wget -qO source.tar.gz "$TAR_URL"
SHA256=$(sha256sum source.tar.gz | awk '{print $1}')
- name: Install Build Dependencies
run: |
apt-get update
apt-get install -y --no-install-recommends \
cmake g++ jq qt6-base-dev qt6-declarative-dev
cat << 'EOF' > PKGBUILD
# Maintainer: Uyanide <me@uyani.de>
pkgname=wallreel
pkgver=${{ env.VERSION }}
pkgrel=1
pkgdesc="Choose and set desktop wallpapers with customizable themes and actions"
arch=('x86_64')
url="https://git.uyani.de/Uyanide/WallReel"
license=('MIT')
depends=('qt6-base' 'qt6-declarative' 'gcc-libs' 'glibc')
makedepends=('cmake')
options=('!debug')
source=("${pkgname}-${pkgver}.tar.gz::https://git.uyani.de/Uyanide/WallReel/archive/v${pkgver}.tar.gz")
sha256sums=('INSERT_SHA256_HERE')
- name: Configure
run: |
cmake -S . -B build \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr \
-Wno-dev
build() {
cd "wallreel"
cmake -B build -S . \
-DCMAKE_BUILD_TYPE='Release' \
-DCMAKE_INSTALL_PREFIX='/usr' \
-Wno-dev
cmake --build build
- name: Build
run: cmake --build build --parallel "$(nproc)"
- name: Publish Release
env:
TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
set -euo pipefail
API="${GITHUB_SERVER_URL}/api/v1/repos/${GITHUB_REPOSITORY}"
AUTH="Authorization: token ${TOKEN}"
NOTES=$(git tag -l --format='%(contents)' "$GITHUB_REF_NAME")
payload() {
jq -n --arg tag "$GITHUB_REF_NAME" \
--arg name "WallReel ${VERSION}" \
--arg body "$NOTES" \
"$1"
}
package() {
cd "wallreel"
DESTDIR="$pkgdir" cmake --install build
install -Dm644 LICENSE "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
}
EOF
code=$(curl -sS -o /tmp/resp.json -w '%{http_code}' -X POST "$API/releases" \
-H "$AUTH" -H 'Content-Type: application/json' \
--data-binary "$(payload '{tag_name:$tag, name:$name, body:$body, draft:false, prerelease:false}')")
sed -i "s/INSERT_SHA256_HERE/$SHA256/" PKGBUILD
if [ "$code" = "409" ]; then
echo "Release for ${GITHUB_REF_NAME} already exists, updating in place."
id=$(curl -sS -H "$AUTH" "$API/releases/tags/${GITHUB_REF_NAME}" | jq -r '.id')
code=$(curl -sS -o /tmp/resp.json -w '%{http_code}' -X PATCH "$API/releases/${id}" \
-H "$AUTH" -H 'Content-Type: application/json' \
--data-binary "$(payload '{name:$name, body:$body, draft:false, prerelease:false}')")
fi
- name: Build and Generate AUR Meta
run: |
tar -cf - . | docker run --rm -i archlinux:latest /bin/bash -e -c "
mkdir -p /workspace && cd /workspace
tar -xf -
exec 3>&1 1>&2
pacman-key --init && pacman-key --populate
pacman -Sy --noconfirm archlinux-keyring
pacman -Su --noconfirm base-devel cmake qt6-base qt6-declarative sudo
echo 'MAKEFLAGS="-j$(nproc)"' >> /etc/makepkg.conf
useradd -m builduser
chown -R builduser:builduser /workspace
echo 'builduser ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers
su - builduser -c 'cd /workspace && makepkg -sf --noconfirm'
su - builduser -c 'cd /workspace && makepkg --printsrcinfo' > SRCINFO.txt
tar -cf - *.pkg.tar.zst PKGBUILD SRCINFO.txt >&3
" | tar -xf -
- name: Upload Arch Artifacts
uses: actions/upload-artifact@v3
with:
name: arch-artifacts
path: |
*.pkg.tar.zst
PKGBUILD
SRCINFO.txt
publish-gitea:
name: Publish to Gitea Release
needs: [build-arch]
runs-on: ubuntu-latest
steps:
- name: Extract Version
run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV
- name: Download Arch Artifacts
uses: actions/download-artifact@v3
with:
name: arch-artifacts
path: .
- name: Publish to Gitea Release
uses: softprops/action-gh-release@v1
with:
name: WallReel ${{ env.VERSION }}
draft: false
prerelease: false
files: "*.pkg.tar.zst"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
publish-aur:
name: Publish to AUR
needs: [build-arch]
runs-on: ubuntu-latest
steps:
- name: Extract Version
run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV
- name: Download Arch Artifacts
uses: actions/download-artifact@v3
with:
name: arch-artifacts
path: .
- name: Publish to AUR
env:
AUR_KEY: ${{ secrets.AUR_SSH_PRIVATE_KEY }}
run: |
mkdir -p ~/.ssh
echo "$AUR_KEY" > ~/.ssh/aur
chmod 600 ~/.ssh/aur
ssh-keyscan aur.archlinux.org >> ~/.ssh/known_hosts
cat <<EOF > ~/.ssh/config
Host aur.archlinux.org
IdentityFile ~/.ssh/aur
User aur
EOF
git config --global user.name "Uyanide"
git config --global user.email "me@uyani.de"
git clone ssh://aur@aur.archlinux.org/wallreel.git aur-repo
cp PKGBUILD aur-repo/
cp SRCINFO.txt aur-repo/.SRCINFO
cd aur-repo
cat << 'EOF' > LICENSE
Copyright (C) 2026 by Uyanide me@uyani.de
Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
EOF
git add PKGBUILD LICENSE .SRCINFO
git commit -m "Release v${{ env.VERSION }}"
git push origin master
case "$code" in
2*) echo "Release published (HTTP ${code})." ;;
*) echo "::error::Gitea API returned HTTP ${code}"; cat /tmp/resp.json; exit 1 ;;
esac
+1 -1
View File
@@ -1,6 +1,6 @@
cmake_minimum_required(VERSION 3.16)
project(WallReel VERSION 2.2.0 LANGUAGES CXX)
project(WallReel VERSION 2.2.2 LANGUAGES CXX)
set(EXECUTABLE_NAME "wallreel")
set(CORELIB_NAME "wallreel-core")
+1 -1
View File
@@ -1,4 +1,4 @@
Copyright 2026 Uyanide me@uyani.de
Copyright 2026 Uyanide pywang0608@foxmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+37 -9
View File
@@ -1,8 +1,8 @@
#include <qobject.h>
#include <QApplication>
#include <QFileInfo>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QQuickStyle>
#include <QSocketNotifier>
extern "C" {
@@ -21,6 +21,26 @@ using namespace WallReel::Core;
WALLREEL_DECLARE_SENDER("Main")
static QString pickControlsStyle(const QQmlApplicationEngine& engine) {
// Respect env
if (!qEnvironmentVariableIsEmpty("QT_QUICK_CONTROLS_STYLE"))
return {};
#if QT_VERSION >= QT_VERSION_CHECK(6, 4, 0)
using namespace Qt::StringLiterals;
// Prefer KDE style if available,
for (const QString& p : engine.importPathList())
if (QFileInfo::exists(p + u"/org/kde/desktop/qmldir"_s))
return u"org.kde.desktop"_s;
// fallback to Fusion
return u"Fusion"_s;
#else
for (const QString& p : engine.importPathList())
if (QFileInfo::exists(p + u"/org/kde/desktop/qmldir"_qs))
return u"org.kde.desktop"_qs;
return u"Fusion"_qs;
#endif
}
int main(int argc, char* argv[]) {
// Destruction order after QApplication quits its event loop:
// 1. QQmlApplicationEngine (with all QML objects)
@@ -46,12 +66,14 @@ int main(int argc, char* argv[]) {
QApplication a(argc, argv);
a.setApplicationName(APP_NAME);
a.setApplicationVersion(APP_VERSION);
{
#if QT_VERSION >= QT_VERSION_CHECK(6, 4, 0)
using namespace Qt::StringLiterals;
a.setWindowIcon(QIcon(u":/icon.svg"_s));
using namespace Qt::StringLiterals;
a.setWindowIcon(QIcon(u":/icon.svg"_s));
#else
a.setWindowIcon(QIcon(u":/%1.svg"_qs.arg(APP_NAME)));
a.setWindowIcon(QIcon(u":/icon.svg"_qs));
#endif
}
{
Logger::init();
@@ -105,6 +127,10 @@ int main(int argc, char* argv[]) {
{
QQmlApplicationEngine engine;
if (const QString s = pickControlsStyle(engine); !s.isEmpty()) {
QQuickStyle::setStyle(s);
}
QObject::connect(
&engine,
&QQmlApplicationEngine::objectCreationFailed,
@@ -112,13 +138,15 @@ int main(int argc, char* argv[]) {
[]() { QCoreApplication::exit(-1); },
Qt::QueuedConnection);
{
#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
using namespace Qt::StringLiterals;
engine.loadFromModule(UIMODULE_URI, u"Main"_s);
using namespace Qt::StringLiterals;
engine.loadFromModule(UIMODULE_URI, u"Main"_s);
#else
engine.addImportPath(u"qrc:/"_qs);
engine.load(QUrl(u"qrc:/WallReel/UI/Main.qml"_qs));
engine.addImportPath(u"qrc:/"_qs);
engine.load(QUrl(u"qrc:/WallReel/UI/Main.qml"_qs));
#endif
}
bootstrap.start();