PowerShell/tools/releaseToWinget.ps1
2021-04-16 14:20:32 -04:00

167 lines
4.1 KiB
PowerShell

# Copyright (c) Microsoft Corporation.
# Licensed under the MIT License.
param(
[Parameter(Mandatory)]
[semver]
$ReleaseVersion,
[Parameter()]
[string]
$WingetRepoPath = "$PSScriptRoot/../../winget-pkgs",
[Parameter()]
[string]
$FromRepository = 'rjmholt',
[Parameter()]
[string]
$GitHubToken
)
function GetMsiHash
{
param(
[Parameter(Mandatory)]
[string]
$ReleaseVersion,
[Parameter(Mandatory)]
$MsiName
)
$releaseParams = @{
Tag = "v$ReleaseVersion"
OwnerName = 'PowerShell'
RepositoryName = 'PowerShell'
}
if ($GitHubToken) { $releaseParams.AccessToken = $GitHubToken }
$releaseDescription = (Get-GitHubRelease @releaseParams).body
$regex = [regex]::new("powershell-$ReleaseVersion-win-x64.msi.*?([0-9A-F]{64})", 'SingleLine,IgnoreCase')
return $regex.Match($releaseDescription).Groups[1].Value
}
function GetThisScriptRepoUrl
{
# Find the root of the repo
$prefix = $PSScriptRoot
while ($prefix)
{
if (Test-Path "$prefix/LICENSE.txt")
{
break
}
$prefix = Split-Path $prefix
}
$stem = $PSCommandPath.Substring($prefix.Length + 1).Replace('\', '/')
return "https://github.com/PowerShell/PowerShell/blob/master/$stem"
}
function Exec
{
param([scriptblock]$sb)
& $sb
if ($LASTEXITCODE -ne 0)
{
throw "Invocation failed for '$sb'. See above errors for details"
}
}
$ErrorActionPreference = 'Stop'
$wingetPath = (Resolve-Path $WingetRepoPath).Path
# Ensure we have git and PowerShellForGitHub installed
Import-Module -Name PowerShellForGitHub
$null = Get-Command git
# Get the MSI hash from the release body
$msiName = "PowerShell-$ReleaseVersion-win-x64.msi"
$msiHash = GetMsiHash -ReleaseVersion $ReleaseVersion -MsiName $msiName
$publisherName = 'Microsoft'
# Create the manifest
$productName = if ($ReleaseVersion.PreReleaseLabel)
{
'PowerShell-Preview'
}
else
{
'PowerShell'
}
$manifestDir = Join-Path $wingetPath 'manifests' 'm' $publisherName $productName $ReleaseVersion
$manifestPath = Join-Path $manifestDir "$publisherName.$productName.yaml"
$manifestContent = @"
PackageIdentifier: $publisherName.$productName
PackageVersion: $ReleaseVersion
PackageName: $productName
Publisher: $publisherName
PackageUrl: https://microsoft.com/PowerShell
License: MIT
LicenseUrl: https://github.com/PowerShell/PowerShell/blob/master/LICENSE.txt
Moniker: $($productName.ToLower())
ShortDescription: $publisherName.$productName
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.
Tags:
- powershell
- pwsh
Homepage: https://github.com/PowerShell/PowerShell
Installers:
- Architecture: x64
InstallerUrl: https://github.com/PowerShell/PowerShell/releases/download/v$ReleaseVersion/$msiName
InstallerSha256: $msiHash
InstallerType: msi
PackageLocale: en-US
ManifestType: singleton
ManifestVersion: 1.0.0
"@
Push-Location $wingetPath
try
{
$branch = "pwsh-$ReleaseVersion"
Exec { git checkout master }
Exec { git checkout -b $branch }
New-Item -Path $manifestDir -ItemType Directory
Set-Content -Path $manifestPath -Value $manifestContent -Encoding utf8NoBOM
Exec { git add $manifestPath }
Exec { git commit -m "Add $productName $ReleaseVersion" }
Exec { git push origin $branch }
$prParams = @{
Title = "Add $productName $ReleaseVersion"
Body = "This pull request is automatically generated. See $(GetThisScriptRepoUrl)."
Head = $branch
HeadOwner = $FromRepository
Base = 'master'
Owner = 'Microsoft'
RepositoryName = 'winget-pkgs'
MaintainerCanModify = $true
}
if ($GitHubToken) { $prParams.AccessToken = $GitHubToken }
New-GitHubPullRequest @prParams
}
finally
{
git checkout master
Pop-Location
}