summary refs log tree commit diff
path: root/nixos/modules/installer
diff options
context:
space:
mode:
authorTuomas Tynkkynen <tuomas@tuxera.com>2017-03-11 17:58:55 +0200
committerTuomas Tynkkynen <tuomas.tynkkynen@iki.fi>2017-03-25 01:42:28 +0200
commit60788745c9dce2544e90a0d5638843f5259e9f9b (patch)
tree80bda8f31dccacb1624a02821e36b03c19af1a72 /nixos/modules/installer
parent872a15a0baf232f22dc8b6e62746ada1833a66da (diff)
downloadnixpkgs-60788745c9dce2544e90a0d5638843f5259e9f9b.tar
nixpkgs-60788745c9dce2544e90a0d5638843f5259e9f9b.tar.gz
nixpkgs-60788745c9dce2544e90a0d5638843f5259e9f9b.tar.bz2
nixpkgs-60788745c9dce2544e90a0d5638843f5259e9f9b.tar.lz
nixpkgs-60788745c9dce2544e90a0d5638843f5259e9f9b.tar.xz
nixpkgs-60788745c9dce2544e90a0d5638843f5259e9f9b.tar.zst
nixpkgs-60788745c9dce2544e90a0d5638843f5259e9f9b.zip
channel.nix: Use filterSource to exclude unnecessary files from nixpkgs
Currently, if you try to build a NixOS config including channel.nix, e.g.:

nix-build -I nixpkgs=. -I nixos-config=nixos/modules/installer/cd-dvd/installation-cd-minimal.nix nixos -A config.system.build.isoImage

twice in a row, you end up with two different build results. This is
caused by the 'result' symlink of the first build affecting the channel
contents of the second build.

If we use filterSource with a predicate that ignores the 'result'
symlinks, the problem is gone. Do the same thing for VIM/Emacs
swap/backup files to avoid even more 'spurious' rebuilds.

Additionally, filter out the '.git' directory at the same time, as we
'rm -rf' it from the result anyway. This avoids a considerable amount of
unnecessary file I/O copying and deleting the .git directory.
Diffstat (limited to 'nixos/modules/installer')
-rw-r--r--nixos/modules/installer/cd-dvd/channel.nix13
1 files changed, 11 insertions, 2 deletions
diff --git a/nixos/modules/installer/cd-dvd/channel.nix b/nixos/modules/installer/cd-dvd/channel.nix
index cd6e72755de..663ff24c81f 100644
--- a/nixos/modules/installer/cd-dvd/channel.nix
+++ b/nixos/modules/installer/cd-dvd/channel.nix
@@ -6,6 +6,16 @@
 with lib;
 
 let
+  # Do not include these things:
+  #   - The '.git' directory
+  #   - Result symlinks from nix-build ('result', 'result-2', 'result-bin', ...)
+  #   - VIM/Emacs swap/backup files ('.swp', '.swo', '.foo.swp', 'foo~', ...)
+  filterFn = path: type: let basename = baseNameOf (toString path); in
+    if type == "directory" then basename != ".git"
+    else if type == "symlink" then builtins.match "^result(|-.*)$" basename == null
+    else builtins.match "^((|\..*)\.sw[a-z]|.*~)$" basename == null;
+
+  nixpkgs = builtins.filterSource filterFn pkgs.path;
 
   # We need a copy of the Nix expressions for Nixpkgs and NixOS on the
   # CD.  These are installed into the "nixos" channel of the root
@@ -15,12 +25,11 @@ let
     { }
     ''
       mkdir -p $out
-      cp -prd ${pkgs.path} $out/nixos
+      cp -prd ${nixpkgs} $out/nixos
       chmod -R u+w $out/nixos
       if [ ! -e $out/nixos/nixpkgs ]; then
         ln -s . $out/nixos/nixpkgs
       fi
-      rm -rf $out/nixos/.git
       echo -n ${config.system.nixosVersionSuffix} > $out/nixos/.version-suffix
     '';