From b182e64c01aa4e61a007691525a3ea498a9aee63 Mon Sep 17 00:00:00 2001 From: Jairo Llopis <973709+yajo@users.noreply.github.com> Date: Thu, 3 Jul 2025 13:44:20 +0100 Subject: [PATCH] zed-editor: survive if previous files are not JSON5 (#7351) --- modules/programs/zed-editor.nix | 4 +- tests/modules/programs/zed-editor/default.nix | 2 + .../programs/zed-editor/keymap-empty.nix | 74 +++++++++++++++++++ .../programs/zed-editor/settings-empty.nix | 67 +++++++++++++++++ 4 files changed, 145 insertions(+), 2 deletions(-) create mode 100644 tests/modules/programs/zed-editor/keymap-empty.nix create mode 100644 tests/modules/programs/zed-editor/settings-empty.nix diff --git a/modules/programs/zed-editor.nix b/modules/programs/zed-editor.nix index 82f9ccf6..e3e4e45b 100644 --- a/modules/programs/zed-editor.nix +++ b/modules/programs/zed-editor.nix @@ -22,9 +22,9 @@ let # No file? Create it echo ${lib.escapeShellArg empty} > ${lib.escapeShellArg path} fi - dynamic="$(${lib.getExe json5} --as-json ${lib.escapeShellArg path})" + dynamic="$(${lib.getExe json5} --as-json ${lib.escapeShellArg path} 2>/dev/null || echo ${lib.escapeShellArg empty})" static="$(cat ${lib.escapeShellArg staticSettings})" - config="$(${lib.getExe pkgs.jq} -s ${lib.escapeShellArg jqOperation} --argjson dynamic "$dynamic" --argjson static "$static")" + config="$(${lib.getExe pkgs.jq} -n ${lib.escapeShellArg jqOperation} --argjson dynamic "$dynamic" --argjson static "$static")" printf '%s\n' "$config" > ${lib.escapeShellArg path} unset config ''; diff --git a/tests/modules/programs/zed-editor/default.nix b/tests/modules/programs/zed-editor/default.nix index 4a4e9066..112a1811 100644 --- a/tests/modules/programs/zed-editor/default.nix +++ b/tests/modules/programs/zed-editor/default.nix @@ -2,6 +2,8 @@ zed-extensions = ./extensions.nix; zed-install-remote-server = ./install-remote-server.nix; zed-keymap = ./keymap.nix; + zed-keymap-empty = ./keymap-empty.nix; zed-settings = ./settings.nix; + zed-settings-empty = ./settings-empty.nix; zed-themes = ./themes; } diff --git a/tests/modules/programs/zed-editor/keymap-empty.nix b/tests/modules/programs/zed-editor/keymap-empty.nix new file mode 100644 index 00000000..36b61724 --- /dev/null +++ b/tests/modules/programs/zed-editor/keymap-empty.nix @@ -0,0 +1,74 @@ +{ + config, + lib, + pkgs, + ... +}: + +{ + programs.zed-editor = { + enable = true; + package = config.lib.test.mkStubPackage { }; + userKeymaps = [ + { + bindings = { + up = "menu::SelectPrev"; + }; + } + { + context = "Editor"; + bindings = { + escape = "editor::Cancel"; + }; + } + ]; + }; + + home.homeDirectory = lib.mkForce "/@TMPDIR@/hm-user"; + + nmt.script = + let + # For some reason, the preexisting keymaps is an empty file + preexistingKeymaps = builtins.toFile "preexisting.json" ""; + + expectedContent = builtins.toFile "expected.json" '' + [ + { + "bindings": { + "up": "menu::SelectPrev" + } + }, + { + "bindings": { + "escape": "editor::Cancel" + }, + "context": "Editor" + } + ] + ''; + + keymapPath = ".config/zed/keymap.json"; + activationScript = pkgs.writeScript "activation" config.home.activation.zedKeymapActivation.data; + in + '' + export HOME=$TMPDIR/hm-user + + # Simulate preexisting keymaps + mkdir -p $HOME/.config/zed + cat ${preexistingKeymaps} > $HOME/${keymapPath} + + # Run the activation script + substitute ${activationScript} $TMPDIR/activate --subst-var TMPDIR + chmod +x $TMPDIR/activate + $TMPDIR/activate + + # Validate the merged keymaps + assertFileExists "$HOME/${keymapPath}" + assertFileContent "$HOME/${keymapPath}" "${expectedContent}" + + # Test idempotency + $TMPDIR/activate + assertFileExists "$HOME/${keymapPath}" + assertFileContent "$HOME/${keymapPath}" "${expectedContent}" + ''; +} diff --git a/tests/modules/programs/zed-editor/settings-empty.nix b/tests/modules/programs/zed-editor/settings-empty.nix new file mode 100644 index 00000000..1e816e71 --- /dev/null +++ b/tests/modules/programs/zed-editor/settings-empty.nix @@ -0,0 +1,67 @@ +# Test custom keymap functionality +{ + config, + lib, + pkgs, + ... +}: + +{ + programs.zed-editor = { + enable = true; + package = config.lib.test.mkStubPackage { }; + userSettings = { + theme = "XY-Zed"; + features = { + copilot = false; + }; + vim_mode = false; + ui_font_size = 16; + buffer_font_size = 16; + }; + }; + + home.homeDirectory = lib.mkForce "/@TMPDIR@/hm-user"; + + nmt.script = + let + # For some reason, the preexisting settings is an empty file + preexistingSettings = builtins.toFile "preexisting.json" ""; + + expectedContent = builtins.toFile "expected.json" '' + { + "buffer_font_size": 16, + "features": { + "copilot": false + }, + "theme": "XY-Zed", + "ui_font_size": 16, + "vim_mode": false + } + ''; + + settingsPath = ".config/zed/settings.json"; + activationScript = pkgs.writeScript "activation" config.home.activation.zedSettingsActivation.data; + in + '' + export HOME=$TMPDIR/hm-user + + # Simulate preexisting settings + mkdir -p $HOME/.config/zed + cat ${preexistingSettings} > $HOME/${settingsPath} + + # Run the activation script + substitute ${activationScript} $TMPDIR/activate --subst-var TMPDIR + chmod +x $TMPDIR/activate + $TMPDIR/activate + + # Validate the merged settings + assertFileExists "$HOME/${settingsPath}" + assertFileContent "$HOME/${settingsPath}" "${expectedContent}" + + # Test idempotency + $TMPDIR/activate + assertFileExists "$HOME/${settingsPath}" + assertFileContent "$HOME/${settingsPath}" "${expectedContent}" + ''; +}