|
7 | 7 | using GeneralUpdate.Core.Event; |
8 | 8 | using GeneralUpdate.Core.Pipeline; |
9 | 9 | using GeneralUpdate.Core.Configuration; |
| 10 | +using GeneralUpdate.Core.Utilities; |
10 | 11 |
|
11 | 12 | using GeneralUpdate.Core.Hooks; |
12 | 13 | using IUpdateReporter = GeneralUpdate.Core.Download.Reporting.IUpdateReporter; |
@@ -146,8 +147,25 @@ public virtual async Task ExecuteAsync() |
146 | 147 | AllPackagesSucceeded = true; |
147 | 148 | var status = ReportType.None; |
148 | 149 | patchRoot = StorageManager.GetTempDirectory(Patchs); |
| 150 | + |
| 151 | + // Track the highest version already applied via full-package fallback, |
| 152 | + // so subsequent chain packages covered by that version are skipped. |
| 153 | + SemVersion? fallbackEffectiveVersion = null; |
| 154 | + |
149 | 155 | foreach (var version in _configinfo.UpdateVersions) |
150 | 156 | { |
| 157 | + // When a previous chain package fell back to a full package, |
| 158 | + // the application is already at or beyond that full version. |
| 159 | + // Skip any remaining chain packages whose version is ≤ the |
| 160 | + // fallback version — applying them would be redundant. |
| 161 | + if (fallbackEffectiveVersion != null |
| 162 | + && version.PackageType == (int)PackageType.Chain |
| 163 | + && Semver.TryParse(version.Version, out var versionSv) |
| 164 | + && versionSv <= fallbackEffectiveVersion) |
| 165 | + { |
| 166 | + GeneralTracer.Info($"AbstractStrategy.ExecuteAsync: skipping {version.Version} ({version.Name}) — already covered by fallback full package v{fallbackEffectiveVersion}."); |
| 167 | + continue; |
| 168 | + } |
151 | 169 | try |
152 | 170 | { |
153 | 171 | // Use a version-specific subdirectory under patchRoot so that |
@@ -193,6 +211,14 @@ public virtual async Task ExecuteAsync() |
193 | 211 | var fallbackBuilder = BuildPipeline(fallbackContext); |
194 | 212 | await fallbackBuilder.Build(); |
195 | 213 | status = ReportType.Success; |
| 214 | + // Record the fallback full package version so subsequent |
| 215 | + // chain packages ≤ this version are skipped. |
| 216 | + if (!string.IsNullOrEmpty(version.FallbackFullVersion) |
| 217 | + && Semver.TryParse(version.FallbackFullVersion, out var ffv) |
| 218 | + && (fallbackEffectiveVersion == null || ffv > fallbackEffectiveVersion)) |
| 219 | + { |
| 220 | + fallbackEffectiveVersion = ffv; |
| 221 | + } |
196 | 222 | } |
197 | 223 | catch (Exception e) |
198 | 224 | { |
|
0 commit comments