Files
nix-config/scripts/rebuild.sh
2025-05-12 23:25:39 -03:00

107 lines
3.0 KiB
Bash
Executable File

#!/usr/bin/env bash
# shellcheck disable=SC2086
#
# This script is used to rebuild the system configuration for the current host.
#
# SC2086 is ignored because we purposefully pass some values as a set of arguments, so we want the splitting to happen
function red() {
echo -e "\x1B[31m[!] $1 \x1B[0m"
if [ -n "${2-}" ]; then
echo -e "\x1B[31m[!] $($2) \x1B[0m"
fi
}
function green() {
echo -e "\x1B[32m[+] $1 \x1B[0m"
if [ -n "${2-}" ]; then
echo -e "\x1B[32m[+] $($2) \x1B[0m"
fi
}
function yellow() {
echo -e "\x1B[33m[*] $1 \x1B[0m"
if [ -n "${2-}" ]; then
echo -e "\x1B[33m[*] $($2) \x1B[0m"
fi
}
switch_args="--show-trace --impure --flake "
if [[ -n $1 && $1 == "trace" ]]; then
switch_args="$switch_args --show-trace "
elif [[ -n $1 ]]; then
HOST=$1
else
HOST=$(hostname)
fi
switch_args="$switch_args .#$HOST switch"
os=$(uname -s)
if [ "$os" == "Darwin" ]; then
# FIXME: This might not have to be darwin specific
# FIXME: This will break if HM tries to create the file. We should use environment variables instead
mkdir -p ~/.config/nix || true
CONF=~/.config/nix/nix.conf
if [ ! -f $CONF ]; then
# Enable nix-command and flakes to bootstrap
cat <<-EOF >$CONF
experimental-features = nix-command flakes
EOF
fi
# Do some darwin pre-installation for bootstrapping
if ! which git &>/dev/null; then
echo "Installing xcode tools"
xcode-select --install
fi
# https://docs.brew.sh/Installation
if [ ! -e /opt/homebrew/bin/brew ]; then
echo "Installing rosetta"
# This is required for emulation of x86_64 binaries, so let's just
# assume if they didn't install brew yet, they need this
softwareupdate --install-rosetta --agree-to-license
echo "Installing homebrew"
export NONINTERACTIVE=1
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
fi
green "====== REBUILD ======"
# Test if there's no darwin-rebuild, then use nix build and then run it
if ! which darwin-rebuild &>/dev/null; then
nix build --show-trace .#darwinConfigurations."$HOST".system
./result/sw/bin/darwin-rebuild $switch_args
else
echo $switch_args
darwin-rebuild $switch_args
fi
else
green "====== REBUILD ======"
if command -v nh &>/dev/null; then
REPO_PATH=$(pwd)
export REPO_PATH
nh os switch . -- --impure --show-trace
else
sudo nixos-rebuild $switch_args
fi
fi
# shellcheck disable=SC2181
if [ $? -eq 0 ]; then
green "====== POST-REBUILD ======"
green "Rebuilt successfully"
# Check if there are any pending changes that would affect the build succeeding.
if git diff --exit-code >/dev/null && git diff --staged --exit-code >/dev/null; then
# Check if the current commit has a buildable tag
if git tag --points-at HEAD | grep -q buildable; then
yellow "Current commit is already tagged as buildable"
else
git tag buildable-"$(date +%Y%m%d%H%M%S)" -m ''
green "Tagged current commit as buildable"
fi
else
yellow "WARN: There are pending changes that would affect the build succeeding. Commit them before tagging"
fi
fi