Skip to content

Commit 2dfb6b9

Browse files
jeffhandleyCopilot
andcommitted
Discover next version by probing feed instead of hardcoded progression
Replace GetNextVersion (which hardcoded preview.7 → rc.1, rc.2 → ga) with GetNextVersionFromFeed that queries the NuGet feed to find the actual next milestone. This handles any number of previews or RCs without assumptions about the release cadence. When no newer version exists on the same major, the function probes the next major version's feed automatically. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 070634b commit 2dfb6b9

File tree

1 file changed

+79
-23
lines changed

1 file changed

+79
-23
lines changed

release-notes/RunApiDiff.ps1

Lines changed: 79 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -207,32 +207,80 @@ Function FindLatestApiDiff {
207207
Return ($entries | Sort-Object { $_.SortKey } | Select-Object -Last 1)
208208
}
209209

210-
## Given a version milestone, return the next one in the progression
211-
## preview.1 → preview.2 → ... → preview.7 → rc.1 → rc.2 → ga → {next major}.0 preview.1
212-
Function GetNextVersion {
210+
## Probe the NuGet feed to find the next version after a given milestone
211+
Function GetNextVersionFromFeed {
213212
Param (
214213
[string] $majorMinor,
215-
[string] $prereleaseLabel
214+
[string] $prereleaseLabel,
215+
[string] $feedUrl
216216
)
217-
$parsed = ParsePrereleaseLabel $prereleaseLabel
218-
$kind = $parsed.ReleaseKind
219-
$number = [int]$parsed.PreviewRCNumber
220217

221-
If ($kind -eq "preview" -and $number -lt 7) {
222-
Return @{ MajorMinor = $majorMinor; PrereleaseLabel = "preview.$($number + 1)" }
218+
$currentParsed = ParsePrereleaseLabel $prereleaseLabel
219+
$currentWeight = GetMilestoneSortWeight $currentParsed.ReleaseKind ([int]$currentParsed.PreviewRCNumber)
220+
221+
$serviceIndex = Invoke-RestMethod -Uri $feedUrl
222+
$flatContainer = $serviceIndex.resources | Where-Object { $_.'@type' -match 'PackageBaseAddress' } | Select-Object -First 1
223+
If (-not $flatContainer) { Return $null }
224+
225+
$baseUrl = $flatContainer.'@id'
226+
$versionsUrl = "${baseUrl}microsoft.netcore.app.ref/index.json"
227+
228+
try {
229+
$versionsResult = Invoke-RestMethod -Uri $versionsUrl
230+
}
231+
catch { Return $null }
232+
233+
If (-not $versionsResult.versions -or $versionsResult.versions.Count -eq 0) { Return $null }
234+
235+
# Find versions for the same MajorMinor that come after the current milestone
236+
$candidates = @()
237+
ForEach ($v in $versionsResult.versions) {
238+
$parsed = $null
239+
try { $parsed = ParseVersionString $v "probe" } catch { Continue }
240+
If ($parsed.MajorMinor -ne $majorMinor) { Continue }
241+
242+
$milestoneParsed = ParsePrereleaseLabel $parsed.PrereleaseLabel
243+
$weight = GetMilestoneSortWeight $milestoneParsed.ReleaseKind ([int]$milestoneParsed.PreviewRCNumber)
244+
If ($weight -gt $currentWeight) {
245+
$candidates += @{ MajorMinor = $parsed.MajorMinor; PrereleaseLabel = $parsed.PrereleaseLabel; Weight = $weight }
246+
}
223247
}
224-
If ($kind -eq "preview") {
225-
Return @{ MajorMinor = $majorMinor; PrereleaseLabel = "rc.1" }
248+
249+
If ($candidates.Count -gt 0) {
250+
Return ($candidates | Sort-Object { $_.Weight } | Select-Object -First 1)
226251
}
227-
If ($kind -eq "rc" -and $number -lt 2) {
228-
Return @{ MajorMinor = $majorMinor; PrereleaseLabel = "rc.$($number + 1)" }
252+
253+
# No newer milestone found on the same major — try the next major's feed
254+
$nextMajor = [int]($majorMinor.Split(".")[0]) + 1
255+
$nextMajorMinor = "$nextMajor.0"
256+
$nextFeedUrl = "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet${nextMajor}/nuget/v3/index.json"
257+
258+
Write-Color cyan "No newer milestone found for $majorMinor on feed. Probing next major feed for $nextMajorMinor..."
259+
260+
try {
261+
$nextServiceIndex = Invoke-RestMethod -Uri $nextFeedUrl
262+
$nextFlatContainer = $nextServiceIndex.resources | Where-Object { $_.'@type' -match 'PackageBaseAddress' } | Select-Object -First 1
263+
If (-not $nextFlatContainer) { Return $null }
264+
265+
$nextBaseUrl = $nextFlatContainer.'@id'
266+
$nextVersionsUrl = "${nextBaseUrl}microsoft.netcore.app.ref/index.json"
267+
$nextVersionsResult = Invoke-RestMethod -Uri $nextVersionsUrl
268+
269+
If ($nextVersionsResult.versions -and $nextVersionsResult.versions.Count -gt 0) {
270+
ForEach ($v in $nextVersionsResult.versions) {
271+
$parsed = $null
272+
try { $parsed = ParseVersionString $v "probe" } catch { Continue }
273+
If ($parsed.MajorMinor -eq $nextMajorMinor) {
274+
Return @{ MajorMinor = $parsed.MajorMinor; PrereleaseLabel = $parsed.PrereleaseLabel }
275+
}
276+
}
277+
}
229278
}
230-
If ($kind -eq "rc") {
231-
Return @{ MajorMinor = $majorMinor; PrereleaseLabel = "" }
279+
catch {
280+
Write-Color yellow "Could not probe next major feed: $_"
232281
}
233-
# GA → next major preview.1
234-
$major = [int]($majorMinor.Split(".")[0])
235-
Return @{ MajorMinor = "$($major + 1).0"; PrereleaseLabel = "preview.1" }
282+
283+
Return $null
236284
}
237285

238286
Function DiscoverVersionFromFeed {
@@ -950,11 +998,19 @@ If ([System.String]::IsNullOrWhiteSpace($CurrentMajorMinor) -and [System.String]
950998
$latestDesc = If ($latestApiDiff.PrereleaseLabel) { "$($latestApiDiff.MajorMinor)-$($latestApiDiff.PrereleaseLabel)" } Else { "$($latestApiDiff.MajorMinor) GA" }
951999
Write-Color cyan "Latest existing api-diff: $latestDesc"
9521000

953-
$next = GetNextVersion $latestApiDiff.MajorMinor $latestApiDiff.PrereleaseLabel
954-
$CurrentMajorMinor = $next.MajorMinor
955-
$CurrentPrereleaseLabel = $next.PrereleaseLabel
956-
$nextDesc = If ($CurrentPrereleaseLabel) { "$CurrentMajorMinor-$CurrentPrereleaseLabel" } Else { "$CurrentMajorMinor GA" }
957-
Write-Color green "Inferred current version: $nextDesc"
1001+
# Probe the feed for the next version after the latest api-diff
1002+
$latestMajorVersion = $latestApiDiff.MajorMinor.Split(".")[0]
1003+
$probeFeedUrl = "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet${latestMajorVersion}/nuget/v3/index.json"
1004+
$next = GetNextVersionFromFeed $latestApiDiff.MajorMinor $latestApiDiff.PrereleaseLabel $probeFeedUrl
1005+
1006+
If ($next) {
1007+
$CurrentMajorMinor = $next.MajorMinor
1008+
$CurrentPrereleaseLabel = $next.PrereleaseLabel
1009+
$nextDesc = If ($CurrentPrereleaseLabel) { "$CurrentMajorMinor-$CurrentPrereleaseLabel" } Else { "$CurrentMajorMinor GA" }
1010+
Write-Color green "Discovered next version from feed: $nextDesc"
1011+
} Else {
1012+
Write-Error "Could not discover the next version from feed '$probeFeedUrl' after $latestDesc. Specify -CurrentMajorMinor and -CurrentPrereleaseLabel explicitly." -ErrorAction Stop
1013+
}
9581014

9591015
# Also infer previous from the latest api-diff if not explicitly provided
9601016
If ([System.String]::IsNullOrWhiteSpace($PreviousMajorMinor) -and [System.String]::IsNullOrWhiteSpace($PreviousPrereleaseLabel) -and [System.String]::IsNullOrWhiteSpace($PreviousVersion)) {

0 commit comments

Comments
 (0)