From 64e4a7426bbe08621afb7ac21c930c52bee45d79 Mon Sep 17 00:00:00 2001 From: Matt Sturgeon Date: Mon, 30 Jun 2025 14:32:38 +0100 Subject: [PATCH 1/4] nexusmods-app: remove copyDesktopItems hook We don't need this hook, because the desktop entries come from `src` and don't need to be copied from `desktopItems` inputs. See https://nixos.org/manual/nixpkgs/unstable/#trivial-builder-makeDesktopItem for valid usage of `copyDesktopItems`. --- pkgs/by-name/ne/nexusmods-app/package.nix | 2 -- 1 file changed, 2 deletions(-) diff --git a/pkgs/by-name/ne/nexusmods-app/package.nix b/pkgs/by-name/ne/nexusmods-app/package.nix index 1319e1f40166..b007391f716d 100644 --- a/pkgs/by-name/ne/nexusmods-app/package.nix +++ b/pkgs/by-name/ne/nexusmods-app/package.nix @@ -2,7 +2,6 @@ _7zz, avalonia, buildDotnetModule, - copyDesktopItems, desktop-file-utils, dotnetCorePackages, fetchgit, @@ -51,7 +50,6 @@ buildDotnetModule (finalAttrs: { nativeCheckInputs = [ _7zz ]; nativeBuildInputs = [ - copyDesktopItems imagemagick # For resizing SVG icon in postInstall ]; From 0b4733d8e3ad49e1397c67a4cad327560937a2b8 Mon Sep 17 00:00:00 2001 From: Matt Sturgeon Date: Mon, 30 Jun 2025 13:53:16 +0100 Subject: [PATCH 2/4] nexusmods-app: refactor desktop entry template Use `toShellVars` to make it easier to write the `${template}` strings needed for the desktop entry substitution. --- pkgs/by-name/ne/nexusmods-app/package.nix | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pkgs/by-name/ne/nexusmods-app/package.nix b/pkgs/by-name/ne/nexusmods-app/package.nix index b007391f716d..db80cd831a8e 100644 --- a/pkgs/by-name/ne/nexusmods-app/package.nix +++ b/pkgs/by-name/ne/nexusmods-app/package.nix @@ -73,11 +73,16 @@ buildDotnetModule (finalAttrs: { ]; postInstall = '' + ${lib.strings.toShellVars { + inherit (finalAttrs.meta) mainProgram; + INSTALL_EXEC = "\${INSTALL_EXEC}"; + }} + # Desktop entry # As per #308324, use mainProgram from PATH, instead of $out/bin/NexusMods.App install -D -m 444 -t $out/share/applications src/NexusMods.App/com.nexusmods.app.desktop substituteInPlace $out/share/applications/com.nexusmods.app.desktop \ - --replace-fail '${"$"}{INSTALL_EXEC}' "${finalAttrs.meta.mainProgram}" + --replace-fail "$INSTALL_EXEC" "$mainProgram" # AppStream metadata install -D -m 444 -t $out/share/metainfo src/NexusMods.App/com.nexusmods.app.metainfo.xml From 5099a914b88dbbedbc476f45578974246b91010f Mon Sep 17 00:00:00 2001 From: Matt Sturgeon Date: Mon, 30 Jun 2025 13:55:38 +0100 Subject: [PATCH 3/4] nexusmods-app: set INSTALL_TRYEXEC in desktop entry 0.12 added a new `INSTALL_TRYEXEC` template to the desktop entry, in https://github.com/Nexus-Mods/NexusMods.App/pull/3215 Replacing this template fixes an invalid desktop entry being installed. Fixes https://github.com/NixOS/nixpkgs/issues/421241 --- pkgs/by-name/ne/nexusmods-app/package.nix | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pkgs/by-name/ne/nexusmods-app/package.nix b/pkgs/by-name/ne/nexusmods-app/package.nix index db80cd831a8e..f386b51ecb15 100644 --- a/pkgs/by-name/ne/nexusmods-app/package.nix +++ b/pkgs/by-name/ne/nexusmods-app/package.nix @@ -76,13 +76,15 @@ buildDotnetModule (finalAttrs: { ${lib.strings.toShellVars { inherit (finalAttrs.meta) mainProgram; INSTALL_EXEC = "\${INSTALL_EXEC}"; + INSTALL_TRYEXEC = "\${INSTALL_TRYEXEC}"; }} # Desktop entry # As per #308324, use mainProgram from PATH, instead of $out/bin/NexusMods.App install -D -m 444 -t $out/share/applications src/NexusMods.App/com.nexusmods.app.desktop substituteInPlace $out/share/applications/com.nexusmods.app.desktop \ - --replace-fail "$INSTALL_EXEC" "$mainProgram" + --replace-fail "$INSTALL_EXEC" "$mainProgram" \ + --replace-fail "$INSTALL_TRYEXEC" "$mainProgram" # AppStream metadata install -D -m 444 -t $out/share/metainfo src/NexusMods.App/com.nexusmods.app.metainfo.xml From 8d70e8957ef0e3733d38fa09ce759980c01302c5 Mon Sep 17 00:00:00 2001 From: Matt Sturgeon Date: Mon, 30 Jun 2025 13:59:38 +0100 Subject: [PATCH 4/4] nexusmods-app: validate desktop entry Avoid future regressions related to new desktop entry templates by validating the final desktop entry file doesn't contain any "$" chars. Additionally, validate using `desktop-file-validate` from desktop-file-utils. --- pkgs/by-name/ne/nexusmods-app/package.nix | 26 +++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/pkgs/by-name/ne/nexusmods-app/package.nix b/pkgs/by-name/ne/nexusmods-app/package.nix index f386b51ecb15..35a6aa834ef2 100644 --- a/pkgs/by-name/ne/nexusmods-app/package.nix +++ b/pkgs/by-name/ne/nexusmods-app/package.nix @@ -148,6 +148,32 @@ buildDotnetModule (finalAttrs: { "NexusMods.Games.FOMOD.Tests.FomodXmlInstallerTests.InstallsFilesSimple_UsingRar" ]; + doInstallCheck = true; + + nativeInstallCheckInputs = [ + desktop-file-utils + ]; + + # Upstream use ${...} templates in the desktop entry, so assert that we haven't missed any + # See https://github.com/NixOS/nixpkgs/issues/421241 + installCheckPhase = '' + runHook preInstallCheck + + echo 'Checking for issues in $out/share/applications/com.nexusmods.app.desktop' + ( + cd $out/share/applications + desktop-file-validate com.nexusmods.app.desktop + if grep '\$' com.nexusmods.app.desktop \ + --with-filename --line-number + then + echo 'error: unexpected "$"' + exit 1 + fi + ) &>/dev/stderr + + runHook postInstallCheck + ''; + passthru.updateScript = nix-update-script { }; meta = {