From bd628cf3da14b7d3fe0ba00932eb26d545b4b893 Mon Sep 17 00:00:00 2001
From: Yorick van Pelt <yorick@yorickvanpelt.nl>
Date: Mon, 22 Nov 2021 13:29:49 +0100
Subject: [PATCH 1/2] flakes: fix boolean and int nixConfig values

Some type confusion was causing ints to be pointers, and bools
to be ints. Fixes #5621
---
 src/libexpr/flake/config.cc | 8 ++++----
 src/libexpr/flake/flake.cc  | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/src/libexpr/flake/config.cc b/src/libexpr/flake/config.cc
index c03f4106c..7ecd61816 100644
--- a/src/libexpr/flake/config.cc
+++ b/src/libexpr/flake/config.cc
@@ -38,11 +38,11 @@ void ConfigFile::apply()
 
         // FIXME: Move into libutil/config.cc.
         std::string valueS;
-        if (auto s = std::get_if<std::string>(&value))
+        if (auto* s = std::get_if<std::string>(&value))
             valueS = *s;
-        else if (auto n = std::get_if<int64_t>(&value))
-            valueS = fmt("%d", n);
-        else if (auto b = std::get_if<Explicit<bool>>(&value))
+        else if (auto* n = std::get_if<int64_t>(&value))
+            valueS = fmt("%d", *n);
+        else if (auto* b = std::get_if<Explicit<bool>>(&value))
             valueS = b->t ? "true" : "false";
         else if (auto ss = std::get_if<std::vector<std::string>>(&value))
             valueS = concatStringsSep(" ", *ss); // FIXME: evil
diff --git a/src/libexpr/flake/flake.cc b/src/libexpr/flake/flake.cc
index f5be67d67..732198031 100644
--- a/src/libexpr/flake/flake.cc
+++ b/src/libexpr/flake/flake.cc
@@ -254,7 +254,7 @@ static Flake getFlake(
             else if (setting.value->type() == nInt)
                 flake.config.settings.insert({setting.name, state.forceInt(*setting.value, *setting.pos)});
             else if (setting.value->type() == nBool)
-                flake.config.settings.insert({setting.name, state.forceBool(*setting.value, *setting.pos)});
+                flake.config.settings.insert({setting.name, Explicit<bool> { state.forceBool(*setting.value, *setting.pos) }});
             else if (setting.value->type() == nList) {
                 std::vector<std::string> ss;
                 for (unsigned int n = 0; n < setting.value->listSize(); ++n) {

From bb8a53ab08c43425c6073aff5fe34bd5bc93dd13 Mon Sep 17 00:00:00 2001
From: regnat <rg@regnat.ovh>
Date: Tue, 14 Dec 2021 09:15:24 +0100
Subject: [PATCH 2/2] Add a test for boolean config options in flakes

---
 tests/flake-local-settings.sh | 1 +
 1 file changed, 1 insertion(+)

diff --git a/tests/flake-local-settings.sh b/tests/flake-local-settings.sh
index 09f6b4ca8..98ad60174 100644
--- a/tests/flake-local-settings.sh
+++ b/tests/flake-local-settings.sh
@@ -18,6 +18,7 @@ chmod +x echoing-post-hook.sh
 cat <<EOF > flake.nix
 {
     nixConfig.post-build-hook = "$PWD/echoing-post-hook.sh";
+    nixConfig.allow-dirty = false; # See #5621
 
     outputs = a: {
        defaultPackage.$system = import ./simple.nix;