diff --git a/.github/workflows/client-release.yml b/.github/workflows/client-release.yml index 6dc41a2db..620e64fc3 100644 --- a/.github/workflows/client-release.yml +++ b/.github/workflows/client-release.yml @@ -130,6 +130,7 @@ jobs: APPLE_SIGNING_IDENTITY: ${{ env.CERT_ID }} NO_STRIP: true with: + releaseId: ${{ github.event.release.id || '' }} tagName: ${{ github.event.release.tag_name || inputs.tagName || 'v__VERSION__' }} # the action automatically replaces \_\_VERSION\_\_ with the app version. releaseName: "Auto-release v__VERSION__" releaseBody: "See the assets to download this version and install. This release was created automatically." @@ -137,3 +138,68 @@ jobs: prerelease: true args: ${{ matrix.args }} projectPath: "./desktop" + + publish-aur: + needs: publish-tauri + runs-on: ubuntu-22.04 + permissions: + contents: read + steps: + - uses: actions/checkout@v7 + + - name: Update and publish AUR packages + env: + AUR_SSH_PRIVATE_KEY: ${{ secrets.AUR_SSH_PRIVATE_KEY }} + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + RELEASE_TAG: ${{ github.event.release.tag_name || inputs.tagName }} + run: | + # stop the script on errors and unset variables + set -euo pipefail + + # require the ssh key used to publish to aur + if [[ -z "$AUR_SSH_PRIVATE_KEY" ]]; then + echo "AUR_SSH_PRIVATE_KEY is required to publish the AUR packages." >&2 + exit 1 + fi + + # read the desktop version and choose the release tag + version="$(jq -r '.version' desktop/src-tauri/tauri.conf.json)" + tag="${RELEASE_TAG:-v${version}}" + [[ "$version" =~ ^[0-9]+(\.[0-9]+)*$ ]] + [[ "$tag" =~ ^[A-Za-z0-9._-]+$ ]] + + # download the x86_64 deb package from the github release + deb_name="Drop.Desktop.Client_${version}_amd64.deb" + gh release download "$tag" \ + --repo "$GITHUB_REPOSITORY" \ + --pattern "$deb_name" \ + --dir "$RUNNER_TEMP" + deb_path="$RUNNER_TEMP/$deb_name" + + # configure ssh access to the aur git server + mkdir -p "$HOME/.ssh" + chmod 700 "$HOME/.ssh" + printf '%s\n' "$AUR_SSH_PRIVATE_KEY" > "$HOME/.ssh/aur" + chmod 600 "$HOME/.ssh/aur" + ssh-keyscan -H aur.archlinux.org >> "$HOME/.ssh/known_hosts" + eval "$(ssh-agent -s)" + ssh-add "$HOME/.ssh/aur" + + # fill the release-specific values in both package recipes + node packages/update-aur-packages.mjs "$tag" "$version" "$deb_path" + + # publish each updated recipe to its aur repository + for package in drop-oss-app-bin drop-oss-app; do + package_dir="$RUNNER_TEMP/$package" + git clone "ssh://aur@aur.archlinux.org/$package.git" "$package_dir" + cp "packages/$package/PKGBUILD" "$package_dir/PKGBUILD" + cp "packages/$package/.SRCINFO" "$package_dir/.SRCINFO" + git -C "$package_dir" config user.name "github-actions[bot]" + git -C "$package_dir" config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git -C "$package_dir" add PKGBUILD .SRCINFO + if ! git -C "$package_dir" diff --cached --quiet; then + # create and push a commit only when the recipe changed + git -C "$package_dir" commit -m "Update to $version" + git -C "$package_dir" push origin HEAD:master + fi + done diff --git a/README.md b/README.md index 74af78cf6..e9e9d14cf 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,9 @@ Drop is an open-source game distribution platform, similar to GameVault or Steam. It's designed to distribute and share DRM-free games quickly, all while being incredibly flexible, beautiful, and fast. +> [!NOTE] +> Drop is in maintenance mode. Maintainers will not contribute new large features, but bugs will continue to be fixed and external contributions will continue to be merged. +
Drop Screenshot
diff --git a/desktop/.gitlab-ci.yml b/desktop/.gitlab-ci.yml deleted file mode 100644 index 0fc3abe6f..000000000 --- a/desktop/.gitlab-ci.yml +++ /dev/null @@ -1,31 +0,0 @@ -stages: - - build - -build-linux: - stage: build - image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/rustlang/rust:nightly - script: - - apt-get update -y - - apt-get install yarnpkg libsoup-3.0-0 libsoup-3.0-dev libatk-adaptor libgtk-3-dev libjavascriptcoregtk-4.1-dev libwebkit2gtk-4.1-dev -y - - yarnpkg - - export - - export RUST_LOG=warn - - yarnpkg tauri build - - cp src-tauri/target/release/bundle/deb/*.deb . - - cp src-tauri/target/release/bundle/rpm/*.rpm . - - cp src-tauri/target/release/bundle/appimage/*.AppImage . - artifacts: - paths: - - "*.{deb,rpm,AppImage}" - -build-windows: - stage: build - tags: - - windows - script: - - yarn - - yarn tauri build - - cp src-tauri/target/release/bundle/nsis/*.exe . - artifacts: - paths: - - "*.exe" diff --git a/desktop/src-tauri/process/src/process_handlers.rs b/desktop/src-tauri/process/src/process_handlers.rs index d3f343f25..9704e8b19 100644 --- a/desktop/src-tauri/process/src/process_handlers.rs +++ b/desktop/src-tauri/process/src/process_handlers.rs @@ -303,7 +303,7 @@ impl ProcessHandler for UMUNativeLauncher { .map_or("", |v| v); let game_id = if umu_id_override.is_empty() { - &game_version.version_id + "umu-default" } else { umu_id_override }; @@ -365,7 +365,7 @@ impl ProcessHandler for UMUCompatLauncher { .map_or("", |v| v); let game_id = if umu_id_override.is_empty() { - &game_version.version_id + "umu-default" } else { umu_id_override }; diff --git a/packages/drop-oss-app-bin/.SRCINFO b/packages/drop-oss-app-bin/.SRCINFO new file mode 100644 index 000000000..0d6abe417 --- /dev/null +++ b/packages/drop-oss-app-bin/.SRCINFO @@ -0,0 +1,20 @@ +pkgbase = drop-oss-app-bin + pkgdesc = The client application for the open-source, self-hosted game distribution platform Drop + pkgver = DROP_PKG_VER + pkgrel = DROP_PKG_REL + url = https://droposs.org/ + arch = any + license = LicenseRef-GPL-3.0 + makedepends = libarchive + depends = glib2 + depends = glibc + depends = gcc-libs + depends = webkit2gtk-4.1 + depends = umu-launcher + depends = libappindicator + depends = libayatana-appindicator + conflicts = drop-oss-app + source = https://github.com/Drop-OSS/drop/releases/download/DROP_RELEASE_TAG/Drop.Desktop.Client_DROP_PKG_VER_amd64.deb + sha256sums = DROP_DEB_SHA256 + +pkgname = drop-oss-app-bin diff --git a/packages/drop-oss-app-bin/PKGBUILD b/packages/drop-oss-app-bin/PKGBUILD new file mode 100644 index 000000000..a448a5e8f --- /dev/null +++ b/packages/drop-oss-app-bin/PKGBUILD @@ -0,0 +1,24 @@ +# Maintainer: DecDuck +# Maintainer: quexeky + +pkgname=drop-oss-app-bin +pkgver=DROP_PKG_VER +pkgrel=DROP_PKG_REL +pkgdesc="The client application for the open-source, self-hosted game distribution platform Drop" +arch=(any) +conflicts=('drop-oss-app') +url="https://droposs.org/" +license=('LicenseRef-GPL-3.0') +depends=('glib2' 'glibc' 'gcc-libs' 'webkit2gtk-4.1' 'umu-launcher' 'libappindicator' 'libayatana-appindicator') +makedepends=('libarchive') +source=("https://github.com/Drop-OSS/drop/releases/download/DROP_RELEASE_TAG/Drop.Desktop.Client_DROP_PKG_VER_amd64.deb") +sha256sums=('DROP_DEB_SHA256') + +prepare() { + bsdtar -xf ./*.deb + bsdtar -xf data.tar.* +} + +package() { + cp -r "$srcdir/usr" "$pkgdir" +} diff --git a/packages/drop-oss-app/.SRCINFO b/packages/drop-oss-app/.SRCINFO new file mode 100644 index 000000000..41eee28c1 --- /dev/null +++ b/packages/drop-oss-app/.SRCINFO @@ -0,0 +1,22 @@ +pkgbase = drop-oss-app + pkgdesc = Desktop client for the Drop OSS project. + pkgver = DROP_PKG_VER + pkgrel = DROP_PKG_REL + url = https://droposs.org/ + arch = any + license = AGPL-3.0-only + makedepends = pnpm + makedepends = cargo-nightly + makedepends = gcc + makedepends = pkgconf + depends = glib2 + depends = glibc + depends = gcc-libs + depends = webkit2gtk-4.1 + depends = umu-launcher + depends = libappindicator + depends = libayatana-appindicator + source = git+https://github.com/Drop-OSS/drop.git#tag=DROP_RELEASE_TAG + sha256sums = SKIP + +pkgname = drop-oss-app diff --git a/packages/drop-oss-app/PKGBUILD b/packages/drop-oss-app/PKGBUILD new file mode 100644 index 000000000..a935184a1 --- /dev/null +++ b/packages/drop-oss-app/PKGBUILD @@ -0,0 +1,48 @@ +# Maintainer: quexeky +# Maintainer: DecDuck + +pkgname=drop-oss-app +pkgver=DROP_PKG_VER +pkgrel=DROP_PKG_REL +pkgdesc="Desktop client for the Drop OSS project." +arch=(any) +url="https://droposs.org/" +license=('AGPL-3.0-only') +depends=('glib2' 'glibc' 'gcc-libs' 'webkit2gtk-4.1' 'umu-launcher' 'libappindicator' 'libayatana-appindicator') +makedepends=('pnpm' 'cargo-nightly' 'gcc' 'pkgconf') +source=("git+https://github.com/Drop-OSS/drop.git#tag=DROP_RELEASE_TAG") +sha256sums=('SKIP') + +_desktop=" +[Desktop Entry]\n +Type=Application\n +Version=DROP_PKG_VER\n +Name=Drop Desktop App\n +Comment=Drop client for Linux\n +Path=/usr/bin/\n +Exec=drop-app\n +Icon=drop-oss-app\n +Terminal=false\n +" + +prepare() { + echo "$_desktop" > drop-oss-app.desktop +} + +build() { + cd drop + pnpm install + cd desktop + export RUSTUP_TOOLCHAIN=nightly + CFLAGS+=' -ffat-lto-objects' + pnpm tauri build --no-bundle +} + +package() { + echo -e "$_desktop" > drop-oss-app.desktop + install -Dm0755 -t "$pkgdir/usr/share/applications" "drop-oss-app.desktop" + cd drop/desktop + cp src-tauri/icons/icon.png ./drop-oss-app.png + install -Dm0755 -t "$pkgdir/usr/share/pixmaps" "./drop-oss-app.png" + install -Dm0755 -t "$pkgdir/usr/bin" "src-tauri/target/release/drop-app" +} diff --git a/packages/update-aur-packages.mjs b/packages/update-aur-packages.mjs new file mode 100644 index 000000000..58e1d316d --- /dev/null +++ b/packages/update-aur-packages.mjs @@ -0,0 +1,52 @@ +import { createHash } from "node:crypto"; +import { readFile, writeFile } from "node:fs/promises"; +import { dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; + +function replaceToken(text, token, value, expectedCount) { + const actualCount = text.split(token).length - 1; + if (actualCount !== expectedCount) { + throw new Error(`Expected ${expectedCount} ${token} tokens, found ${actualCount}`); + } + return text.replaceAll(token, value); +} + +async function updateFile(path, transform) { + const original = await readFile(path, "utf8"); + await writeFile(path, transform(original)); +} + +const [tag, version, debPath, ...extraArgs] = process.argv.slice(2); +if (!tag || !version || !debPath || extraArgs.length > 0) { + throw new Error("usage: update-aur-packages.mjs TAG VERSION DEB_PATH"); +} +if (!/^[A-Za-z0-9._-]+$/.test(tag)) { + throw new Error("Release tag contains unsupported characters"); +} +if (!/^[0-9]+(?:\.[0-9]+)*$/.test(version)) { + throw new Error("Package version must contain numeric dot-separated components"); +} + +const packagesDir = dirname(fileURLToPath(import.meta.url)); +const checksum = createHash("sha256").update(await readFile(debPath)).digest("hex"); +const tokens = [ + ["DROP_PKG_VER", version], + ["DROP_PKG_REL", "1"], + ["DROP_RELEASE_TAG", tag], + ["DROP_DEB_SHA256", checksum], +]; +const files = [ + { packageName: "drop-oss-app", fileName: "PKGBUILD", tokenCounts: [2, 1, 1, 0] }, + { packageName: "drop-oss-app", fileName: ".SRCINFO", tokenCounts: [1, 1, 1, 0] }, + { packageName: "drop-oss-app-bin", fileName: "PKGBUILD", tokenCounts: [2, 1, 1, 1] }, + { packageName: "drop-oss-app-bin", fileName: ".SRCINFO", tokenCounts: [2, 1, 1, 1] }, +]; + +for (const { packageName, fileName, tokenCounts } of files) { + await updateFile(join(packagesDir, packageName, fileName), (text) => + tokens.reduce( + (updated, [token, value], index) => replaceToken(updated, token, value, tokenCounts[index]), + text, + ), + ); +} \ No newline at end of file diff --git a/server/.env.example b/server/.env.example index dbd70e578..5567a5666 100644 --- a/server/.env.example +++ b/server/.env.example @@ -6,6 +6,10 @@ GIANT_BOMB_API_KEY="" IGDB_CLIENT_ID="" IGDB_CLIENT_SECRET="" +# PCGamingWiki bot account credentials (create a bot password in MediaWiki) +PCGAMINGWIKI_BOT_USERNAME="" +PCGAMINGWIKI_BOT_PASSWORD="" + EXTERNAL_URL="http://localhost:3000" NUXT_PORT=4000 diff --git a/server/package.json b/server/package.json index 41a195ee2..f4f1ec453 100644 --- a/server/package.json +++ b/server/package.json @@ -5,7 +5,7 @@ "type": "module", "license": "AGPL-3.0-or-later", "engines": { - "node": ">=22.16.0" + "node": ">=24.0.0" }, "scripts": { "build": "nuxt build", diff --git a/server/pages/admin/library/index.vue b/server/pages/admin/library/index.vue index 2f0f542b8..d36476744 100644 --- a/server/pages/admin/library/index.vue +++ b/server/pages/admin/library/index.vue @@ -496,19 +496,28 @@