107 lines
3.0 KiB
Bash
Executable File
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
|