diff --git a/.github/workflows/nix.yml b/.github/workflows/nix.yml index 447ee2c..7c126de 100644 --- a/.github/workflows/nix.yml +++ b/.github/workflows/nix.yml @@ -24,8 +24,11 @@ jobs: - uses: DeterminateSystems/magic-nix-cache-action@main - - name: Build package - run: nix build .#default --print-build-logs + - name: Build stable package + run: nix build .#emerald-legacy-launcher --print-build-logs + + - name: Build git package + run: nix build .#emerald-legacy-launcher-git --out-link result-git --print-build-logs - name: Flake check run: nix flake check --print-build-logs @@ -33,6 +36,8 @@ jobs: - name: Verify outputs run: | test -x ./result/bin/emerald-legacy-launcher - nix path-info -Sh ./result + test -x ./result-git/bin/emerald-legacy-launcher + nix path-info -Sh ./result ./result-git ls -la ./result/bin/ + ls -la ./result-git/bin/ ls -la ./result/share/applications/ || true diff --git a/.github/workflows/update-nix-stable.yml b/.github/workflows/update-nix-stable.yml new file mode 100644 index 0000000..8755427 --- /dev/null +++ b/.github/workflows/update-nix-stable.yml @@ -0,0 +1,41 @@ +name: Update Nix Flake (Stable) + +on: + release: + types: [published] + +jobs: + update-flake: + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + ref: main + + - uses: DeterminateSystems/nix-installer-action@main + + - name: Prefetch release source and update flake.nix + run: | + TAG="${{ github.event.release.tag_name }}" + VERSION="${TAG#v}" + echo "Processing tag $TAG (version: $VERSION)" + + BASE32_HASH=$(nix-prefetch-url --unpack \ + "https://github.com/LCE-Hub/LCE-Emerald-Launcher/archive/refs/tags/${TAG}.tar.gz") + SRC_HASH=$(nix hash to-sri --type sha256 "$BASE32_HASH") + + echo "stableSrcHash: $SRC_HASH" + python3 scripts/update-nix-stable.py --version "$VERSION" --src-hash "$SRC_HASH" + + - name: Commit and push changes + run: | + git config --global user.name "github-actions[bot]" + git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add flake.nix + git diff --quiet && git diff --staged --quiet || ( + git commit -m "chore: update Nix stable pin to ${{ github.event.release.tag_name }} [skip ci]" && + git push origin main + ) diff --git a/README.md b/README.md index e527245..7a8945b 100644 --- a/README.md +++ b/README.md @@ -137,14 +137,20 @@ paru -S emerald-legacy-launcher-bin # or yay **Nix:** Requires [Nix](https://nixos.org/download/) with flakes enabled (`experimental-features = nix-command flakes` in `nix.conf`). ```bash -# Run without installing +# stable release (default) — tracks https://github.com/LCE-Hub/LCE-Emerald-Launcher/releases nix run github:LCE-Hub/LCE-Emerald-Launcher +# or explicitly: +nix run github:LCE-Hub/LCE-Emerald-Launcher#emerald-legacy-launcher + +# git / latest main +nix run github:LCE-Hub/LCE-Emerald-Launcher#emerald-legacy-launcher-git # Install to your user profile -nix profile install github:LCE-Hub/LCE-Emerald-Launcher +nix profile install github:LCE-Hub/LCE-Emerald-Launcher # stable +nix profile install github:LCE-Hub/LCE-Emerald-Launcher#emerald-legacy-launcher-git # git ``` -On NixOS, add the flake as an input and install `packages..default` (or `emerald-legacy-launcher`) from it. +On NixOS, add the flake as an input and install `packages..default` / `emerald-legacy-launcher` (stable) or `emerald-legacy-launcher-git` (main). **Gentoo:** This repository includes a local Portage overlay under [`gentoo/`](gentoo/). Point `repos.conf` at that directory, then emerge the package (build fetches Cargo/npm deps over the network; Wine/Proton is needed at runtime to launch games): diff --git a/flake.nix b/flake.nix index a371015..2f6304f 100644 --- a/flake.nix +++ b/flake.nix @@ -22,10 +22,25 @@ inherit system; overlays = [ self.overlays.default ]; }; + + # Bump these together when packaging a new upstream stable release. + stableVersion = "1.5.1"; + stableSrcHash = "sha256-XDR6YCWfVeQgIokMfksakw7tqQ+2uWGFqUkLumJU0EA="; in { overlays.default = final: _prev: { emerald-legacy-launcher = final.callPackage ./nix/package.nix { + version = stableVersion; + src = final.fetchFromGitHub { + owner = "LCE-Hub"; + repo = "LCE-Emerald-Launcher"; + rev = "v${stableVersion}"; + hash = stableSrcHash; + }; + }; + + emerald-legacy-launcher-git = final.callPackage ./nix/package.nix { + version = "unstable-${self.shortRev or self.dirtyShortRev or "dirty"}"; src = self; }; }; @@ -38,6 +53,7 @@ { default = pkgs.emerald-legacy-launcher; emerald-legacy-launcher = pkgs.emerald-legacy-launcher; + emerald-legacy-launcher-git = pkgs.emerald-legacy-launcher-git; } ); @@ -46,10 +62,15 @@ type = "app"; program = lib.getExe self.packages.${system}.default; }; + emerald-legacy-launcher-git = { + type = "app"; + program = lib.getExe self.packages.${system}.emerald-legacy-launcher-git; + }; }); checks = forAllSystems (system: { package = self.packages.${system}.default; + package-git = self.packages.${system}.emerald-legacy-launcher-git; }); devShells = forAllSystems ( @@ -59,7 +80,7 @@ in { default = pkgs.mkShell { - inputsFrom = [ pkgs.emerald-legacy-launcher ]; + inputsFrom = [ pkgs.emerald-legacy-launcher-git ]; packages = with pkgs; [ cargo rustc @@ -68,6 +89,9 @@ cargo-tauri nodejs pnpm_10 + unzip + libarchive + python3 pkg-config ]; shellHook = '' diff --git a/nix/package.nix b/nix/package.nix index 1c2db27..f42e79f 100644 --- a/nix/package.nix +++ b/nix/package.nix @@ -15,6 +15,7 @@ libayatana-appindicator, librsvg, udev, + version ? "1.5.1", src ? null, }: @@ -49,7 +50,7 @@ let in rustPlatform.buildRustPackage (finalAttrs: { pname = "emerald-legacy-launcher"; - version = "1.5.1"; + inherit version; src = if src != null then src else defaultSrc; @@ -123,6 +124,9 @@ rustPlatform.buildRustPackage (finalAttrs: { meta = { description = "FOSS cross-platform launcher for Minecraft Legacy Console Edition"; homepage = "https://github.com/LCE-Hub/LCE-Emerald-Launcher"; + changelog = lib.mkIf (!(lib.hasPrefix "unstable-" version)) ( + "https://github.com/LCE-Hub/LCE-Emerald-Launcher/releases/tag/v${version}" + ); license = lib.licenses.gpl3Only; mainProgram = "emerald-legacy-launcher"; platforms = lib.platforms.linux ++ lib.platforms.darwin; diff --git a/scripts/update-nix-stable.py b/scripts/update-nix-stable.py new file mode 100644 index 0000000..c6b10d8 --- /dev/null +++ b/scripts/update-nix-stable.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python3 +import argparse +import re +import sys + + +def update_flake(version: str, src_hash: str) -> None: + path = "flake.nix" + with open(path, "r", encoding="utf-8") as f: + content = f.read() + + new_content, n_version = re.subn( + r'stableVersion = "[^"]*";', + f'stableVersion = "{version}";', + content, + count=1, + ) + new_content, n_hash = re.subn( + r'stableSrcHash = "[^"]*";', + f'stableSrcHash = "{src_hash}";', + new_content, + count=1, + ) + + if n_version != 1 or n_hash != 1: + print( + f"Error: expected to update stableVersion and stableSrcHash once each " + f"(got version={n_version}, hash={n_hash})", + file=sys.stderr, + ) + sys.exit(1) + + with open(path, "w", encoding="utf-8") as f: + f.write(new_content) + + print(f"Updated {path}: stableVersion={version} stableSrcHash={src_hash}") + + +def main() -> None: + parser = argparse.ArgumentParser( + description="Update flake.nix stableVersion and stableSrcHash" + ) + parser.add_argument("--version", required=True, help="Stable version without v prefix") + parser.add_argument("--src-hash", required=True, help="SRI sha256 of the release source") + args = parser.parse_args() + update_flake(args.version, args.src_hash) + + +if __name__ == "__main__": + main()