11using System . Diagnostics ;
2+ using System . Net ;
23using System . Net . Http . Headers ;
34using System . Text . Json ;
45using System . Text . Json . Serialization ;
@@ -13,10 +14,8 @@ namespace UniGetUI.Avalonia.Views.Pages;
1314
1415public partial class ReleaseNotesWindow : Window
1516{
16- private readonly string _releaseNotesUrl =
17- $ "https://github.com/Devolutions/UniGetUI/releases/tag/{ CoreData . VersionName } ";
18- private readonly string _releaseNotesApiUrl =
19- $ "https://api.github.com/repos/Devolutions/UniGetUI/releases/tags/{ Uri . EscapeDataString ( CoreData . VersionName ) } ";
17+ private readonly string [ ] _releaseNotesTags = CoreData . GetGitHubReleaseTagCandidates ( ) ;
18+ private readonly string _releaseNotesUrl = CoreData . GetGitHubReleasePageUrl ( ) ;
2019
2120 private bool _hasLoadedReleaseNotes ;
2221
@@ -66,6 +65,7 @@ private async void ReleaseNotesWindow_OnOpened(object? sender, EventArgs e)
6665 private async Task LoadReleaseNotesAsync ( )
6766 {
6867 SetLoadingState ( isLoading : true ) ;
68+ string ? lastAttemptedApiUrl = null ;
6969
7070 try
7171 {
@@ -75,37 +75,51 @@ private async Task LoadReleaseNotesAsync()
7575 ) ;
7676 client . DefaultRequestHeaders . Accept . ParseAdd ( "application/vnd.github+json" ) ;
7777
78- using HttpResponseMessage response = await client . GetAsync ( _releaseNotesApiUrl ) ;
79- if ( ! response . IsSuccessStatusCode )
78+ foreach ( string releaseTag in _releaseNotesTags )
8079 {
81- throw new HttpRequestException (
82- $ "GitHub API returned status code { ( int ) response . StatusCode } ({ response . StatusCode } )."
80+ lastAttemptedApiUrl = CoreData . GetGitHubReleaseApiUrlFromTag ( releaseTag ) ;
81+
82+ using HttpResponseMessage response = await client . GetAsync ( lastAttemptedApiUrl ) ;
83+ if ( response . StatusCode == HttpStatusCode . NotFound )
84+ {
85+ continue ;
86+ }
87+
88+ if ( ! response . IsSuccessStatusCode )
89+ {
90+ throw new HttpRequestException (
91+ $ "GitHub API returned status code { ( int ) response . StatusCode } ({ response . StatusCode } )."
92+ ) ;
93+ }
94+
95+ await using Stream responseStream = await response . Content . ReadAsStreamAsync ( ) ;
96+ GitHubReleaseResponse ? release = await JsonSerializer . DeserializeAsync < GitHubReleaseResponse > (
97+ responseStream ,
98+ SerializationHelpers . DefaultOptions
8399 ) ;
84- }
85100
86- await using Stream responseStream = await response . Content . ReadAsStreamAsync ( ) ;
87- GitHubReleaseResponse ? release = await JsonSerializer . DeserializeAsync < GitHubReleaseResponse > (
88- responseStream ,
89- SerializationHelpers . DefaultOptions
90- ) ;
101+ string releaseBody = string . IsNullOrWhiteSpace ( release ? . Body )
102+ ? CoreTools . Translate ( "Please try again later" )
103+ : release . Body . Replace ( "\r \n " , "\n " ) . Trim ( ) ;
91104
92- string releaseBody = string . IsNullOrWhiteSpace ( release ? . Body )
93- ? CoreTools . Translate ( "Please try again later" )
94- : release . Body . Replace ( " \r \n " , " \n " ) . Trim ( ) ;
105+ UrlTextBoxControl . Text = string . IsNullOrWhiteSpace ( release ? . HtmlUrl )
106+ ? CoreData . GetGitHubReleasePageUrlFromTag ( releaseTag )
107+ : release . HtmlUrl ;
95108
96- if ( ! string . IsNullOrWhiteSpace ( release ? . HtmlUrl ) )
97- {
98- UrlTextBoxControl . Text = release . HtmlUrl ;
109+ ReleaseNotesTextBlockControl . Text = releaseBody ;
110+ StatusBlockControl . IsVisible = false ;
111+ RetryButtonControl . IsVisible = false ;
112+ LoadingProgressBarControl . IsVisible = false ;
113+ return ;
99114 }
100115
101- ReleaseNotesTextBlockControl . Text = releaseBody ;
102- StatusBlockControl . IsVisible = false ;
103- RetryButtonControl . IsVisible = false ;
104- LoadingProgressBarControl . IsVisible = false ;
116+ throw new HttpRequestException (
117+ $ "GitHub API returned 404 for all known release tags for version { CoreData . VersionName } ."
118+ ) ;
105119 }
106120 catch ( Exception ex )
107121 {
108- Logger . Error ( $ "Failed to load release notes from { _releaseNotesApiUrl } ") ;
122+ Logger . Error ( $ "Failed to load release notes from { lastAttemptedApiUrl ?? _releaseNotesUrl } ") ;
109123 Logger . Error ( ex ) ;
110124
111125 ReleaseNotesTextBlockControl . Text = string . Empty ;
0 commit comments