You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
125 lines
5.4 KiB
125 lines
5.4 KiB
20 hours ago
|
function Test-WinUtilPackageManager {
|
||
|
<#
|
||
|
|
||
|
.SYNOPSIS
|
||
|
Checks if Winget is installed
|
||
|
|
||
|
.PARAMETER winget
|
||
|
Check if Winget is installed
|
||
|
|
||
|
#>
|
||
|
|
||
|
Param(
|
||
|
[System.Management.Automation.SwitchParameter]$winget
|
||
|
)
|
||
|
|
||
|
$status = "not-installed"
|
||
|
|
||
|
if ($winget) {
|
||
|
# Check if Winget is available while getting it's Version if it's available
|
||
|
$wingetExists = $true
|
||
|
try {
|
||
|
$wingetVersionFull = winget --version
|
||
|
} catch [System.Management.Automation.CommandNotFoundException], [System.Management.Automation.ApplicationFailedException] {
|
||
|
Write-Warning "Winget was not found due to un-availablity reasons"
|
||
|
$wingetExists = $false
|
||
|
} catch {
|
||
|
Write-Warning "Winget was not found due to un-known reasons, The Stack Trace is:`n$($psitem.Exception.StackTrace)"
|
||
|
$wingetExists = $false
|
||
|
}
|
||
|
|
||
|
# If Winget is available, Parse it's Version and give proper information to Terminal Output.
|
||
|
# If it isn't available, the return of this funtion will be "not-installed", indicating that
|
||
|
# Winget isn't installed/available on The System.
|
||
|
if ($wingetExists) {
|
||
|
# Check if Preview Version
|
||
|
if ($wingetVersionFull.Contains("-preview")) {
|
||
|
$wingetVersion = $wingetVersionFull.Trim("-preview")
|
||
|
$wingetPreview = $true
|
||
|
} else {
|
||
|
$wingetVersion = $wingetVersionFull
|
||
|
$wingetPreview = $false
|
||
|
}
|
||
|
|
||
|
# Check if Winget's Version is too old.
|
||
|
$wingetCurrentVersion = [System.Version]::Parse($wingetVersion.Trim('v'))
|
||
|
# Grabs the latest release of Winget from the Github API for version check process.
|
||
|
$response = Invoke-RestMethod -Uri "https://api.github.com/repos/microsoft/Winget-cli/releases/latest" -Method Get -ErrorAction Stop
|
||
|
$wingetLatestVersion = [System.Version]::Parse(($response.tag_name).Trim('v')) #Stores version number of latest release.
|
||
|
$wingetOutdated = $wingetCurrentVersion -lt $wingetLatestVersion
|
||
|
Write-Host "===========================================" -ForegroundColor Green
|
||
|
Write-Host "--- Winget is installed ---" -ForegroundColor Green
|
||
|
Write-Host "===========================================" -ForegroundColor Green
|
||
|
Write-Host "Version: $wingetVersionFull" -ForegroundColor White
|
||
|
|
||
|
if (!$wingetPreview) {
|
||
|
Write-Host " - Winget is a release version." -ForegroundColor Green
|
||
|
} else {
|
||
|
Write-Host " - Winget is a preview version. Unexpected problems may occur." -ForegroundColor Yellow
|
||
|
}
|
||
|
|
||
|
if (!$wingetOutdated) {
|
||
|
Write-Host " - Winget is Up to Date" -ForegroundColor Green
|
||
|
$status = "installed"
|
||
|
}
|
||
|
else {
|
||
|
Write-Host " - Winget is Out of Date" -ForegroundColor Red
|
||
|
$status = "outdated"
|
||
|
}
|
||
|
} else {
|
||
|
Write-Host "===========================================" -ForegroundColor Red
|
||
|
Write-Host "--- Winget is not installed ---" -ForegroundColor Red
|
||
|
Write-Host "===========================================" -ForegroundColor Red
|
||
|
$status = "not-installed"
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $status
|
||
|
}
|
||
|
|
||
|
function ConfirmBaseRun {
|
||
|
$isWingetInstalled = Test-WinUtilPackageManager -winget
|
||
|
|
||
|
if (!($isWingetInstalled -eq "installed")) {
|
||
|
Write-Warning "!!! Winget is not installed."
|
||
|
|
||
|
Write-Host "You haven't run the base.ps1 script yet. Please visit https://learncodethehardway.com/setup/installers.html for more."
|
||
|
|
||
|
Exit
|
||
|
}
|
||
|
}
|
||
|
|
||
|
ConfirmBaseRun
|
||
|
|
||
|
$odinPath = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath("$env:APPDATA\..\Local\Programs\Odin")
|
||
|
|
||
|
if(Test-Path -Path $odinPath) {
|
||
|
Write-Warning "#=========================================================#"
|
||
|
Write-Warning "!! The directory $odinPath already exists, which means"
|
||
|
Write-Warning "!! you already have odin installed. Here's the version:"
|
||
|
cat "$odinPath\mingw64\version_info.txt"
|
||
|
Write-Warning "#=========================================================#"
|
||
|
Write-Warning "Here's the version that Winget will install:"
|
||
|
winget search odin-lang.Odin
|
||
|
Write-Warning "--- If you want me to replace your install with this version, then stop and"
|
||
|
Write-Warning "delete the $odinPath directory before hitting ENTER to continue."
|
||
|
Write-Warning "!!! If you do NOT want to replace this directory then hit CTRL-C now."
|
||
|
Read-Host -Prompt "Press any key to continue, or CTRL-C to abort" | Out-Null
|
||
|
}
|
||
|
|
||
|
Write-Warning "!! Installing Odin in $odinPath"
|
||
|
Write-Warning "This has to be installed this way because winget won't add it to the path so I have to do it manually. If you don't want this, then hit CTRL-C and install Odin yourself."
|
||
|
Read-Host -Prompt "Press any key to continue, or CTRL-C to abort" | Out-Null
|
||
|
|
||
|
winget install --location "$odinPath" -e odin-lang.Odin
|
||
|
|
||
|
if($env:PATH.contains($odinPath)) {
|
||
|
Write-Warning "!! Detected $odinPath in your PATH. Will not update your PATH."
|
||
|
Write-Warning "!! This is probably because you already installed it. You'll have"
|
||
|
Write-Warning "!! to manually remove this part of your path if you want to change it."
|
||
|
Write-Warning "!! But, it will probably still work since that's where I installed it."
|
||
|
} else {
|
||
|
$newPath = $env:PATH + ";$odinPath"
|
||
|
[Environment]::SetEnvironmentVariable("Path", $newPath, "User")
|
||
|
}
|