feat(installer): replace sync ModeDetector with async InstallModeDetector
Placeholder edit to App.xaml.cs to keep the project building until Task 11 wires the new async detector. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
41
src/ClaudeDo.Installer/Core/InstallModeDetector.cs
Normal file
41
src/ClaudeDo.Installer/Core/InstallModeDetector.cs
Normal file
@@ -0,0 +1,41 @@
|
||||
namespace ClaudeDo.Installer.Core;
|
||||
|
||||
public sealed record DetectedState(
|
||||
InstallerMode Mode,
|
||||
InstallManifest? Existing,
|
||||
GiteaRelease? LatestRelease,
|
||||
string? LatestVersion);
|
||||
|
||||
public sealed class InstallModeDetector
|
||||
{
|
||||
private readonly IReleaseClient _releases;
|
||||
|
||||
public InstallModeDetector(IReleaseClient releases)
|
||||
{
|
||||
_releases = releases;
|
||||
}
|
||||
|
||||
public async Task<DetectedState> DetectAsync(string installDir, CancellationToken ct)
|
||||
{
|
||||
var manifest = InstallManifestStore.TryRead(installDir);
|
||||
if (manifest is null)
|
||||
return new DetectedState(InstallerMode.FreshInstall, null, null, null);
|
||||
|
||||
var release = await _releases.GetLatestReleaseAsync(ct);
|
||||
if (release is null)
|
||||
return new DetectedState(InstallerMode.Config, manifest, null, null);
|
||||
|
||||
var latestVersion = release.TagName.TrimStart('v', 'V');
|
||||
if (IsNewer(latestVersion, manifest.Version))
|
||||
return new DetectedState(InstallerMode.Update, manifest, release, latestVersion);
|
||||
|
||||
return new DetectedState(InstallerMode.Config, manifest, release, latestVersion);
|
||||
}
|
||||
|
||||
private static bool IsNewer(string latest, string current)
|
||||
{
|
||||
if (!Version.TryParse(latest, out var lv)) return false;
|
||||
if (!Version.TryParse(current, out var cv)) return false;
|
||||
return lv > cv;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user