Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/c#/GeneralUpdate.Core/Download/DownloadPlanBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ public static class DownloadPlanBuilder
public static DownloadPlan Build(IEnumerable<DownloadAsset> assets, string currentVersion)
{
if (assets == null) return DownloadPlan.Empty;
if (ParseVersion(currentVersion) == null) return DownloadPlan.Empty;

// 1. Filter out frozen packages
var active = assets
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

namespace GeneralUpdate.Core.Download;

public class UpdateInfoEventArgs(VersionRespDTO info) : EventArgs
public class UpdateInfoEventArgs(VersionRespDTO? info = null) : EventArgs
{
public VersionRespDTO Info { get; private set; } = info;
public VersionRespDTO? Info { get; private set; } = info;
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,11 @@ public async Task<DownloadReport> ExecuteAsync(
if (plan == null || !plan.HasAssets)
return new DownloadReport(Array.Empty<DownloadResult>(), 0, TimeSpan.Zero, 0, 0);

Directory.CreateDirectory(destDir);

var sw = Stopwatch.StartNew();
var results = new List<DownloadResult>();
var sem = new SemaphoreSlim(maxConcurrency);
using var sem = new SemaphoreSlim(maxConcurrency);
long totalBytes = 0;

var tasks = plan.Assets.Select(async asset =>
Expand Down
30 changes: 22 additions & 8 deletions src/c#/GeneralUpdate.Core/Strategy/ClientUpdateStrategy.cs
Original file line number Diff line number Diff line change
Expand Up @@ -172,9 +172,19 @@ private async Task ExecuteStandardWorkflowAsync(Encoding encoding, int timeout)
}

// Build process info for the upgrade process
// Convert DownloadAsset list to VersionInfo for ProcessInfo compatibility
var downloadVersions = downloadPlan.Assets.Select(a => new VersionInfo
{
Name = a.Name,
Hash = a.SHA256,
Url = a.Url,
Version = a.Version,
Format = "ZIP"
}).ToList();

_configInfo.ProcessInfo = JsonSerializer.Serialize(
ConfigurationMapper.MapToProcessInfo(
_configInfo, new List<VersionInfo>(),
_configInfo, downloadVersions,
BlackListManager.Instance.BlackFormats.ToList(),
BlackListManager.Instance.BlackFiles.ToList(),
BlackListManager.Instance.SkipDirectorys.ToList()),
Expand All @@ -185,17 +195,21 @@ private async Task ExecuteStandardWorkflowAsync(Encoding encoding, int timeout)

_osStrategy!.Create(_configInfo);

// Download via orchestrator (replaces old DownloadManager)
// Download via orchestrator
GeneralTracer.Info($"ClientUpdateStrategy: downloading {downloadPlan.Assets.Count} asset(s).");
var httpClient = new System.Net.Http.HttpClient();
try
if (_orchestrator != null)
{
var orchestrator = new Download.Orchestrators.DefaultDownloadOrchestrator(httpClient);
await orchestrator.ExecuteAsync(downloadPlan, _configInfo.TempPath).ConfigureAwait(false);
await _orchestrator.ExecuteAsync(downloadPlan, _configInfo.TempPath).ConfigureAwait(false);
}
finally
else
{
httpClient.Dispose();
var httpClient = new System.Net.Http.HttpClient();
try
{
var orchestrator = new Download.Orchestrators.DefaultDownloadOrchestrator(httpClient);
await orchestrator.ExecuteAsync(downloadPlan, _configInfo.TempPath).ConfigureAwait(false);
}
finally { httpClient.Dispose(); }
}

await SafeReportDownloadCompletedAsync(hooksCtx).ConfigureAwait(false);
Expand Down
31 changes: 23 additions & 8 deletions src/c#/GeneralUpdate.Core/Strategy/OSSUpdateStrategy.cs
Original file line number Diff line number Diff line change
Expand Up @@ -117,17 +117,32 @@ public void StartApp()

private async Task DownloadVersionsAsync(List<VersionOSS> versions)
{
var assets = versions.Select(v => new Download.Models.DownloadAsset(
Name: v.PacketName ?? v.Version ?? "unknown",
Url: v.Url ?? string.Empty,
Size: 0,
SHA256: v.Hash,
Version: v.Version ?? "0.0.0"
)).ToList();
var assets = versions.Select(v =>
{
if (string.IsNullOrWhiteSpace(v.Url))
throw new InvalidOperationException(
$"OSS version '{v.PacketName ?? v.Version}' has no download URL.");

// Use PacketName.zip as the filename to match Decompress() expectations.
// The orchestrator falls back to {Name}.{Version} when URL-based extraction fails,
// so we set Version to "zip" to produce e.g. "myapp.zip.zip".
// Better: set Name to the zip filename directly.
var zipName = $"{v.PacketName ?? v.Version}zip";
if (!zipName.EndsWith(".zip", StringComparison.OrdinalIgnoreCase))
zipName += ".zip";

return new Download.Models.DownloadAsset(
Name: zipName,
Url: v.Url,
Size: 0,
SHA256: v.Hash,
Version: v.Version ?? "0.0.0"
);
}).ToList();

var plan = new Download.Models.DownloadPlan(assets, false);

var httpClient = new System.Net.Http.HttpClient();
var httpClient = new System.Net.Http.HttpClient { Timeout = TimeSpan.FromSeconds(TimeOut) };
try
{
var orchestrator = new Download.Orchestrators.DefaultDownloadOrchestrator(httpClient);
Expand Down
Loading