Browse Source

Add PowerShell module for convenient analyzer rebuilds

Brandon Thetford 1 year ago
parent
commit
9682b4d6e9
1 changed files with 100 additions and 0 deletions
  1. 100 0
      Scripts/Terminal.Gui.PowerShell.psm1

+ 100 - 0
Scripts/Terminal.Gui.PowerShell.psm1

@@ -0,0 +1,100 @@
+Function Build-Analyzers {
+  [CmdletBinding()]
+  param(
+    [Parameter(Mandatory=$false, HelpMessage="Automatically close running Visual Studio processes which have the Terminal.sln solution loaded, before taking any other actions.")]
+    [switch]$AutoClose,
+    [Parameter(Mandatory=$false, HelpMessage="Automatically start a new Visual Studio process and load the solution after completion.")]
+    [switch]$AutoLaunch,
+    [Parameter(Mandatory=$false, HelpMessage="Carry out operations unconditionally and do not prompt for confirmation.")]
+    [switch]$Force,
+    [Parameter(Mandatory=$false, HelpMessage="Do not delete the bin and obj folders before building the analyzers.")]
+    [switch]$NoClean,
+    [Parameter(Mandatory=$false, HelpMessage="Write less text output to the terminal.")]
+    [switch]$Quiet
+  )
+  
+  if($AutoClose) {
+    if(!$Quiet) {
+      Write-Host Closing Visual Studio processes
+    }
+    Close-Solution
+  }
+
+  if($Force){
+    $response = 'Y'
+  }
+  elseif(!$Force && $NoClean){
+    $response = ($r = Read-Host "Pre-build Terminal.Gui.InternalAnalyzers without removing old build artifacts? [Y/n]") ? $r : 'Y'
+  }
+  else{
+    $response = ($r = Read-Host "Delete bin and obj folders for Terminal.Gui and Terminal.Gui.InternalAnalyzers and pre-build Terminal.Gui.InternalAnalyzers? [Y/n]") ? $r : 'Y'
+  }
+
+  if (($response -ne 'Y')) {
+    Write-Host Took no action
+    return
+  }
+  
+  New-Variable -Name solutionRoot -Visibility Public -Value (Resolve-Path ..)
+  Push-Location $solutionRoot
+  New-Variable -Name solutionFile -Visibility Public -Value (Resolve-Path ./Terminal.sln)
+  $mainProjectRoot = Resolve-Path ./Terminal.Gui
+  $mainProjectFile = Join-Path $mainProjectRoot Terminal.Gui.csproj
+  $analyzersRoot = Resolve-Path ./Analyzers
+  $internalAnalyzersProjectRoot = Join-Path $analyzersRoot Terminal.Gui.Analyzers.Internal
+  $internalAnalyzersProjectFile = Join-Path $internalAnalyzersProjectRoot Terminal.Gui.Analyzers.Internal.csproj
+  
+  if(!$NoClean) {
+    if(!$Quiet) {
+      Write-Host Deleting bin and obj folders for Terminal.Gui
+    }
+    if(Test-Path $mainProjectRoot/bin) {
+      Remove-Item -Recurse -Force $mainProjectRoot/bin
+      Remove-Item -Recurse -Force $mainProjectRoot/obj
+    }
+
+    if(!$Quiet) {
+      Write-Host Deleting bin and obj folders for Terminal.Gui.InternalAnalyzers
+    }
+    if(Test-Path $internalAnalyzersProjectRoot/bin) {
+      Remove-Item -Recurse -Force $internalAnalyzersProjectRoot/bin
+      Remove-Item -Recurse -Force $internalAnalyzersProjectRoot/obj
+    }
+  }
+  
+  if(!$Quiet) {
+    Write-Host Building analyzers in Debug configuration
+  }
+  dotnet build $internalAnalyzersProjectFile --no-incremental --nologo --force --configuration Debug
+
+  if(!$Quiet) {
+    Write-Host Building analyzers in Release configuration
+  }
+  dotnet build $internalAnalyzersProjectFile --no-incremental --nologo --force --configuration Release
+
+  if(!$AutoLaunch) {
+    Write-Host -ForegroundColor Green Finished. Restart Visual Studio for changes to take effect.
+  } else {
+    if(!$Quiet) {
+      Write-Host -ForegroundColor Green Finished. Re-loading Terminal.sln.
+    }
+    Open-Solution
+  }
+
+  return
+}
+
+Function Open-Solution {
+  Invoke-Item $solutionFile
+  return  
+}
+
+Function Close-Solution {
+  $vsProcesses = Get-Process -Name devenv | Where-Object { ($_.CommandLine -Match ".*Terminal\.sln.*" -or $_.MainWindowTitle -Match "Terminal.*") }
+  Stop-Process -InputObject $vsProcesses
+  Remove-Variable vsProcesses
+}
+
+Export-ModuleMember -Function Build-Analyzers
+Export-ModuleMember -Function Open-Solution
+Export-ModuleMember -Function Close-Solution