1
0
Fork 0
mirror of https://github.com/LnL7/nix-darwin.git synced 2025-03-31 04:04:45 +00:00
nix-darwin/pkgs/nix-tools/darwin-rebuild.sh

209 lines
5.4 KiB
Bash
Raw Normal View History

2016-12-12 17:34:43 +01:00
#! @shell@
set -e
set -o pipefail
export PATH=@path@:$PATH
showSyntax() {
echo "darwin-rebuild [--help] {edit | switch | activate | build | check | changelog}" >&2
echo " [--list-generations] [{--profile-name | -p} name] [--rollback]" >&2
echo " [{--switch-generation | -G} generation] [--verbose...] [-v...]" >&2
echo " [-Q] [{--max-jobs | -j} number] [--cores number] [--dry-run]" >&1
echo " [--keep-going] [-k] [--keep-failed] [-K] [--fallback] [--show-trace]" >&2
echo " [-I path] [--option name value] [--arg name value] [--argstr name value]" >&2
2020-10-18 17:45:17 +02:00
echo " [--flake flake] [--update-input input flake] [--impure] [--recreate-lock-file]"
echo " [--no-update-lock-file] ..." >&2
2016-12-15 21:52:53 +01:00
exec man darwin-rebuild
exit 1
2016-12-12 17:34:43 +01:00
}
# Parse the command line.
origArgs=("$@")
2016-12-20 00:05:01 +01:00
extraBuildFlags=()
extraLockFlags=()
extraProfileFlags=()
2016-12-20 00:05:01 +01:00
profile=@profile@
2016-12-12 17:34:43 +01:00
action=
flake=
2016-12-12 17:34:43 +01:00
while [ $# -gt 0 ]; do
2019-06-05 21:35:58 +02:00
i=$1; shift 1
case $i in
2016-12-15 21:52:53 +01:00
--help)
showSyntax
;;
edit|switch|activate|build|check|changelog)
2019-06-05 21:35:58 +02:00
action=$i
2016-12-15 21:52:53 +01:00
;;
2017-01-10 21:41:18 +01:00
--show-trace|--no-build-hook|--dry-run|--keep-going|-k|--keep-failed|-K|--verbose|-v|-vv|-vvv|-vvvv|-vvvvv|--fallback|-Q)
2016-12-20 00:05:01 +01:00
extraBuildFlags+=("$i")
;;
-j[0-9]*)
extraBuildFlags+=("$i")
;;
2016-12-20 00:05:01 +01:00
--max-jobs|-j|--cores|-I)
if [ $# -lt 1 ]; then
echo "$0: '$i' requires an argument"
2016-12-20 00:05:01 +01:00
exit 1
fi
2019-06-05 21:35:58 +02:00
j=$1; shift 1
2016-12-20 00:05:01 +01:00
extraBuildFlags+=("$i" "$j")
;;
--arg|--argstr|--option)
if [ $# -lt 2 ]; then
echo "$0: '$i' requires two arguments"
2016-12-20 00:05:01 +01:00
exit 1
fi
2019-06-05 21:35:58 +02:00
j=$1
k=$2
shift 2
2016-12-20 00:05:01 +01:00
extraBuildFlags+=("$i" "$j" "$k")
;;
--flake)
flake=$1
shift 1
;;
2020-10-18 17:55:08 +02:00
-L|-vL|--print-build-logs|--impure|--recreate-lock-file|--no-update-lock-file|--no-write-lock-file|--no-registries|--commit-lock-file)
extraLockFlags+=("$i")
;;
--update-input)
j="$1"; shift 1
extraLockFlags+=("$i" "$j")
;;
--override-input)
j="$1"; shift 1
k="$1"; shift 1
extraLockFlags+=("$i" "$j" "$k")
;;
--list-generations)
action="list"
extraProfileFlags=("$i")
;;
--rollback)
action="rollback"
extraProfileFlags=("$i")
;;
--switch-generation|-G)
action="rollback"
if [ $# -lt 1 ]; then
echo "$0: '$i' requires an argument"
exit 1
fi
2019-06-05 21:35:58 +02:00
j=$1; shift 1
extraProfileFlags=("$i" "$j")
;;
2016-12-20 00:05:01 +01:00
--profile-name|-p)
if [ -z "$1" ]; then
echo "$0: '$i' requires an argument"
2016-12-20 00:05:01 +01:00
exit 1
fi
if [ "$1" != system ]; then
profile="/nix/var/nix/profiles/system-profiles/$1"
mkdir -p -m 0755 "$(dirname "$profile")"
fi
shift 1
;;
2016-12-15 21:52:53 +01:00
*)
echo "$0: unknown option '$i'"
2016-12-15 21:52:53 +01:00
exit 1
;;
esac
2016-12-12 17:34:43 +01:00
done
if [ -z "$action" ]; then showSyntax; fi
flakeFlags=(--experimental-features 'nix-command flakes')
if [ -n "$flake" ]; then
if [[ $flake =~ ^(.*)\#([^\#\"]*)$ ]]; then
flake="${BASH_REMATCH[1]}"
flakeAttr="${BASH_REMATCH[2]}"
fi
if [ -z "$flakeAttr" ]; then
flakeAttr=$(hostname)
fi
flakeAttr=darwinConfigurations.${flakeAttr%.local}
fi
if [ -n "$flake" ]; then
if nix "${flakeFlags[@]}" flake metadata --version &>/dev/null; then
cmd=metadata
else
cmd=info
fi
flake=$(nix "${flakeFlags[@]}" flake "$cmd" --json "${extraBuildFlags[@]}" "${extraLockFlags[@]}" -- "$flake" | jq -r .url)
fi
if [ "$action" != build ] && [ -z "$flake" ]; then
extraBuildFlags+=("--no-out-link")
fi
if [ "$action" = edit ]; then
darwinConfig=$(nix-instantiate --find-file darwin-config)
if [ -z "$flake" ]; then
exec "${EDITOR:-vi}" "$darwinConfig"
else
exec nix "${flakeFlags[@]}" edit "${extraLockFlags[@]}" -- "$flake#$flakeAttr"
fi
fi
if [ "$action" = switch ] || [ "$action" = build ] || [ "$action" = check ]; then
echo "building the system configuration..." >&2
if [ -z "$flake" ]; then
systemConfig="$(nix-build '<darwin>' "${extraBuildFlags[@]}" -A system)"
else
nix "${flakeFlags[@]}" build "$flake#$flakeAttr.system" "${extraBuildFlags[@]}" "${extraLockFlags[@]}"
systemConfig=$(readlink -f result)
fi
2016-12-12 17:34:43 +01:00
fi
if [ "$action" = list ] || [ "$action" = rollback ]; then
if [ "$USER" != root ] && [ ! -w $(dirname "$profile") ]; then
2019-06-05 21:35:58 +02:00
sudo nix-env -p "$profile" "${extraProfileFlags[@]}"
else
2019-06-05 21:35:58 +02:00
nix-env -p "$profile" "${extraProfileFlags[@]}"
fi
fi
2019-07-01 22:42:44 +02:00
if [ "$action" = rollback ]; then
systemConfig="$(cat $profile/systemConfig)"
fi
if [ "$action" = activate ]; then
systemConfig=$(readlink -f "${0%*/sw/bin/darwin-rebuild}")
fi
2016-12-22 23:25:32 +01:00
if [ -z "$systemConfig" ]; then exit 0; fi
2016-12-12 17:34:43 +01:00
if [ "$action" = switch ]; then
if [ "$USER" != root ] && [ ! -w $(dirname "$profile") ]; then
2019-06-05 21:35:58 +02:00
sudo nix-env -p "$profile" --set "$systemConfig"
2016-12-15 21:52:53 +01:00
else
2019-06-05 21:35:58 +02:00
nix-env -p "$profile" --set "$systemConfig"
2016-12-15 21:52:53 +01:00
fi
fi
if [ "$action" = switch ] || [ "$action" = activate ] || [ "$action" = rollback ]; then
2019-06-05 21:35:58 +02:00
"$systemConfig/activate-user"
2016-12-15 21:52:53 +01:00
if [ "$USER" != root ]; then
2019-06-05 21:35:58 +02:00
sudo "$systemConfig/activate"
2016-12-15 21:52:53 +01:00
else
2019-06-05 21:35:58 +02:00
"$systemConfig/activate"
2016-12-15 21:52:53 +01:00
fi
2016-12-12 17:34:43 +01:00
fi
2017-07-23 18:02:08 +02:00
2017-07-24 23:08:26 +02:00
if [ "$action" = changelog ]; then
echo >&2
echo "CHANGELOG" >&2
echo >&2
2019-06-05 21:35:58 +02:00
head -n 32 "$systemConfig/darwin-changes"
2017-07-24 23:08:26 +02:00
echo >&2
fi
2017-07-23 18:02:08 +02:00
if [ "$action" = check ]; then
2017-07-24 23:08:26 +02:00
export checkActivation=1
2019-06-05 21:35:58 +02:00
"$systemConfig/activate-user"
2017-07-23 18:02:08 +02:00
fi