From afb2d1be6510e23fd7198ce427044a8416ebaef8 Mon Sep 17 00:00:00 2001
From: Manuel Thalmann <m@nuth.ch>
Date: Wed, 31 Jul 2024 16:09:50 +0200
Subject: [PATCH] Implement the windows installation in a loop

---
 scripts/Windows/OS/Install.ps1          | 54 +++++++++++++++----------
 scripts/Windows/Scripts/SetupConfig.ps1 | 19 +++++++++
 2 files changed, 51 insertions(+), 22 deletions(-)

diff --git a/scripts/Windows/OS/Install.ps1 b/scripts/Windows/OS/Install.ps1
index 75c019e2..d6477522 100644
--- a/scripts/Windows/OS/Install.ps1
+++ b/scripts/Windows/OS/Install.ps1
@@ -11,38 +11,48 @@
 . "$PSScriptRoot/../Scripts/SetupConfig.ps1";
 . "$PSScriptRoot/../Software/Firefox/Install.ps1";
 
+<#
+    Finishes the installation of a running Windows machine.
+#>
 function Start-WindowsInstallation {
+    Start-InstallationLoop;
+}
+
+<#
+    .SYNOPSIS
+    Starts the installation loop.
+#>
+function Start-InstallationLoop {
     . "$PSScriptRoot/../Scripts/Choco.ps1";
     . "$PSScriptRoot/../Scripts/Hooks.ps1";
     . "$PSScriptRoot/../Scripts/PowerManagement.ps1";
     . "$PSScriptRoot/../Scripts/SetupConfig.ps1";
 
     while (-not (Get-IsFinished)) {
+        switch (Get-Stage) {
+            $null {
+                Invoke-Hook "Start-Initialization" -Fallback {
+                    if (-not ((Get-Command "choco") -and (Get-Command "refreshenv"))) {
+                        # Install chocolatey
+                        [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072;
+                        Invoke-Expression ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'));
+                        Import-Module $env:ChocolateyInstall/helpers/chocolateyProfile.psm1;
+                        refreshenv;
+                    }
 
-    }
-    switch (Get-Stage) {
-        $null {
-            Invoke-Hook "Start-Initialization" -Fallback {
-                if (-not ((Get-Command "choco") -and (Get-Command "refreshenv"))) {
-                    # Install chocolatey
-                    [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072;
-                    Invoke-Expression ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'));
-                    Import-Module $env:ChocolateyInstall/helpers/chocolateyProfile.psm1;
-                    refreshenv;
-                }
+                    if (-not (Test-ChocoSoftware "powershell-core")) {
+                        choco install -y powershell-core --install-arguments='"ADD_FILE_CONTEXT_MENU_RUNPOWERSHELL=1 ADD_EXPLORER_CONTEXT_MENU_OPENPOWERSHELL=1 REGISTER_MANIFEST=1 USER_MU=1 ENABLE_MU=1"';
+                        Restart-Intermediate;
+                        return;
+                    }
 
-                if (-not (Test-ChocoSoftware "powershell-core")) {
-                    choco install -y powershell-core --install-arguments='"ADD_FILE_CONTEXT_MENU_RUNPOWERSHELL=1 ADD_EXPLORER_CONTEXT_MENU_OPENPOWERSHELL=1 REGISTER_MANIFEST=1 USER_MU=1 ENABLE_MU=1"';
-                    Restart-Intermediate;
-                    return;
-                }
-
-                if (Test-Path $env:PWSH_PATH) {
-                    Remove-Item -Recurse $env:PWSH_PATH;
-                }
-            };
+                    if (Test-Path $env:PWSH_PATH) {
+                        Remove-Item -Recurse $env:PWSH_PATH;
+                    }
+                };
+            }
+            Default {}
         }
-        Default {}
     }
 }
 
diff --git a/scripts/Windows/Scripts/SetupConfig.ps1 b/scripts/Windows/Scripts/SetupConfig.ps1
index 1ac2ab3d..439e7305 100644
--- a/scripts/Windows/Scripts/SetupConfig.ps1
+++ b/scripts/Windows/Scripts/SetupConfig.ps1
@@ -5,6 +5,7 @@ using namespace System.Security.Principal;
 $null = New-Module {
     [string] $configRoot = "HKLM:\Software\PortValhalla";
     [string] $stageOption = "Stage";
+    [string] $finishedOption = "Finished";
     [RegistryKey] $key = $null;
 
     <#
@@ -99,4 +100,22 @@ $null = New-Module {
 
         $null = Set-SetupOption $stageOption $Name;
     }
+
+    <#
+        .SYNOPSIS
+        Gets a value indicating whether the setup has finished.
+    #>
+    function Get-IsFinished {
+        return [bool] (Get-SetupOption $finishedOption);
+    }
+
+    <#
+        .SYNOPSIS
+        Sets a value indicating whether the setup has finished.
+    #>
+    function Set-IsFinished {
+        param(
+            $Value
+        )
+    }
 }