Functions/GenXdev.Coding/AssureGithubCLIInstalled.ps1
################################################################################ <# .SYNOPSIS Ensures GitHub CLI is properly installed and configured on the system. .DESCRIPTION Performs comprehensive checks and setup for GitHub CLI (gh): - Verifies if GitHub CLI is installed and accessible in PATH - Installs GitHub CLI via WinGet if not present - Configures system PATH environment variable - Installs GitHub Copilot extension - Sets up GitHub authentication The function handles all prerequisites and ensures a working GitHub CLI setup. .EXAMPLE AssureGithubCLIInstalled This will verify and setup GitHub CLI if needed. #> function AssureGithubCLIInstalled { [CmdletBinding()] param() begin { ######################################################################## <# .SYNOPSIS Verifies if WinGet PowerShell module is installed. .DESCRIPTION Attempts to import WinGet module and checks if it's available. .OUTPUTS System.Boolean. Returns true if WinGet is installed, false otherwise. #> function IsWinGetInstalled { try { Microsoft.PowerShell.Core\Import-Module "Microsoft.WinGet.Client" -ErrorAction Stop $module = Microsoft.PowerShell.Core\Get-Module "Microsoft.WinGet.Client" -ErrorAction Stop return $null -ne $module } catch [System.IO.FileNotFoundException] { Microsoft.PowerShell.Utility\Write-Verbose "WinGet module not found" return $false } catch { Microsoft.PowerShell.Utility\Write-Warning "Error checking WinGet installation: $_" return $false } } ######################################################################## <# .SYNOPSIS Installs the WinGet PowerShell module. .DESCRIPTION Forces installation of the Microsoft.WinGet.Client module and imports it. #> function InstallWinGet { try { Microsoft.PowerShell.Utility\Write-Verbose "Installing WinGet PowerShell client..." PowerShellGet\Install-Module "Microsoft.WinGet.Client" -Force -AllowClobber -ErrorAction Stop Microsoft.PowerShell.Core\Import-Module "Microsoft.WinGet.Client" -ErrorAction Stop } catch [System.UnauthorizedAccessException] { throw "Insufficient permissions to install WinGet module. Run as administrator: $_" } catch { throw "Failed to install WinGet module: $_" } } } process { $ErrorActionPreference = 'Stop' try { # First check and install Git if needed if (@(Microsoft.PowerShell.Core\Get-Command 'git.exe' -ErrorAction SilentlyContinue).Length -eq 0) { Microsoft.PowerShell.Utility\Write-Verbose "Git not found, installing..." if (-not (IsWinGetInstalled)) { InstallWinGet } try { $null = Microsoft.WinGet.Client\Install-WinGetPackage -Id 'Git.Git' -Force } catch { throw "Failed to install Git via WinGet: $_" } if (-not (Microsoft.PowerShell.Core\Get-Command 'git.exe' -ErrorAction SilentlyContinue)) { throw "Git installation failed: Command not found after installation" } } # Then proceed with GitHub CLI installation if (@(Microsoft.PowerShell.Core\Get-Command 'gh.exe' -ErrorAction SilentlyContinue).Length -eq 0) { Microsoft.PowerShell.Utility\Write-Verbose "GitHub CLI not found in PATH, checking installation..." $githubCliPath = "$env:ProgramFiles\GitHub CLI" $currentPath = [Environment]::GetEnvironmentVariable('PATH', 'User') if ($currentPath -notlike "*$githubCliPath*") { try { Microsoft.PowerShell.Utility\Write-Verbose "Adding GitHub CLI to PATH..." [Environment]::SetEnvironmentVariable( 'PATH', "$currentPath;$githubCliPath", 'User') $env:PATH = [Environment]::GetEnvironmentVariable('PATH', 'User') } catch [System.Security.SecurityException] { throw "Access denied while updating PATH environment variable: $_" } } if (@(Microsoft.PowerShell.Core\Get-Command 'gh.exe' -ErrorAction SilentlyContinue).Length -eq 0) { Microsoft.PowerShell.Utility\Write-Verbose "Installing GitHub CLI..." if (-not (IsWinGetInstalled)) { InstallWinGet } try { $null = Microsoft.WinGet.Client\Install-WinGetPackage -Id 'GitHub.cli' -Force } catch { throw "Failed to install GitHub CLI via WinGet: $_" } if (-not (Microsoft.PowerShell.Core\Get-Command 'gh.exe' -ErrorAction SilentlyContinue)) { throw "GitHub CLI installation failed: Command not found after installation" } try { Microsoft.PowerShell.Utility\Write-Verbose "Initiating GitHub authentication..." $null = gh auth login --web -h github.com } catch { Microsoft.PowerShell.Utility\Write-Error "GitHub authentication failed: $_" } } } } catch { $errorMessage = "Failed to setup GitHub CLI: $($_.Exception.Message)" Microsoft.PowerShell.Utility\Write-Error -Exception $_.Exception -Message $errorMessage -Category OperationStopped throw } finally { $ErrorActionPreference = 'Continue' } } end {} } ################################################################################ |