From f74ca52f4faf18161a69652c3b149cf5d7143727 Mon Sep 17 00:00:00 2001 From: Alois Date: Sun, 30 Aug 2026 15:58:34 +0200 Subject: [PATCH 1/2] feat(nix-flake): rework nix package --- .forgejo/workflows/deploy-prod.yml | 55 --------- flake.nix | 181 +++++++++++++++++++---------- 2 files changed, 118 insertions(+), 118 deletions(-) diff --git a/.forgejo/workflows/deploy-prod.yml b/.forgejo/workflows/deploy-prod.yml index dd7a5f9..621a0cd 100644 --- a/.forgejo/workflows/deploy-prod.yml +++ b/.forgejo/workflows/deploy-prod.yml @@ -311,58 +311,3 @@ jobs: "$API/repos/$REPO/releases/$release_id" done < "$DELETE_RELEASES" EOF - - - name: Update root flake release hash - env: - TAG: ${{ steps.version.outputs.tag }} - run: | - nix develop .#electron --command bash <<'EOF' - set -eu - - DEB="$(find releases -maxdepth 1 -type f -name 'Tensamin-*-linux-amd64.deb' -print -quit)" - test -n "$DEB" - - HASH="$(node -e 'const fs = require("fs"); const crypto = require("crypto"); const file = process.argv[1]; console.log("sha256-" + crypto.createHash("sha256").update(fs.readFileSync(file)).digest("base64"));' "$DEB")" - export HASH - - node -e ' - const fs = require("fs"); - const version = process.env.TAG; - const hash = process.env.HASH; - let content = fs.readFileSync("flake.nix", "utf8"); - content = content.replace(/version = "[^"]+";/, `version = "${version}";`); - content = content.replace(/x86_64DebHash = "sha256-[^"]+";/, `x86_64DebHash = "${hash}";`); - fs.writeFileSync("flake.nix", content); - ' - - if git diff --quiet -- flake.nix; then - echo "flake.nix already has the current release hash on main." - else - git add flake.nix - git -c user.name="forgejo-actions" -c user.email="forgejo-actions@localhost" commit -m "(qol): update release flake hash" - git push - fi - - git fetch origin dev - git worktree add ../dev-flake-update origin/dev - cd ../dev-flake-update - - node -e ' - const fs = require("fs"); - const version = process.env.TAG; - const hash = process.env.HASH; - let content = fs.readFileSync("flake.nix", "utf8"); - content = content.replace(/version = "[^"]+";/, `version = "${version}";`); - content = content.replace(/x86_64DebHash = "sha256-[^"]+";/, `x86_64DebHash = "${hash}";`); - fs.writeFileSync("flake.nix", content); - ' - - if git diff --quiet -- flake.nix; then - echo "flake.nix already has the current release hash on dev." - exit 0 - fi - - git add flake.nix - git -c user.name="forgejo-actions" -c user.email="forgejo-actions@localhost" commit -m "(qol): update release flake hash" - git push origin HEAD:dev - EOF diff --git a/flake.nix b/flake.nix index e02a001..0b0d63c 100644 --- a/flake.nix +++ b/flake.nix @@ -17,8 +17,6 @@ systems = [ "x86_64-linux" ]; forAllSystems = nixpkgs.lib.genAttrs systems; version = "0.0.11"; - x86_64DebHash = "sha256-iMEgdjY8Ghlx6K/YzKC5JAZbeHNJDIFHm8MKmM4efaI="; - forgejoBaseUrl = "https://git.methanium.net/tensamin/client/releases/download/${version}"; in { packages = forAllSystems ( @@ -32,8 +30,6 @@ android_sdk.accept_license = true; }; }; - debArtifact = "Tensamin-${version}-linux-amd64.deb"; - electronRuntimeLibs = with pkgs; [ alsa-lib at-spi2-atk @@ -75,71 +71,130 @@ libXtst libxcb ]; - packageDeb = - src: - pkgs.stdenv.mkDerivation { - pname = "tensamin"; - inherit version src; - - nativeBuildInputs = with pkgs; [ - autoPatchelfHook - dpkg - makeWrapper - ]; - buildInputs = electronRuntimeLibs; - - dontConfigure = true; - dontBuild = true; - - unpackPhase = '' - runHook preUnpack - dpkg-deb -x "$src" . - runHook postUnpack - ''; - - installPhase = '' - runHook preInstall - - mkdir -p "$out" - cp -r opt "$out/" - cp -r usr/* "$out/" - - mkdir -p "$out/bin" - makeWrapper "$out/opt/Tensamin/tensamin" "$out/bin/tensamin" \ - --prefix LD_LIBRARY_PATH : "${pkgs.lib.makeLibraryPath electronRuntimeLibs}" - - substituteInPlace "$out/share/applications/Tensamin.desktop" \ - --replace-fail "Exec=/opt/Tensamin/tensamin" "Exec=tensamin" - - runHook postInstall - ''; + electron = pkgs.electron; + pnpm = pkgs.pnpm; + mtpTypeMaps = pkgs.fetchgit { + url = "https://git.methanium.net/tensamin/mtp-type-maps"; + rev = "6e5122fe44f793c0e0d3229b3d34145ce17c2d31"; + hash = "sha256-/4n8F0YLJaLncefKL907P5l+en1CTjpgdFmLBF3gbiQ="; + }; + mtpSource = pkgs.fetchzip { + url = "https://git.methanium.net/methanium/mtp/releases/download/0.3.0-dev-c7c7afe/mtp-0.3.0.tgz"; + hash = "sha256-XLTa8DxP93Q4hBHRCLUzCPOqkbdb4V3aZxE5Iuq+kW0="; + }; + mtpCargoDeps = pkgs.rustPlatform.fetchCargoVendor { + src = mtpSource; + hash = "sha256-8MZ65N/EtWPAggal0JkGDx3WSn+LxWQORinkqVbsrys="; + }; + wasmBindgenCliSource = pkgs.fetchCrate { + pname = "wasm-bindgen-cli"; + version = "0.2.127"; + hash = "sha256-di+qBAdd7pENLiIB9CoZoab+W5xeDoByMREcCGTSzWo="; + }; + wasmBindgenCli = pkgs.buildWasmBindgenCli { + src = wasmBindgenCliSource; + cargoDeps = pkgs.rustPlatform.fetchCargoVendor { + src = wasmBindgenCliSource; + hash = "sha256-FTv2GZIAQs0ePdIZXIXil7JbZ6kIT05VG6vqC1qNFxQ="; }; - defaultPackage = packageDeb ( - pkgs.fetchurl { - url = "${forgejoBaseUrl}/${debArtifact}"; - hash = x86_64DebHash; - } - ); - localDebPath = builtins.getEnv "TENSAMIN_DEB"; - localPathPackage = - if localDebPath == "" then - pkgs.writeShellScriptBin "tensamin" '' - echo "Set TENSAMIN_DEB to a local .deb path and run with --impure." >&2 - exit 1 - '' - else - packageDeb ( - builtins.path { - path = localDebPath; - name = debArtifact; - } - ); + }; + desktopItem = pkgs.makeDesktopItem { + name = "tensamin"; + desktopName = "Tensamin"; + exec = "tensamin"; + icon = "tensamin"; + startupWMClass = "Tensamin"; + categories = [ "Network" ]; + }; + defaultPackage = pkgs.stdenv.mkDerivation (finalAttrs: { + pname = "tensamin"; + inherit version; + src = self; + + pnpmDeps = pkgs.fetchPnpmDeps { + inherit (finalAttrs) pname version src; + inherit pnpm; + fetcherVersion = 4; + hash = "sha256-imP3MTr1YLc28Z9n617m0Wt/6vPirFznzoriKzojlEg="; + }; + + nativeBuildInputs = with pkgs; [ + copyDesktopItems + makeWrapper + nodejs_22 + pnpm + pnpmConfigHook + cargo + lld + rustc + wasm-pack + wasmBindgenCli + binaryen + ]; + + env.ELECTRON_SKIP_BINARY_DOWNLOAD = 1; + + postPatch = '' + rm -rf mtp-type-maps + ln -s ${mtpTypeMaps} mtp-type-maps + + node -e ' + const fs = require("fs"); + const path = "apps/electron/package.json"; + const pkg = JSON.parse(fs.readFileSync(path, "utf8")); + pkg.version = "${version}"; + fs.writeFileSync(path, JSON.stringify(pkg, null, 2) + "\n"); + ' + ''; + + buildPhase = '' + runHook preBuild + + mkdir -p "$HOME/.cargo" + substitute ${mtpCargoDeps}/.cargo/config.toml "$HOME/.cargo/config.toml" \ + --replace-fail @vendor@ ${mtpCargoDeps} + + pnpm run copy-licenses + pnpm run build:packages + pnpm run build:web + pnpm --dir apps/tauri run gen-icons + pnpm --dir apps/electron run build + pnpm --dir apps/electron exec electron-builder --dir --linux --publish never \ + --config.electronDist=${electron.dist} \ + --config.electronVersion=${electron.version} + + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + + mkdir -p "$out/lib/tensamin" "$out/bin" + cp -r apps/electron/release/linux-unpacked/. "$out/lib/tensamin/" + + makeWrapper "$out/lib/tensamin/tensamin" "$out/bin/tensamin" \ + --prefix LD_LIBRARY_PATH : "${pkgs.lib.makeLibraryPath electronRuntimeLibs}" + + install -Dm644 apps/electron/build/icons/icon.png \ + "$out/share/icons/hicolor/512x512/apps/tensamin.png" + + runHook postInstall + ''; + + desktopItems = [ desktopItem ]; + + meta = { + description = "Tensamin desktop client"; + homepage = "https://git.methanium.net/tensamin/client"; + mainProgram = "tensamin"; + platforms = pkgs.lib.platforms.linux; + }; + }); in { default = defaultPackage; tensamin = defaultPackage; electron = defaultPackage; - localPathForDev = localPathPackage; } ); From 5a480add6381198695cf97106daca6b4959b18f1 Mon Sep 17 00:00:00 2001 From: Rasensprenger Date: Sun, 30 Aug 2026 17:00:54 +0300 Subject: [PATCH 2/2] chore(deps): update tauri-build digest to dd6befd --- apps/tauri/src-tauri/Cargo.lock | 182 +++++++++++++++++++++++++++++--- apps/tauri/src-tauri/Cargo.toml | 2 +- 2 files changed, 169 insertions(+), 15 deletions(-) diff --git a/apps/tauri/src-tauri/Cargo.lock b/apps/tauri/src-tauri/Cargo.lock index d404d61..c1398bb 100644 --- a/apps/tauri/src-tauri/Cargo.lock +++ b/apps/tauri/src-tauri/Cargo.lock @@ -560,6 +560,17 @@ dependencies = [ "uuid", ] +[[package]] +name = "cfb" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a347dcabdae9c31b0825fd6a8bed285ec9c2acb89c47827126d52fa4f59cece3" +dependencies = [ + "fnv", + "uuid", + "web-time", +] + [[package]] name = "cfg-expr" version = "0.15.8" @@ -826,7 +837,20 @@ version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dae61cf9c0abb83bd659dab65b7e4e38d8236824c85f0f804f173567bda257d2" dependencies = [ - "cssparser-macros", + "cssparser-macros 0.6.1", + "dtoa-short", + "itoa", + "phf", + "smallvec", +] + +[[package]] +name = "cssparser" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c9cdaae01d5ed7882b04d795e7f752f46ff52d2fa3b50a20d28c464510bba98" +dependencies = [ + "cssparser-macros 0.7.0", "dtoa-short", "itoa", "phf", @@ -843,6 +867,16 @@ dependencies = [ "syn 2.0.119", ] +[[package]] +name = "cssparser-macros" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a2a99df6e410a8ff4245aa2006499ea662245f967cc7c0a38c83ef8eb44dbf" +dependencies = [ + "quote", + "syn 2.0.119", +] + [[package]] name = "ctor" version = "0.8.0" @@ -1127,11 +1161,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "521e380c0c8afb8d9a1e83a1822ee03556fc3e3e7dbc1fd30be14e37f9cb3f89" dependencies = [ "bit-set", - "cssparser", + "cssparser 0.36.0", "foldhash", - "html5ever", + "html5ever 0.38.0", "precomputed-hash", - "selectors", + "selectors 0.36.1", + "tendril", +] + +[[package]] +name = "dom_query" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fac5fca71e65e94cc718a6e2af65d6e0f9c6027751c2aa562fbb5087fda639bc" +dependencies = [ + "bit-set", + "cssparser 0.37.0", + "foldhash", + "html5ever 0.39.0", + "precomputed-hash", + "selectors 0.38.0", "tendril", ] @@ -1982,7 +2031,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1054432bae2f14e0061e33d23402fbaa67a921d319d56adc6bcf887ddad1cbc2" dependencies = [ "log", - "markup5ever", + "markup5ever 0.38.0", +] + +[[package]] +name = "html5ever" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a1761807faccc9a19e86944bbf40610014066306f96edcdedc2fb714bcb7b8" +dependencies = [ + "log", + "markup5ever 0.39.0", ] [[package]] @@ -2278,7 +2337,16 @@ version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7" dependencies = [ - "cfb", + "cfb 0.7.3", +] + +[[package]] +name = "infer" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4200d433cbd5178df7797c9c2e75b348b728e39631cf14520d1e2fc424201f4" +dependencies = [ + "cfb 0.14.0", ] [[package]] @@ -2641,6 +2709,17 @@ dependencies = [ "web_atoms", ] +[[package]] +name = "markup5ever" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7122d987ec5f704ee56f6e5b41a7d93722e9aae27ae07cafa4036c4d3f9757de" +dependencies = [ + "log", + "tendril", + "web_atoms", +] + [[package]] name = "memchr" version = "2.8.3" @@ -4200,7 +4279,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5d9c0c92a92d33f08817311cf3f2c29a3538a8240e94a6a3c622ce652d7e00c" dependencies = [ "bitflags 2.13.1", - "cssparser", + "cssparser 0.36.0", + "derive_more", + "log", + "new_debug_unreachable", + "phf", + "phf_codegen", + "precomputed-hash", + "rustc-hash", + "servo_arc", + "smallvec", +] + +[[package]] +name = "selectors" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8adfa1c298912827b8a28b223b3b874357397ae706e6190acd9bf28cee99114d" +dependencies = [ + "bitflags 2.13.1", + "cssparser 0.37.0", "derive_more", "log", "new_debug_unreachable", @@ -4798,7 +4896,7 @@ dependencies = [ "serde_repr", "serialize-to-javascript", "swift-rs", - "tauri-build", + "tauri-build 2.6.3 (git+https://github.com/tauri-apps/tauri?rev=4af26a3f7f8b692d62cca549bbacd93f5ce90b41)", "tauri-macros", "tauri-runtime", "tauri-runtime-wry", @@ -4833,6 +4931,26 @@ dependencies = [ "walkdir", ] +[[package]] +name = "tauri-build" +version = "2.6.3" +source = "git+https://github.com/tauri-apps/tauri?rev=dd6befda925845fc74ca595d6d42de6c49580dd8#dd6befda925845fc74ca595d6d42de6c49580dd8" +dependencies = [ + "anyhow", + "cargo_toml", + "dirs", + "glob", + "heck 0.5.0", + "json-patch 4.2.0", + "schemars 0.8.22", + "semver", + "serde", + "serde_json", + "tauri-utils 2.9.3 (git+https://github.com/tauri-apps/tauri?rev=dd6befda925845fc74ca595d6d42de6c49580dd8)", + "tauri-winres", + "walkdir", +] + [[package]] name = "tauri-codegen" version = "2.6.3" @@ -5027,11 +5145,11 @@ dependencies = [ "anyhow", "cargo_metadata", "ctor 0.8.0", - "dom_query", + "dom_query 0.27.0", "dunce", "glob", "http", - "infer", + "infer 0.19.0", "json-patch 3.0.1", "log", "memchr", @@ -5063,11 +5181,11 @@ dependencies = [ "brotli", "cargo_metadata", "ctor 1.0.12", - "dom_query", + "dom_query 0.27.0", "dunce", "glob", "http", - "infer", + "infer 0.19.0", "json-patch 4.2.0", "log", "memchr", @@ -5091,6 +5209,42 @@ dependencies = [ "walkdir", ] +[[package]] +name = "tauri-utils" +version = "2.9.3" +source = "git+https://github.com/tauri-apps/tauri?rev=dd6befda925845fc74ca595d6d42de6c49580dd8#dd6befda925845fc74ca595d6d42de6c49580dd8" +dependencies = [ + "anyhow", + "cargo_metadata", + "ctor 1.0.12", + "dom_query 0.28.0", + "dunce", + "glob", + "http", + "infer 0.22.0", + "json-patch 4.2.0", + "log", + "memchr", + "phf", + "plist", + "proc-macro2", + "quote", + "regex", + "schemars 0.8.22", + "semver", + "serde", + "serde-untagged", + "serde_json", + "serde_with", + "swift-rs", + "thiserror 2.0.19", + "toml 1.1.4+spec-1.1.0", + "url", + "urlpattern 0.6.0", + "uuid", + "walkdir", +] + [[package]] name = "tauri-winres" version = "0.3.6" @@ -5146,7 +5300,7 @@ dependencies = [ "serde", "serde_json", "tauri", - "tauri-build", + "tauri-build 2.6.3 (git+https://github.com/tauri-apps/tauri?rev=dd6befda925845fc74ca595d6d42de6c49580dd8)", "tauri-plugin-deep-link", "tauri-plugin-log", "tauri-plugin-notification", @@ -6330,7 +6484,7 @@ dependencies = [ "cookie", "crossbeam-channel", "dirs", - "dom_query", + "dom_query 0.27.0", "dpi", "dunce", "gdkx11", diff --git a/apps/tauri/src-tauri/Cargo.toml b/apps/tauri/src-tauri/Cargo.toml index 2a68e95..269032f 100644 --- a/apps/tauri/src-tauri/Cargo.toml +++ b/apps/tauri/src-tauri/Cargo.toml @@ -15,7 +15,7 @@ name = "mobile_lib" crate-type = ["staticlib", "cdylib", "rlib"] [build-dependencies] -tauri-build = { git = "https://github.com/tauri-apps/tauri", rev = "4af26a3f7f8b692d62cca549bbacd93f5ce90b41", features = [] } +tauri-build = { git = "https://github.com/tauri-apps/tauri", rev = "dd6befda925845fc74ca595d6d42de6c49580dd8", features = [] } [dependencies] tauri-plugin-opener = "2"