summaryrefslogtreecommitdiff
path: root/os
diff options
context:
space:
mode:
authorsinanmohd <sinan@sinanmohd.com>2025-09-06 09:31:20 +0530
committersinanmohd <sinan@sinanmohd.com>2025-09-06 11:18:19 +0530
commit6bc9fe42a2cadc771c178f289207b914e8ec37a1 (patch)
tree82ef3a38b23e972c3df437d86ecfafeb3bd7831d /os
parentce93b0b2c89b60fae4d4bcee67aa243edda1f893 (diff)
fix(os/common/nix): nix develop interactive shell
Diffstat (limited to 'os')
-rw-r--r--os/common/configuration.nix2
-rw-r--r--os/common/modules/nix/default.nix (renamed from os/common/modules/nix.nix)20
-rw-r--r--os/common/modules/nix/nix.patch53
3 files changed, 73 insertions, 2 deletions
diff --git a/os/common/configuration.nix b/os/common/configuration.nix
index 7b6b956..afa5de2 100644
--- a/os/common/configuration.nix
+++ b/os/common/configuration.nix
@@ -12,7 +12,7 @@ in
"services/networking/pppd.nix"
];
imports = [
- ./modules/nix.nix
+ ./modules/nix
./modules/user.nix
./modules/environment.nix
./modules/pppd.nix
diff --git a/os/common/modules/nix.nix b/os/common/modules/nix/default.nix
index 711ead4..bddf978 100644
--- a/os/common/modules/nix.nix
+++ b/os/common/modules/nix/default.nix
@@ -1,9 +1,27 @@
-{ config, ... }:
+{
+ config,
+ pkgs,
+ determinate,
+ lib,
+ ...
+}:
let
user = config.global.userdata.name;
+
+ nixWithFix = determinate.inputs.nix.packages.${pkgs.stdenv.system}.nix-everything.override {
+ nix-cli = determinate.inputs.nix.packages.${pkgs.stdenv.system}.nix-cli.overrideAttrs (oldAttrs: {
+ patches = (oldAttrs.patches or [ ]) ++ [
+ ./nix.patch
+ ];
+ });
+ };
in
{
+ imports = [ determinate.nixosModules.default ];
+
nix = {
+ package = lib.mkForce nixWithFix;
+
gc = {
automatic = true;
dates = "weekly";
diff --git a/os/common/modules/nix/nix.patch b/os/common/modules/nix/nix.patch
new file mode 100644
index 0000000..4f565d8
--- /dev/null
+++ b/os/common/modules/nix/nix.patch
@@ -0,0 +1,53 @@
+diff --git a/develop.cc b/develop.cc
+index ed25e655d8f..f78eee59abc 100644
+--- a/develop.cc
++++ b/develop.cc
+@@ -627,13 +627,12 @@ struct CmdDevelop : Common, MixEnvironment
+ fmt("[ -n \"$PS1\" ] && PS1+=%s;\n", escapeShellArgAlways(developSettings.bashPromptSuffix.get()));
+ }
+
+- writeFull(rcFileFd.get(), script);
+-
+ setEnviron();
+ // prevent garbage collection until shell exits
+ setEnv("NIX_GCROOT", gcroot.c_str());
+
+ Path shell = "bash";
++ bool foundInteractive = false;
+
+ try {
+ auto state = getEvalState();
+@@ -656,19 +655,17 @@ struct CmdDevelop : Common, MixEnvironment
+ Strings{"legacyPackages." + settings.thisSystem.get() + "."},
+ nixpkgsLockFlags);
+
+- bool found = false;
+-
+ for (auto & path : Installable::toStorePathSet(
+ getEvalStore(), store, Realise::Outputs, OperateOn::Output, {bashInstallable})) {
+ auto s = store->printStorePath(path) + "/bin/bash";
+ if (pathExists(s)) {
+ shell = s;
+- found = true;
++ foundInteractive = true;
+ break;
+ }
+ }
+
+- if (!found)
++ if (!foundInteractive)
+ throw Error("package 'nixpkgs#bashInteractive' does not provide a 'bin/bash'");
+
+ } catch (Error &) {
+@@ -678,6 +675,11 @@ struct CmdDevelop : Common, MixEnvironment
+ // Override SHELL with the one chosen for this environment.
+ // This is to make sure the system shell doesn't leak into the build environment.
+ setEnv("SHELL", shell.c_str());
++ // https://github.com/NixOS/nix/issues/5873
++ script += fmt("SHELL=\"%s\"\n", shell);
++ if (foundInteractive)
++ script += fmt("PATH=\"%s${PATH:+:$PATH}\"\n", std::filesystem::path(shell).parent_path());
++ writeFull(rcFileFd.get(), script);
+
+ #ifdef _WIN32 // TODO re-enable on Windows
+ throw UnimplementedError("Cannot yet spawn processes on Windows");