#!/usr/bin/env bash set -euo pipefail top=$(dirname "$(realpath "$0")") hostDir="$top/hosts/$HOSTNAME" defaultConfigPath="$hostDir/default.nix" privateConfigPath="$hostDir/private.nix" case "${1:-}" in --default) configPath="$defaultConfigPath" shift ;; *) if [ -f "$privateConfigPath" ]; then configPath="$privateConfigPath" else configPath="$defaultConfigPath" fi ;; esac if [ ! -f "$configPath" ]; then echo "aborting: $configPath doesn't exist" exit 1 fi nixpkgsPath=$( cd "$top" && nix-instantiate --eval --raw \ --argstr host "$HOSTNAME" \ --expr ' { host }: let toml = builtins.readFile ./hosts/${host}/metadata.toml; channel = (builtins.fromTOML toml).channel; in (import ./npins).${channel}.outPath ' ) ( # The result symlink created in the current directory is registered as a root of the Nix # garbage collector, so it's important that we call nixos-rebuild from the host directory. # (nix-build has an --out-link option but that option cannot be set via nixos-rebuild). cd "$hostDir" && # nixos-rebuild always reads Nixpkgs from the NIX_PATH, # so we need to set it explicitly to our pinned version exec nixos-rebuild "$@" -I nixpkgs="$nixpkgsPath" -I nixos-config="$configPath" -I top="$top" )