#!/usr/bin/env dash # nixos-config - My current NixOS configuration # # Copyright (C) 2025 Benedikt Peetz # SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of my nixos-config. # # You should have received a copy of the License along with this program. # If not, see . # FIXME(@bpeetz): Ideally I could replace this script with a deployment tool. Thus we # would have the same tool on the server as I use in my config. <2025-04-14> # Shell library {{{ die() { error "$1" if [ -n "$2" ]; then exit "$2" else exit 1 fi } print() { # shellcheck disable=SC2059 printf "$*" } println() { # shellcheck disable=SC2059 printf "$*\n" } eprint() { >&2 print "$@" } eprintln() { >&2 println "$@" } if [ "${NO_COLOR-unset}" != "unset" ]; then error() { eprintln "==> ERROR:" "$*" } warning() { eprintln "==> WARNING:" "$*" } debug() { [ -n "$SHELL_LIBRARY_DEBUG" ] && eprintln "==> [Debug:]" "$*" } debug2() { [ -n "$SHELL_LIBRARY_DEBUG" ] && eprintln " -> [Debug:]" "$*" } msg() { eprintln "==>" "$*" } msg2() { eprintln " ->" "$*" } prompt() { eprint "..>" "$*" } else error() { eprintln "\033[1;91m==> ERROR:\033[0m" "\033[1;93m$*\033[0m" } warning() { eprintln "\033[1;91m==> WARNING:\033[0m" "\033[1;93m$*\033[0m" } debug() { [ -n "$SHELL_LIBRARY_DEBUG" ] && eprintln "\033[1;94m==> [Debug:]\033[0m" "\033[1;93m$*\033[0m" } debug2() { [ -n "$SHELL_LIBRARY_DEBUG" ] && eprintln "\033[1;94m -> [Debug:]\033[0m" "\033[1;93m$*\033[0m" } msg() { eprintln "\033[1;96m==>\033[0m" "\033[1;93m$*\033[0m" } msg2() { eprintln "\033[1;96m ->\033[0m" "\033[1;93m$*\033[0m" } prompt() { eprint "\033[1;96m..>\033[0m" "\033[1;93m$*\033[0m" } fi # }}} NAME="update-sys" help() { cat <] [--help] OPTIONS: --branch | -b BRANCHNAME select a branch to update from. --mode | -m MODE select a mode to update with --help | -h output this help. ARGUMENTS: BRANCHNAME := [[ git branch --list --format '%(refname:short)' ]] The name of the branch to deploy the config from MODE := switch|boot|test|build|dry-build|dry-activate|edit|repl|build-vm|build-vm-with-bootloader See the 'nixos-rebuild' manpage for more information about these modes. EOF exit "$1" } BRANCH="" while [ "$#" -gt 0 ]; do case "$1" in "--help" | "-h") help 0 ;; "--branch" | "-b") if [ "${2-unset}" != "unset" ]; then BRANCH="$2" else error "$1 requires an argument" help 1 fi shift 2 ;; "--mode" | "-m") if [ "${2-unset}" != "unset" ]; then MODE="$2" else error "$1 requires an argument" help 1 fi shift 2 ;; *) error "the option $1 does not exist!" help 1 ;; esac done cd /etc/nixos || die "No /etc/nixos" msg "Starting system update..." git remote update origin --prune >/dev/null 2>&1 if ! [ "$BRANCH" = "" ]; then git switch "$BRANCH" >/dev/null 2>&1 && msg2 "Switched to branch '$BRANCH'" fi msg2 "Updating git repository..." git pull --rebase # We use a tempfile, to make this truly async. default_branch=$(mktemp) cleanup() { rm "$default_branch" } trap cleanup EXIT git remote show origin | grep 'HEAD' | cut -d':' -f2 | sed -e 's/^ *//g' -e 's/ *$//g' >"$default_branch" & msg2 "Updating system..." nixos-rebuild "${MODE-switch}" git switch "$(cat "$default_branch")" >/dev/null 2>&1 && msg2 "Switched to branch '$(cat "$default_branch")'" msg "Finished Update!" # vim: ft=sh