authorgravatar for git@paperclover.netclover caruso <git@paperclover.net> 2026-10-03 20:06:49-07:00
committergravatar for git@paperclover.netclover caruso <git@paperclover.net> 2026-10-03 20:06:49-07:00
logdeb927dd7d9de43008be824c5dcc52c0166bbe2c
treefbae407f58f166a629b421689806698c749b8841
parent57e9d717f734ef177e65c95f155a8a125f0da42d
parent8ae4895a8ff02e7ee0c7e506cc0488f2b353d8cf
signature Signed by SSH key SHA256:52mNGHRsVFBDED9IAX5pe+LRWUefqTbxEReunq21QvU

Merge the first-boot deployment fix into the infrastructure cutover

Keep infra-2 as the main tree while preserving the retired home-infra history. Assisted-by: gpt-6

2 files changed, 14 insertions(+), 0 deletions(-)

tools/dashboard-deploy-test.py+12
......@@ -173,6 +173,18 @@ class DeploymentBoundary(unittest.TestCase):
173173 self.assertEqual(self.call("deploy.run", id=identity), {"lines": ["legacy", "\ufffd"], "code": 0})
174174 executed.assert_not_called()
175175
176 def test_first_activation_exposes_current_before_starting_host_units(self):
177 (self.root / "current").unlink()
178
179 def execute(argv, **kwargs):
180 if argv[:2] == ["nixos-rebuild", "switch"]:
181 self.assertEqual((self.root / "current").resolve(), self.snapshot)
182 return subprocess.CompletedProcess(argv, 0, stdout='"leader"', stderr="")
183
184 with patch.object(release.subprocess, "run", side_effect=execute):
185 self.assertIsNone(release.activate(self.version, initial=True))
186 self.assertEqual(release.current_release(), self.version)
187
176188 def test_state_reads_reject_symlinks_and_large_files(self):
177189 source = self.root / "fixture"
178190 source.write_bytes(b"x" * 200)
tools/release.py+2
......@@ -158,6 +158,8 @@ def activate(release, legacy=False, initial=False):
158158 print(result.stdout.strip(), flush=True)
159159 backup = result.stdout.split("backup=", 1)[1].split()[0]
160160 if old_digest != digest:
161 if current is None:
162 (ROOT / "current").symlink_to(path)
161163 subprocess.run(["nixos-rebuild", "switch", "--flake", f"path:{path}#{configuration}"], check=True)
162164 next_link = ROOT / ("next-" + release)
163165 next_link.unlink(missing_ok=True)