diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c465e48..a9f8abc 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -63,3 +63,32 @@ jobs: dist/*.AppImage dist/*.deb dist/*.rpm + + - name: Install Nix + uses: cachix/install-nix-action@v31 + + - name: Update flake.nix hashes + env: + VERSION: ${{ steps.bump.outputs.version }} + run: | + X86_SRI=$(nix-hash --type sha256 --flat --sri dist/linear-linux-${VERSION}-x86_64.AppImage) + ARM_SRI=$(nix-hash --type sha256 --flat --sri dist/linear-linux-${VERSION}-arm64.AppImage) + + sed -i "s|version = \".*\";|version = \"${VERSION}\";|" flake.nix + sed -i "s|hash = \"sha256-.*\"; # x86_64|hash = \"${X86_SRI}\"; # x86_64|" flake.nix + sed -i "s|hash = \"sha256-.*\"; # aarch64|hash = \"${ARM_SRI}\"; # aarch64|" flake.nix + + grep -q "${X86_SRI}" flake.nix || { echo "::error::Failed to update x86_64 hash"; exit 1; } + grep -q "${ARM_SRI}" flake.nix || { echo "::error::Failed to update aarch64 hash"; exit 1; } + + - name: Commit flake.nix update + env: + VERSION: ${{ steps.bump.outputs.version }} + run: | + git add flake.nix + if git diff --cached --quiet; then + echo "No changes to flake.nix" + else + git commit -m "chore: update flake.nix hashes for v${VERSION}" + git push + fi diff --git a/.gitignore b/.gitignore index c6bba59..37d4252 100644 --- a/.gitignore +++ b/.gitignore @@ -128,3 +128,6 @@ dist .yarn/build-state.yml .yarn/install-state.gz .pnp.* + +# Nix build output +result diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..4b75299 --- /dev/null +++ b/flake.lock @@ -0,0 +1,27 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1775036866, + "narHash": "sha256-ZojAnPuCdy657PbTq5V0Y+AHKhZAIwSIT2cb8UgAz/U=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "6201e203d09599479a3b3450ed24fa81537ebc4e", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..21a977f --- /dev/null +++ b/flake.nix @@ -0,0 +1,71 @@ +{ + description = "Unofficial Linux desktop client for Linear (linear.app)"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + }; + + outputs = { self, nixpkgs }: + let + version = "0.2.5"; + + sources = { + x86_64-linux = { + url = "https://github.com/kleo-dev/linear-linux/releases/download/v${version}/linear-linux-${version}-x86_64.AppImage"; + hash = "sha256-NBmfXyrmtBccOLLzBiwbkCyA8IGxtY+AQIgAVxfrank="; # x86_64 + }; + aarch64-linux = { + url = "https://github.com/kleo-dev/linear-linux/releases/download/v${version}/linear-linux-${version}-arm64.AppImage"; + hash = "sha256-nNDo7cq05as0qoEbd1UkOG+s8PzFZxnovcqLsg11RlU="; # aarch64 + }; + }; + + forAllSystems = nixpkgs.lib.genAttrs [ "x86_64-linux" "aarch64-linux" ]; + in + { + packages = forAllSystems (system: + let + pkgs = nixpkgs.legacyPackages.${system}; + src = pkgs.fetchurl { + url = sources.${system}.url; + hash = sources.${system}.hash; + }; + in + { + linear-linux = pkgs.appimageTools.wrapType2 { + pname = "linear-linux"; + inherit version src; + + extraInstallCommands = + let + appimageContents = pkgs.appimageTools.extractType2 { + pname = "linear-linux"; + inherit version src; + }; + in + '' + # Install desktop file + install -Dm644 ${appimageContents}/linear-linux.desktop \ + $out/share/applications/linear-linux.desktop + substituteInPlace $out/share/applications/linear-linux.desktop \ + --replace-warn 'Exec=AppRun' 'Exec=linear-linux' + + # Install icons + install -Dm644 ${appimageContents}/usr/share/icons/hicolor/1024x1024/apps/linear-linux.png \ + $out/share/icons/hicolor/1024x1024/apps/linear-linux.png + ''; + + meta = with pkgs.lib; { + description = "Unofficial Linux desktop client for Linear (linear.app)"; + homepage = "https://github.com/kleo-dev/linear-linux"; + license = licenses.isc; + platforms = [ "x86_64-linux" "aarch64-linux" ]; + mainProgram = "linear-linux"; + }; + }; + + default = self.packages.${system}.linear-linux; + } + ); + }; +}