Files
OmniNX-Installer-Payload/desktop/OmniNX.DesktopInstaller/Services/VersionDetectService.cs
T
niklascfw 91133f7098
Build / Build (push) Successful in 13s
Build Desktop Installer / Build (win-arm64) (push) Successful in 10s
Build Desktop Installer / Build (win-x64) (push) Successful in 10s
Desktop installer: release channel, saved choices, robust delete, logs
- Channel radio (Release / Master (Instabil)); master installs the
  rolling 'master' release from OmniNX/OmniNX-Master. Preselected from
  release_channel in the card's manifest.ini.
- Variant, RAM (8gb) and Hekate-Pro choice are prefilled from the card
  (manifest.ini / config.ini) like the payload does, instead of
  silently switching users back to 4 GB / Standard.
- Clear read-only attributes before deleting folders.
- Remove leftover "OmniNX <Variant>" pack folders after installing.
- Create empty folders from the pack.
- Save every run's log to %LocalAppData%\OmniNX-Desktop-Installer\logs,
  plus a "Save log" button.
2026-11-14 13:10:41 +01:00

86 lines
2.8 KiB
C#

using OmniNX.DesktopInstaller.Models;
namespace OmniNX.DesktopInstaller.Services;
public sealed class VersionDetectService
{
private const string ManifestRelative = @"config\omninx\manifest.ini";
public OmniNxStatus DetectInstallation(string driveRoot)
{
var manifest = PathUtils.ToDrivePath(driveRoot, ManifestRelative);
if (!File.Exists(manifest))
return new OmniNxStatus { IsInstalled = false, Variant = OmniNxVariant.None };
var variant = OmniNxVariant.None;
var version = string.Empty;
var channel = ReleaseChannel.Release;
var inSection = false;
foreach (var rawLine in File.ReadLines(manifest))
{
var line = rawLine.Trim();
if (line.StartsWith('[') && line.EndsWith(']'))
{
inSection = line[1..^1].Equals("OmniNX", StringComparison.Ordinal);
continue;
}
if (!inSection || !line.Contains('='))
continue;
var eq = line.IndexOf('=');
var key = line[..eq].Trim();
var val = line[(eq + 1)..].Trim();
if (key.Equals("current_pack", StringComparison.Ordinal))
variant = VariantHelper.ParsePackName(val);
else if (key.Equals("version", StringComparison.Ordinal))
version = val;
else if (key.Equals("release_channel", StringComparison.Ordinal))
channel = val.Equals("master", StringComparison.OrdinalIgnoreCase)
? ReleaseChannel.Master
: ReleaseChannel.Release;
}
return new OmniNxStatus
{
IsInstalled = variant != OmniNxVariant.None,
Variant = variant,
Version = version,
Channel = channel,
};
}
public InstallMode DetermineMode(OmniNxStatus status, bool forceClean)
{
if (forceClean)
return InstallMode.Clean;
return status.IsInstalled ? InstallMode.Update : InstallMode.Clean;
}
}
public static class DriveService
{
public sealed record DriveItem(DriveInfo Drive)
{
public override string ToString() => FormatDriveLabel(Drive);
}
public static IReadOnlyList<DriveItem> GetCandidateDrives()
{
return DriveInfo.GetDrives()
.Where(d => d.IsReady && d.DriveType == DriveType.Removable)
.OrderBy(d => d.Name)
.Select(d => new DriveItem(d))
.ToList();
}
public static string FormatDriveLabel(DriveInfo drive)
{
var label = string.IsNullOrWhiteSpace(drive.VolumeLabel) ? "No Label" : drive.VolumeLabel;
var sizeGb = drive.TotalSize / (1024.0 * 1024 * 1024);
return $"{drive.Name} [{label}] ({sizeGb:F1} GB, {drive.DriveFormat})";
}
}