8000 Add `winget` release script (#15050) · awakecoding/PowerShell@80f685f · GitHub
[go: up one dir, main page]

Skip to content

Commit 80f685f

Browse files
authored
Add winget release script (PowerShell#15050)
1 parent a562fa6 commit 80f685f

File tree

1 file changed

+166
-0
lines changed

1 file changed

+166
-0
lines changed

tools/releaseToWinget.ps1

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
# Copyright (c) Microsoft Corporation.
2+
# Licensed under the MIT License.
3+
4+
param(
5+
[Parameter(Mandatory)]
6+
[semver]
7+
$ReleaseVersion,
8+
9+
[Parameter()]
10+
[string]
11+
$WingetRepoPath = "$PSScriptRoot/../../winget-pkgs",
12+
13+
[Parameter()]
14+
[string]
15+
$FromRepository = 'rjmholt',
16+
17+
[Parameter()]
18+
[string]
19+
$GitHubToken
20+
)
21+
22+
function GetMsiHash
23+
{
24+
param(
25+
[Parameter(Mandatory)]
26+
[string]
27+
$ReleaseVersion,
28+
29+
[Parameter(Mandatory)]
30+
$MsiName
31+
)
32+
33+
$releaseParams = @{
34+
Tag = "v$ReleaseVersion"
35+
OwnerName = 'PowerShell'
36+
RepositoryName = 'PowerShell'
37+
}
38+
39+
if ($GitHubToken) { $releaseParams.AccessToken = $GitHubToken }
40+
41+
$releaseDescription = (Get-GitHubRelease @releaseParams).body
42+
43+
$regex = [regex]::new("powershell-$ReleaseVersion-win-x64.msi.*?([0-9A-F]{64})", 'SingleLine,IgnoreCase')
44+
45+
return $regex.Match($releaseDescription).Groups[1].Value
46+
}
47+
48+
function GetThisScriptRepoUrl
49+
{
50+
# Find the root of the repo
51+
$prefix = $PSScriptRoot
52+
while ($prefix)
53+
{
54+
if (Test-Path "$prefix/LICENSE.txt")
55+
{
56+
break
57+
}
58+
59+
$prefix = Split-Path $prefix
60+
}
61+
62+
$stem = $PSCommandPath.Substring($prefix.Length + 1).Replace('\', '/')
63+
64+
return "https://github.com/PowerShell/PowerShell/blob/master/$stem"
65+
}
66+
67+
function Exec
68+
{
69+
param([scriptblock]$sb)
70+
71+
& $sb
72+
73+
if ($LASTEXITCODE -ne 0)
74+
{
75+
throw "Invocation failed for '$sb'. See above errors for details"
76+
}
77+
}
78+
79+
$ErrorActionPreference = 'Stop'
80+
81+
$wingetPath = (Resolve-Path $WingetRepoPath).Path
82+
83+
# Ensure we have git and PowerShellForGitHub installed
84+
Import-Module -Name PowerShellForGitHub
85+
$null = Get-Command git
86+
87+
# Get the MSI hash from the release body
88+
$msiName = "PowerShell-$ReleaseVersion-win-x64.msi"
89+
$msiHash = GetMsiHash -ReleaseVersion $ReleaseVersion -MsiName $msiName
90+
91+
$publisherName = 'Microsoft'
92+
93+
# Create the manifest
94+
$productName = if ($ReleaseVersion.PreReleaseLabel)
95+
{
96+
'PowerShell-Preview'
97+
}
98+
else
99+
{
100+
'PowerShell'
101+
}
102+
103+
$manifestDir = Join-Path $wingetPath 'manifests' 'm' $publisherName $productName $ReleaseVersion
104+
$manifestPath = Join-Path $manifestDir "$publisherName.$productName.yaml"
105+
106+
$manifestContent = @"
107+
PackageIdentifier: $publisherName.$productName
108+
PackageVersion: $ReleaseVersion
109+
PackageName: $productName
110+
Publisher: $publisherName
111+
PackageUrl: https://microsoft.com/PowerShell
112+
License: MIT
113+
LicenseUrl: https://github.com/PowerShell/PowerShell/blob/master/LICENSE.txt
114+
Moniker: $($productName.ToLower())
115+
ShortDescription: $publisherName.$productName
116+
Description: PowerShell is a cross-platform (Windows, Linux, and macOS) automation and configuration tool/framework that works well with your existing tools and is optimized for dealing with structured data (e.g. JSON, CSV, XML, etc.), REST APIs, and object models. It includes a command-line shell, an associated scripting language and a framework for processing cmdlets.
117+
Tags:
118+
- powershell
119+
- pwsh
120+
Homepage: https://github.com/PowerShell/PowerShell
121+
Installers:
122+
- Architecture: x64
123+
InstallerUrl: https://github.com/PowerShell/PowerShell/releases/download/v$ReleaseVersion/$msiName
124+
InstallerSha256: $msiHash
125+
InstallerType: msi
126+
PackageLocale: en-US
127+
ManifestType: singleton
128+
ManifestVersion: 1.0.0
129+
130+
"@
131+
132+
Push-Location $wingetPath
133+
try
134+
{
135+
$branch = "pwsh-$ReleaseVersion"
136+
137+
Exec { git checkout master }
138+
Exec { git checkout -b $branch }
139+
140+
New-Item -Path $manifestDir -ItemType Directory
141+
Set-Content -Path $manifestPath -Value $manifestContent -Encoding utf8NoBOM
142+
143+
Exec { git add $manifestPath }
144+
Exec { git commit -m "Add $productName $ReleaseVersion" }
145+
Exec { git push origin $branch }
146+
147+
$prParams = @{
148+
Title = "Add $productName $ReleaseVersion"
149+
Body = "This pull request is automatically generated. See $(GetThisScriptRepoUrl)."
150+
Head = $branch
151+
HeadOwner = $FromRepository
152+
Base = 'master'
153+
Owner = 'Microsoft'
154+
RepositoryName = 'winget-pkgs'
155+
MaintainerCanModify = $true
156+
}
157+
158+
if ($GitHubToken) { $prParams.AccessToken = $GitHubToken }
159+
160+
New-GitHubPullRequest @prParams
161+
}
162+
finally
163+
{
164+
git checkout master
165+
Pop-Location
166+
}

0 commit comments

Comments
 (0)
0