summaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rwxr-xr-xscripts/build.sh100
-rw-r--r--scripts/npins_to_unflake.jq34
-rwxr-xr-xscripts/unflake.sh9
-rwxr-xr-xscripts/why-depends56
4 files changed, 199 insertions, 0 deletions
diff --git a/scripts/build.sh b/scripts/build.sh
new file mode 100755
index 00000000..6c3d2461
--- /dev/null
+++ b/scripts/build.sh
@@ -0,0 +1,100 @@
+#! /usr/bin/env sh
+set -eu
+
+build_system() {
+ host="$1"
+
+ show_trace_arg=""
+ if [ "$show_trace" = true ]; then
+ show_trace_arg="--show-trace"
+ fi
+
+ _val="$(nix build ".#nixosConfigurations.$host.config.system.build.toplevel" --print-out-paths --no-link --option max-jobs 1 $show_trace_arg)"
+ exit_val="$?"
+
+ if [ "$exit_val" -ne 0 ]; then
+ echo "ERROR: Failed to build you system config for host: '$host'" 1>&2
+ printf 1
+ else
+ printf "%s" "$_val"
+ fi
+}
+remove_symlink() {
+ link="$1"
+ if [ -L "$link" ]; then
+ rm "$link"
+ elif ! [ -e "$link" ]; then
+ : "Not existing file is also okay"
+ else
+ echo "ERROR: '$link' is not a symlink. Not removing it." 1>&2
+ exit 1
+ fi
+}
+
+root="$(git rev-parse --show-toplevel)"
+use_dirty=true
+show_trace=false
+
+while [ "$#" -ne 0 ]; do
+ case "$1" in
+ --dirty)
+ use_dirty=true
+ ;;
+ --clean)
+ use_dirty=false
+ ;;
+ --show-trace)
+ show_trace=true
+ ;;
+ --* | -*)
+ echo "arg '$1' is not known."
+ exit 2
+ ;;
+ *)
+ # We reached the hosts
+ break
+ ;;
+ esac
+ shift 1
+done
+
+if [ "$#" -eq 0 ]; then
+ # shellcheck disable=SC2046
+ set -- $(ls "$root/hosts/by-name")
+fi
+
+if [ "$use_dirty" = "false" ]; then
+ tmp="$(mktemp -d -t "server_build_script_XXXXX")"
+ trap 'rm -r "$tmp"' EXIT
+
+ git archive --format=tar.gz HEAD | {
+ cd "$tmp"
+ tar -xz
+ }
+
+ cd "$tmp"
+fi
+
+for host in "$@"; do
+ system="$(build_system "$host")"
+ [ "$system" = "1" ] && exit 1
+
+ result_link="$root/result-$host"
+ remove_symlink "$result_link"
+ nix-store --add-root "$result_link" --realise "$(readlink -f "$system")"
+
+ # Try to also provide an easy link for potential home manager outputs.
+ fd "home-manager-\w*.service" "$result_link/etc/systemd/system" | while read -r hm; do
+ home_generation_link="$(grep ExecStart= "$hm" | awk '{print $2}')"
+ user_name="$(basename "$hm" | sed 's/home-manager-\(.*\)\.service/\1/')"
+ home_link="$root/result-$host-hm-$user_name"
+
+ remove_symlink "$home_link"
+ ln --symbolic "$home_generation_link" "$home_link"
+ done
+
+ if [ "$host" = "$(hostname)" ]; then
+ nvd diff /run/current-system "$result_link"
+ fi
+done
+# vim: ft=sh
diff --git a/scripts/npins_to_unflake.jq b/scripts/npins_to_unflake.jq
new file mode 100644
index 00000000..80e6b5a3
--- /dev/null
+++ b/scripts/npins_to_unflake.jq
@@ -0,0 +1,34 @@
+def make_url(value):
+ value.repository as $repo |
+ if value.type == "Git" then
+ if $repo.type == "Git" then
+ "git+\($repo.url)?ref=\(value.branch)"
+ elif $repo.type == "GitHub" then
+ "github:\($repo.owner)/\($repo.repo)/\(value.branch)"
+ elif $repo.type == "Forgejo" then
+ "git+\($repo.server)/\($repo.owner)/\($repo.repo)?ref=\(value.branch)"
+ else
+ error("Invalid repository type: '\($repo.type)'")
+ end
+ elif value.type == "GitRelease" then
+ if $repo.type == "GitHub" then
+ "github:\($repo.owner)/\($repo.repo)/\(value.version)"
+ else
+ error("Invalid repository type: '\($repo.type)'")
+ end
+ elif value.type == "Channel" then
+ empty
+ else
+ error("Invalid value type: '\(value.type)'")
+ end
+ ;
+
+"{
+\(
+ .pins | to_entries | map(
+ " \"\(.key)\" = {
+ url = \"\(make_url(.value))\";
+ };"
+ ) | join("\n")
+ )
+}"
diff --git a/scripts/unflake.sh b/scripts/unflake.sh
new file mode 100755
index 00000000..faaa5336
--- /dev/null
+++ b/scripts/unflake.sh
@@ -0,0 +1,9 @@
+#! /usr/bin/env sh
+
+set -e
+
+NIX_CONFIG="${NIX_CONFIG-pure-eval = false}"
+export NIX_CONFIG
+nix run -f https://codeberg.org/goldstein/unflake/archive/main.tar.gz unflake -- "$@"
+
+# vim: ft=sh
diff --git a/scripts/why-depends b/scripts/why-depends
new file mode 100755
index 00000000..ae1ac6f7
--- /dev/null
+++ b/scripts/why-depends
@@ -0,0 +1,56 @@
+#! /usr/bin/env sh
+
+main() {
+ use_running="$1"
+ host="$2"
+ package="$3"
+
+ if [ "$use_running" = "true" ]; then
+ base="/run/current-system"
+ else
+ base=".#nixosConfigurations.$host.config.system.build.toplevel"
+ fi
+
+ fd "[a-zA-Z0-9]{32}-$package" /nix/store --type directory --threads 1 --exec nix --option warn-dirty false why-depends "$base"
+}
+
+running=false
+host="$(hostname)"
+packages=""
+direct_packages=""
+
+while [ "$#" -ne 0 ]; do
+ case "$1" in
+ "--running")
+ running=true
+ ;;
+ "--host")
+ shift 1
+ host="$1"
+ ;;
+ "--direct")
+ shift 1
+ direct_packages="$direct_packages $1"
+ ;;
+ *)
+ # Treat everything else as a package to check
+ packages="$packages $1"
+ ;;
+ esac
+
+ shift 1
+done
+
+if [ -n "$packages" ]; then
+ for package in $packages; do
+ main "$running" "$host" "$package-"
+ done
+fi
+
+if [ -n "$direct_packages" ]; then
+ for package in $direct_packages; do
+ main "$running" "$host" "$package-[0-9]"
+ done
+fi
+
+# vim: ft=sh