#!/usr/bin/env bash set -euo pipefail # Enable all future paths in this script to be relative to the directory containing the script. cd "$(dirname -- "${BASH_SOURCE[0]}")" configPath=$(realpath -- "$HOSTNAME-configuration.nix") if [ ! -f $configPath ]; then echo "aborting: $configPath doesn't exist" exit 1 fi firstLine=$(head -n1 "$configPath") if ! echo "$firstLine" | grep -E ^"# channel *=" > /dev/null; then echo "aborting: $configPath doesn't start with \`# channel=\"...\"\`, where ... is a pin from sources.json" exit 1 fi nix-eval() { nix-instantiate --eval --read-write-mode "$@" \ | tr -d \" # nix-instantiate has no raw output yet (like the experimental nix eval) } channel=$(nix-eval --argstr line "$(echo $firstLine | tr -d \#)" --expr '{line}: (builtins.fromTOML line).channel') nixpkgsPath=$(nix-eval --argstr channel "$channel" --expr '{channel}: (import ./npins).${channel}.outPath') # 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"