Skip to content

Commit

Permalink
fetch changelogs between current changelog and downloaded update
Browse files Browse the repository at this point in the history
  • Loading branch information
Aytackydln committed May 7, 2024
1 parent 920bcb5 commit 5686874
Show file tree
Hide file tree
Showing 2 changed files with 83 additions and 21 deletions.
68 changes: 58 additions & 10 deletions Project-Aurora/Aurora-Updater/Data/UpdateInfo.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.Linq;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Octokit;
using SemanticVersioning;
Expand All @@ -9,19 +10,25 @@ public class UpdateInfo(Version currentVersion, string author, string repoName,
{
private readonly GitHubClient _gClient = new(new ProductHeaderValue("aurora-updater", currentVersion.ToString()));

public async Task<Release> FetchData()
public IEnumerable<Release> FetchMissingReleases()
{
if (!getPreReleases && string.IsNullOrWhiteSpace(currentVersion.PreRelease) && !await IsCurrentlyPreRelease())
{
return await _gClient.Repository.Release.GetLatest(author, repoName);
}

var releases = await _gClient.Repository.Release.GetAll(author, repoName, new ApiOptions { PageCount = 1, PageSize = 1 });
return releases.OrderByDescending(r => r.PublishedAt).First();
return EnumeratePages()
.ToBlockingEnumerable()
.TakeWhile(IsNewerVersion);
}

private async Task<bool> IsCurrentlyPreRelease()
public async Task<bool> IsCurrentlyPreRelease()
{
// let's reduce API calls for development builds :)
if (IsDevelopmentBuild())
{
return true;
}
if (getPreReleases)
{
return true;
}

try
{
var release = await _gClient.Repository.Release.Get(author, repoName, $"v{currentVersion.Major}");
Expand All @@ -32,4 +39,45 @@ private async Task<bool> IsCurrentlyPreRelease()
return false;
}
}

private async IAsyncEnumerable<Release> EnumeratePages()
{
// we need to limit for dev builds as they have the lowest version, causing this to fetch all releases
if (IsDevelopmentBuild())
{
var lastRelease = await _gClient.Repository.Release.GetAll(author, repoName, new ApiOptions { PageCount = 1, PageSize = 3 });
//yield return lastRelease[0];
foreach (var release in lastRelease)
{
yield return release;
}
}

var page = 1;
while (page < 6) // fetch up to 5 pages
{
var releases = await GetPage(page);
foreach (var release in releases.OrderByDescending(r => r.PublishedAt))
{
yield return release;
}

page++;
}
}

private async Task<IEnumerable<Release>> GetPage(int page)
{
return await _gClient.Repository.Release.GetAll(author, repoName, new ApiOptions { PageCount = page, PageSize = 10 });
}

private bool IsNewerVersion(Release release)
{
return VersionParser.ParseVersion(release.TagName) > currentVersion;
}

private bool IsDevelopmentBuild()
{
return currentVersion is { Major: 0, Minor: 0 };
}
}
36 changes: 25 additions & 11 deletions Project-Aurora/Aurora-Updater/UpdateManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ public class UpdateManager
private int? _previousPercentage;
private int _secondsLeft = 12;

public readonly Release LatestRelease;
public readonly List<Release> MissingReleases = [];
public readonly Release LatestRelease = new("Release fetch failed");
private readonly LogEntry _downloadLogEntry = new("Download 0%");

public UpdateManager(Version version, string author, string repoName)
Expand All @@ -47,14 +48,16 @@ public UpdateManager(Version version, string author, string repoName)
}

var updateInfo = new UpdateInfo(version, author, repoName, config.GetDevReleases);
var getPreReleases = updateInfo.IsCurrentlyPreRelease().Result;

PerformCleanup();
var tries = 5;
do
var tries = 6;
while(tries-- != 0)
{
try
{
LatestRelease = updateInfo.FetchData().Result;
MissingReleases = updateInfo.FetchMissingReleases().ToList();
LatestRelease = MissingReleases.First(r => getPreReleases || !r.Prerelease);
return;
}
catch (AggregateException e)
Expand All @@ -68,9 +71,7 @@ public UpdateManager(Version version, string author, string repoName)
throw;
}
}
} while (LatestRelease == null && tries-- != 0);

LatestRelease = new Release("Release fetch failed");
}
}

public void ClearLog()
Expand All @@ -97,9 +98,7 @@ public async Task RetrieveUpdate()
{
try
{
var changelogFile = $"./changelogs/{LatestRelease.TagName}.txt";
Directory.CreateDirectory(Path.GetDirectoryName(changelogFile)!);
await File.WriteAllTextAsync(changelogFile, $"{LatestRelease.Body}");
await SaveChangelogs(MissingReleases);

var assets = LatestRelease.Assets;
var url = assets.First(s => s.Name.StartsWith("release") || s.Name.StartsWith("Aurora-v")).BrowserDownloadUrl;
Expand Down Expand Up @@ -140,6 +139,21 @@ public async Task RetrieveUpdate()
}
}

private static async Task SaveChangelogs(IEnumerable<Release> releases)
{
foreach (var release in releases)
{
await SaveChangelog(release);
}
}

private static async Task SaveChangelog(Release release)
{
var changelogFile = $"./changelogs/{release.TagName}.txt";
Directory.CreateDirectory(Path.GetDirectoryName(changelogFile)!);
await File.WriteAllTextAsync(changelogFile, $"{release.Body}");
}

private async Task UpdatePlugin(IEnumerable<ReleaseAsset> releaseAssets, WebClient client)
{
var installDirPlugin = Path.Combine(Program.ExePath, "Plugins");
Expand All @@ -160,7 +174,7 @@ private async Task UpdatePlugin(IEnumerable<ReleaseAsset> releaseAssets, WebClie
}
}

private class PluginUpdater(ReleaseAsset pluginDll, WebClient client, Uri address, ObservableCollection<LogEntry> log)
private class PluginUpdater(ReleaseAsset pluginDll, WebClient client, Uri address, ICollection<LogEntry> log)
{
internal async Task UpdatePlugin(string installDirPlugin)
{
Expand Down

0 comments on commit 5686874

Please sign in to comment.