From 5d40b43dd9423a7c9153abfe2966c654f5b08c8f Mon Sep 17 00:00:00 2001 From: alexion Date: Tue, 15 Sep 2026 21:16:30 -0400 Subject: [PATCH] fix(nixos): avoid redundant deploy closure transfers --- .../shell/fish/functions/deploy-to.fish | 71 +++++++++++-------- 1 file changed, 40 insertions(+), 31 deletions(-) diff --git a/configs/nixos/modules/shell/fish/functions/deploy-to.fish b/configs/nixos/modules/shell/fish/functions/deploy-to.fish index 4e3c043..d4f4b52 100644 --- a/configs/nixos/modules/shell/fish/functions/deploy-to.fish +++ b/configs/nixos/modules/shell/fish/functions/deploy-to.fish @@ -34,43 +34,52 @@ if test (count $system_path) -ne 1 return 1 end -set nar_file (mktemp --suffix=.nar) -or return $status -set remote_nar "/tmp/deploy-to-$host-"(date +%s)"-$fish_pid.nar" - set closure_paths (nix-store -qR $system_path) or begin - set query_status $status - rm -f $nar_file echo "deploy-to: closure query failed for $host" >&2 - return $query_status -end - -echo "deploy-to: exporting closure for $system_path" >&2 -nix-store --export $closure_paths >$nar_file -or begin - set export_status $status - rm -f $nar_file - echo "deploy-to: closure export failed for $host" >&2 - return $export_status -end - -echo "deploy-to: copying closure archive to $host:$remote_nar" >&2 -scp $nar_file $host:$remote_nar -set scp_status $status -rm -f $nar_file -if test $scp_status -ne 0 - echo "deploy-to: closure archive copy failed for $host" >&2 - return $scp_status -end - -echo "deploy-to: importing closure on $host" >&2 -ssh -t $host "sudo sh -c 'nix-store --import < $remote_nar' && rm -f $remote_nar" -or begin - echo "deploy-to: closure import failed for $host" >&2 return $status end +echo "deploy-to: checking which closure paths $host is missing" >&2 +set missing_paths (printf '%s\n' $closure_paths | ssh $host 'xargs -r nix-store --check-validity --print-invalid') +or begin + echo "deploy-to: remote closure check failed for $host" >&2 + return $status +end + +if test (count $missing_paths) -gt 0 + set nar_file (mktemp --suffix=.nar) + or return $status + set remote_nar "/tmp/deploy-to-$host-"(date +%s)"-$fish_pid.nar" + + echo "deploy-to: exporting "(count $missing_paths)" missing closure paths for $system_path" >&2 + nix-store --export $missing_paths >$nar_file + or begin + set export_status $status + rm -f $nar_file + echo "deploy-to: closure export failed for $host" >&2 + return $export_status + end + + echo "deploy-to: copying closure archive to $host:$remote_nar" >&2 + scp $nar_file $host:$remote_nar + set scp_status $status + rm -f $nar_file + if test $scp_status -ne 0 + echo "deploy-to: closure archive copy failed for $host" >&2 + return $scp_status + end + + echo "deploy-to: importing closure on $host" >&2 + ssh -t $host "sudo sh -c 'nix-store --import < $remote_nar' && rm -f $remote_nar" + or begin + echo "deploy-to: closure import failed for $host" >&2 + return $status + end +else + echo "deploy-to: $host already has the full closure for $system_path" >&2 +end + echo "deploy-to: activating $system_path on $host" >&2 ssh -t $host sudo "$system_path/bin/switch-to-configuration" switch or begin