From 6640000cb7148ba39bbdcca8e0cd7f5c224bce57 Mon Sep 17 00:00:00 2001
From: Shea Levy <shea@shealevy.com>
Date: Thu, 11 Apr 2013 17:02:19 -0400
Subject: [PATCH] overrideDerivation: Simplify

Since we're just calling derivation again, drvAttrs is exactly what we
want to pass, and we can get rid of the complicated "drop" logic. As a
bonus, this actually makes it correct, since before "drop" removed the
attribute named passthru but not actually the attributes added to the
top-level attrset via passthru.

Signed-off-by: Shea Levy <shea@shealevy.com>
---
 pkgs/lib/customisation.nix | 11 ++++-------
 1 file changed, 4 insertions(+), 7 deletions(-)

diff --git a/pkgs/lib/customisation.nix b/pkgs/lib/customisation.nix
index a35b44e9f6ee..50816f99ec60 100644
--- a/pkgs/lib/customisation.nix
+++ b/pkgs/lib/customisation.nix
@@ -33,17 +33,14 @@ rec {
      
   overrideDerivation = drv: f:
     let
-      # Filter out special attributes.
-      drop = [ "meta" "passthru" "outPath" "drvPath" "crossDrv" "nativeDrv" "type" "override" "deepOverride" "origArgs" "drvAttrs" "outputName" "all" "out" ]
-              # also drop functions such as .merge .override etc
-             ++ lib.filter (n: isFunction (getAttr n drv)) (attrNames drv);
-      attrs = removeAttrs drv drop;
-      newDrv = derivation (attrs // (f drv));
+      newDrv = derivation (drv.drvAttrs // (f drv));
     in newDrv //
-      { meta = if drv ? meta then drv.meta else {};
+      { meta = drv.meta or {};
         passthru = if drv ? passthru then drv.passthru else {};
       }
       //
+      (drv.passthru or {})
+      //
       (if (drv ? crossDrv && drv ? nativeDrv)
        then {
          crossDrv = overrideDerivation drv.crossDrv f;