@@ -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
238286Function 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