forked from microsoft/winget-pkgs
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathWingetVersionManager.ps1
75 lines (65 loc) · 2.61 KB
/
WingetVersionManager.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#Requires -Version 5
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingWriteHost', '', Justification = 'This script is not intended to have any outputs piped')]
Param
(
[switch] $Clean,
[switch] $Prerelease,
[switch] $Latest,
[Parameter(Mandatory = $false)]
[string] $Version
)
$releasesAPIResponse = Invoke-RestMethod 'https://api.github.com/repos/microsoft/winget-cli/releases?per_page=100'
if (!$Prerelease) {
$releasesAPIResponse = $releasesAPIResponse.Where({ !$_.prerelease })
}
if ($PSBoundParameters.Keys -contains 'Version') {
$releasesAPIResponse = @($releasesAPIResponse.Where({ $_.tag_name -match $('^v?'+[regex]::escape($Version))}))
}
if ($Latest) {
$releasesAPIResponse = @($releasesAPIResponse | Select-Object -First 1)
}
if ($releasesAPIResponse.Length -lt 1) {
Write-Output 'No releases found matching criteria'
exit 1
}
$releasesAPIResponse = $releasesAPIResponse | Sort-Object -Property published_at -Descending
$assets = $releasesAPIResponse[0].assets
$shaFileUrl = $assets.Where({ $_.name -eq 'Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.txt' }).browser_download_url
$msixFileUrl = $assets.Where({ $_.name -eq 'Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle' }).browser_download_url
$releaseTag = $releasesAPIResponse[0].tag_name
Write-Host "Found $releaseTag"
if ($Clean){
Get-AppxPackage 'Microsoft.DesktopAppInstaller' | Remove-AppxPackage
}
$shaFile = New-TemporaryFile
Invoke-WebRequest -Uri $shaFileUrl -OutFile $shaFile
$sha256 = Get-Content $shaFile -Tail 1
Remove-Item $shaFile -Force
$versionFolder = Join-Path $env:LOCALAPPDATA -ChildPath "Packages\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe\bin\$releaseTag"
if (!(Test-Path $versionFolder)) {
New-Item -ItemType Directory -Path $versionFolder -Force | Out-Null
}
$existingFiles = Get-ChildItem $versionFolder -File
$msixFile = $null
foreach ($file in $existingFiles) {
if ((Get-FileHash $file.FullName).Hash.ToLower() -eq $sha256) {
$msixFile = $file
Write-Output 'Found file in local store. Skipping download'
}
}
if (!$msixFile){
$outputPath = Join-Path $versionFolder -ChildPath "winget_$releaseTag.msix"
Write-Output "Downloading version $releaseTag to $outputPath"
Invoke-WebRequest -Uri $msixFileUrl -OutFile $outputPath
$file = Get-Item $outputPath
if ((Get-FileHash $file).Hash.ToLower() -ne $sha256) {
Write-Output 'Download failed. Installer hashes do not match.'
exit 1
}
else {
$msixFile = $file
}
}
Add-AppxPackage $msixFile.FullName -ForceUpdateFromAnyVersion
Write-Output 'Checking winget version . . .'
& winget -v