From 9c997ea660dd3cda996cc7332cfcf70148b05640 Mon Sep 17 00:00:00 2001 From: repparw Date: Fri, 4 Sep 2026 15:22:13 -0300 Subject: [PATCH] opencode: preserve service PATH --- modules/programs/opencode.nix | 27 +++++---- .../web-service-environment-file.plist | 5 -- .../web-service-environment-file.service | 3 +- .../modules/programs/opencode/web-service.nix | 56 ++++++++++++++----- .../programs/opencode/web-service.plist | 7 +-- .../programs/opencode/web-service.service | 3 +- 6 files changed, 58 insertions(+), 43 deletions(-) diff --git a/modules/programs/opencode.nix b/modules/programs/opencode.nix index 3418f88637..985e62976b 100644 --- a/modules/programs/opencode.nix +++ b/modules/programs/opencode.nix @@ -101,6 +101,16 @@ let fi ''; + webProgramArguments = [ + (lib.getExe packageWithExtraPackages) + "serve" + ] + ++ webCfg.extraArgs; + + opencodeWebLauncher = pkgs.writeShellScriptBin "opencode-web-launcher" '' + export PATH="${config.home.profileDirectory}/bin''${PATH:+:$PATH}" + exec ${lib.escapeShellArgs webProgramArguments} + ''; in { meta.maintainers = with lib.maintainers; [ delafthi ]; @@ -647,12 +657,9 @@ in }; Service = { - ExecStart = "${lib.getExe packageWithExtraPackages} serve ${lib.escapeShellArgs webCfg.extraArgs}"; + ExecStart = lib.getExe opencodeWebLauncher; Restart = "always"; RestartSec = 5; - Environment = [ - "PATH=${config.home.profileDirectory}/bin" - ]; } // lib.optionalAttrs (webCfg.environmentFile != null) { EnvironmentFile = webCfg.environmentFile; @@ -670,18 +677,13 @@ in config = { ProgramArguments = let - programArguments = [ - (lib.getExe packageWithExtraPackages) - "serve" - ] - ++ webCfg.extraArgs; opencodeLaunchdWrapper = pkgs.writeShellScriptBin "opencode-launchd-wrapper" '' source ${webCfg.environmentFile} - exec ${lib.escapeShellArgs programArguments} + exec ${lib.getExe opencodeWebLauncher} ''; in if webCfg.environmentFile == null then - programArguments + [ (lib.getExe opencodeWebLauncher) ] else [ (lib.getExe opencodeLaunchdWrapper) @@ -692,9 +694,6 @@ in }; ProcessType = "Background"; RunAtLoad = true; - EnvironmentVariables = { - PATH = "${config.home.profileDirectory}/bin"; - }; }; }; }; diff --git a/tests/modules/programs/opencode/web-service-environment-file.plist b/tests/modules/programs/opencode/web-service-environment-file.plist index f287125aa6..7c91f87a87 100644 --- a/tests/modules/programs/opencode/web-service-environment-file.plist +++ b/tests/modules/programs/opencode/web-service-environment-file.plist @@ -2,11 +2,6 @@ - EnvironmentVariables - - PATH - /home/hm-user/.nix-profile/bin - KeepAlive Crashed diff --git a/tests/modules/programs/opencode/web-service-environment-file.service b/tests/modules/programs/opencode/web-service-environment-file.service index 1aee2a6184..eac5dbe120 100644 --- a/tests/modules/programs/opencode/web-service-environment-file.service +++ b/tests/modules/programs/opencode/web-service-environment-file.service @@ -2,9 +2,8 @@ WantedBy=default.target [Service] -Environment=PATH=/home/hm-user/.nix-profile/bin EnvironmentFile=/run/secrets/opencode -ExecStart=@opencode@/bin/opencode serve +ExecStart=/nix/store/00000000000000000000000000000000-opencode-web-launcher/bin/opencode-web-launcher Restart=always RestartSec=5 diff --git a/tests/modules/programs/opencode/web-service.nix b/tests/modules/programs/opencode/web-service.nix index 1019a97c74..ccee1f640e 100644 --- a/tests/modules/programs/opencode/web-service.nix +++ b/tests/modules/programs/opencode/web-service.nix @@ -1,10 +1,29 @@ { + config, + lib, pkgs, ... }: +let + profileHelper = pkgs.writeShellScriptBin "profile-helper" ""; + extraHelper = pkgs.writeShellScriptBin "extra-helper" ""; + inheritedHelper = pkgs.writeShellScriptBin "inherited-helper" ""; + testOpencode = pkgs.writeShellScriptBin "opencode" '' + set -e + command -v profile-helper >/dev/null + command -v extra-helper >/dev/null + command -v inherited-helper >/dev/null + ''; + serviceLauncher = config.systemd.user.services.opencode-web.Service.ExecStart; + testLauncher = "$TMPDIR/opencode-web-launcher"; +in { + home.homeDirectory = lib.mkForce "/@TMPDIR@/hm-user"; + programs.opencode = { enable = true; + package = testOpencode; + extraPackages = [ extraHelper ]; web = { enable = true; @@ -26,18 +45,27 @@ }; nmt.script = - if pkgs.stdenv.hostPlatform.isDarwin then - '' - serviceFile=LaunchAgents/org.nix-community.home.opencode-web.plist - assertFileExists "$serviceFile" - serviceFileNormalized="$(normalizeStorePaths "$serviceFile")" - assertFileContent "$serviceFileNormalized" ${./web-service.plist} - '' - else - '' - serviceFile=home-files/.config/systemd/user/opencode-web.service - assertFileExists "$serviceFile" - serviceFileNormalized="$(normalizeStorePaths "$serviceFile")" - assertFileContent "$serviceFileNormalized" ${./web-service.service} - ''; + ( + if pkgs.stdenv.hostPlatform.isDarwin then + '' + serviceFile=LaunchAgents/org.nix-community.home.opencode-web.plist + assertFileExists "$serviceFile" + serviceFileNormalized="$(normalizeStorePaths "$serviceFile")" + assertFileContent "$serviceFileNormalized" ${./web-service.plist} + '' + else + '' + serviceFile=home-files/.config/systemd/user/opencode-web.service + assertFileExists "$serviceFile" + serviceFileNormalized="$(normalizeStorePaths "$serviceFile")" + assertFileContent "$serviceFileNormalized" ${./web-service.service} + '' + ) + + '' + mkdir -p "$TMPDIR/hm-user/.nix-profile/bin" + ln -s ${lib.getExe profileHelper} "$TMPDIR/hm-user/.nix-profile/bin/profile-helper" + substitute ${lib.escapeShellArg serviceLauncher} ${testLauncher} --subst-var TMPDIR + chmod +x ${testLauncher} + PATH=${lib.makeBinPath [ inheritedHelper ]} ${testLauncher} + ''; } diff --git a/tests/modules/programs/opencode/web-service.plist b/tests/modules/programs/opencode/web-service.plist index e4f04fd3e7..b31ccfb9d9 100644 --- a/tests/modules/programs/opencode/web-service.plist +++ b/tests/modules/programs/opencode/web-service.plist @@ -2,11 +2,6 @@ - EnvironmentVariables - - PATH - /home/hm-user/.nix-profile/bin - KeepAlive Crashed @@ -22,7 +17,7 @@ /bin/sh -c - /bin/wait4path /nix/store && exec @opencode@/bin/opencode serve --hostname 0.0.0.0 --port 4096 --mdns --cors https://example.com --cors http://localhost:3000 --print-logs --log-level DEBUG + /bin/wait4path /nix/store && exec /nix/store/00000000000000000000000000000000-opencode-web-launcher/bin/opencode-web-launcher RunAtLoad diff --git a/tests/modules/programs/opencode/web-service.service b/tests/modules/programs/opencode/web-service.service index e7d96a0584..d6ce9b09a9 100644 --- a/tests/modules/programs/opencode/web-service.service +++ b/tests/modules/programs/opencode/web-service.service @@ -2,8 +2,7 @@ WantedBy=default.target [Service] -Environment=PATH=/home/hm-user/.nix-profile/bin -ExecStart=@opencode@/bin/opencode serve --hostname 0.0.0.0 --port 4096 --mdns --cors https://example.com --cors http://localhost:3000 --print-logs --log-level DEBUG +ExecStart=/nix/store/00000000000000000000000000000000-opencode-web-launcher/bin/opencode-web-launcher Restart=always RestartSec=5