forked from vedantmgoyal9/winget-releaser
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathaction.yml
More file actions
141 lines (136 loc) · 6.65 KB
/
action.yml
File metadata and controls
141 lines (136 loc) · 6.65 KB
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
name: WinGet Releaser
description: Publish new releases of your application to Windows Package Manager easily.
author: vedantmgoyal9 (Vedant)
inputs:
identifier:
description: The `PackageIdentifier` of the app in WinGet.
required: true
version:
description: The `PackageVersion` of the application. Defaults to the release tag, excluding the 'v' prefix.
required: false
installers-regex:
description: A regular expression to match Windows installers/binaries from GitHub release artifacts.
required: true
default: '.(exe|msi|msix|appx)(bundle){0,1}$'
max-versions-to-keep:
description: The maximum number of versions of the package to keep in WinGet. If after the current release, the number of versions exceeds this limit, the oldest versions will be deleted. Leave unset for unlimited.
required: true
default: '0'
release-repository:
description: The repository where the release is located.
required: true
default: ${{ github.event.repository.name }}
release-tag:
description: The tag of the GitHub release you want to publish to WinGet.
required: true
default: ${{ github.event.release.tag_name || github.ref_name }}
release-notes-url:
description: URL to the package version's release notes.
required: false
token:
description: GitHub token to create PR at winget-pkgs. The token should have a `public_repo` scope.
required: true
fork-user:
description: The GitHub user where winget-pkgs fork is present. This fork will be used to create the PR at the WinGet Community Repository.
required: true
default: ${{ github.repository_owner }}
runs:
using: composite
steps:
- run: |
# check if at least one version of the package is already present in winget-pkgs repository
$ErrorActionPreference = 'SilentlyContinue'
$PkgId = '${{ inputs.identifier }}'
Invoke-WebRequest -Uri "https://github.com/microsoft/winget-pkgs/tree/master/manifests/$($PkgId.ToLower()[0])\$($PkgId.Replace('.', '/'))" -Method Head
if (-not $?) {
Write-Output "::error::Package $PkgId does not exist in the winget-pkgs repository. Please add atleast one version of the package before using this action."
exit 1
}
shell: pwsh
- run: |
# check if max-versions-to-keep is a valid number and is 0 (keep all versions) or greater than 0
$MaxVersionsToKeep = '${{ inputs.max-versions-to-keep }}'
if (-not [int]::TryParse($MaxVersionsToKeep, [ref]$null) -or $MaxVersionsToKeep -lt 0) {
Write-Output "::error::Invalid input: max-versions-to-keep should be 0 (zero - keep all versions) or a POSITIVE INTEGER."
exit 1
}
shell: pwsh
- uses: cargo-bins/cargo-binstall@main
env:
GITHUB_TOKEN: ${{ github.token }}
- run: cargo-binstall komac -y
env:
GITHUB_TOKEN: ${{ github.token }}
shell: pwsh
- run: |
# get release information
$ReleaseInfo = Invoke-RestMethod `
-Uri 'https://api.github.com/repos/${{ github.repository_owner }}/${{ inputs.release-repository }}/releases/tags/${{ inputs.release-tag }}' `
-Headers @{ Authorization = "token $env:GITHUB_TOKEN" }
If ('' -eq '${{ inputs.version }}') {
Write-Output "version=$($ReleaseInfo.tag_name -replace '^v')" >> $env:GITHUB_OUTPUT
} Else {
Write-Output "version=${{ inputs.version }}" >> $env:GITHUB_OUTPUT
}
Write-Output "urls=$($ReleaseInfo.assets.Where({ $_.name -match '${{ inputs.installers-regex }}' }).browser_download_url -join ' ')" >> $env:GITHUB_OUTPUT
env:
GITHUB_TOKEN: ${{ github.token }}
id: version-and-urls
shell: pwsh
- run: komac sync-fork
env:
KOMAC_FORK_OWNER: ${{ inputs.fork-user }}
GITHUB_TOKEN: ${{ inputs.token }}
shell: pwsh
- run: |
$ReplaceFlag = $Null
$ReleaseNotesUrlFlag = $Null
if (${{ inputs.max-versions-to-keep }} -eq 1) {
$ReplaceFlag = "--replace"
}
if (-not [string]::IsNullOrEmpty('${{ inputs.release-notes-url }}')) {
# multiple arguments should be provided as an array of strings to ensure powershell passes them to komac correctly
$ReleaseNotesUrlFlag = @('--release-notes-url', '${{ inputs.release-notes-url }}')
}
komac update '${{ inputs.identifier }}' --version '${{ steps.version-and-urls.outputs.version }}' $ReplaceFlag $ReleaseNotesUrlFlag --submit --urls ${{ steps.version-and-urls.outputs.urls }}
env:
KOMAC_FORK_OWNER: ${{ inputs.fork-user }}
KOMAC_CREATED_WITH: WinGet Releaser
KOMAC_CREATED_WITH_URL: ${{ github.server_url }}/${{ github.action_repository }}
GITHUB_TOKEN: ${{ inputs.token }}
shell: pwsh
- run: 'komac cleanup --only-merged # clean up stale branches (for which PRs have been merged)'
env:
KOMAC_FORK_OWNER: ${{ inputs.fork-user }}
GITHUB_TOKEN: ${{ inputs.token }}
shell: pwsh
- if: fromJSON(inputs.max-versions-to-keep) > 0 # https://docs.github.com/en/actions/learn-github-actions/expressions
run: |
# delete previous versions w.r.t. max-versions-to-keep (if any)
$ToNatural = { [regex]::Replace($_, '\d+', { $args[0].Value.PadLeft(20) }) }
#[Issue #307] -NoEnumerate has been added so that $Versions does not get converted to a string, when only one version exists in winget-pkgs
$Versions = $(komac list-versions '${{ inputs.identifier }}' --json | ConvertFrom-Json -NoEnumerate) | Sort-Object $ToNatural -Descending
$Reason = 'This version is older than what has been set in `max-versions-to-keep` by the publisher.'
# Prevents replaced version from being deleted
if (${{ inputs.max-versions-to-keep }} -eq 1) {
$Versions = $Versions | Select-Object -SkipLast 1
}
If ($Versions.Count + 1 -gt ${{ inputs.max-versions-to-keep }}) {
$VersionsToDelete = $Versions[(${{ inputs.max-versions-to-keep }} - 1)..($Versions.Count - 1)]
Write-Output "Versions to delete: $($VersionsToDelete -join ', ')"
ForEach ($Version in $VersionsToDelete) {
Write-Output "Deleting version: $Version"
komac remove '${{ inputs.identifier }}' --version $Version --reason "$Reason" --submit
}
} Else {
Write-Output "No versions to delete. All good :)"
}
env:
KOMAC_FORK_OWNER: ${{ inputs.fork-user }}
KOMAC_CREATED_WITH: WinGet Releaser
KOMAC_CREATED_WITH_URL: ${{ github.server_url }}/${{ github.action_repository }}
GITHUB_TOKEN: ${{ inputs.token }}
shell: pwsh
branding:
color: blue
icon: package