From e212e07cf6aac9d9e1c46db34b17fd16be2399c3 Mon Sep 17 00:00:00 2001
From: Eelco Dolstra <eelco.dolstra@logicblox.com>
Date: Mon, 15 Jun 2015 18:04:27 +0200
Subject: [PATCH] Make types.bool complain on conflicting definitions

Previously, conflicting definitions would merge to "true". Now they
give an error, e.g.

  error: The option `hardware.enableAllFirmware' has conflicting definitions, in `/etc/nixos/configurations/misc/eelco/stuff.nix' and `/etc/nixos/configurations/misc/eelco/mandark.nix'.
---
 lib/options.nix | 9 +++++++++
 lib/types.nix   | 2 +-
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/lib/options.nix b/lib/options.nix
index a30397c72161..bfc5b5fa2ae8 100644
--- a/lib/options.nix
+++ b/lib/options.nix
@@ -65,6 +65,15 @@ rec {
       throw "The unique option `${showOption loc}' is defined multiple times, in ${showFiles (getFiles defs)}."
     else (head defs).value;
 
+  /* "Merge" option definitions by checking that they all have the same value. */
+  mergeEqualOption = loc: defs:
+    if defs == [] then abort "This case should never happen."
+    else fold (def: val:
+      if def.value != val then
+        throw "The option `${showOption loc}' has conflicting definitions, in ${showFiles (getFiles defs)}."
+      else
+        val) (head defs).value defs;
+
   getValues = map (x: x.value);
   getFiles = map (x: x.file);
 
diff --git a/lib/types.nix b/lib/types.nix
index f22c76616345..0a54a5598f14 100644
--- a/lib/types.nix
+++ b/lib/types.nix
@@ -54,7 +54,7 @@ rec {
     bool = mkOptionType {
       name = "boolean";
       check = isBool;
-      merge = loc: fold (x: y: x.value || y) false;
+      merge = mergeEqualOption;
     };
 
     int = mkOptionType {