Skip to content

Commit 94f64bf

Browse files
Prefer requested version after updates
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 646fd37 commit 94f64bf

File tree

2 files changed

+63
-6
lines changed

2 files changed

+63
-6
lines changed

src/UniGetUI.PackageEngine.Operations/PackageOperations.cs

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,10 @@ private static bool IsWinGetManager(IPackageManager manager)
166166
#endif
167167
}
168168

169-
protected async Task<IPackage> ResolveInstalledPackageSnapshotAsync(string fallbackVersion)
169+
protected async Task<IPackage> ResolveInstalledPackageSnapshotAsync(
170+
string fallbackVersion,
171+
bool preferFallbackVersionWhenMissing = false
172+
)
170173
{
171174
try
172175
{
@@ -191,6 +194,11 @@ protected async Task<IPackage> ResolveInstalledPackageSnapshotAsync(string fallb
191194
{
192195
return exactMatch;
193196
}
197+
198+
if (preferFallbackVersionWhenMissing)
199+
{
200+
return CreateSyntheticInstalledPackage(fallbackVersion);
201+
}
194202
}
195203

196204
return installedMatches
@@ -206,10 +214,15 @@ protected async Task<IPackage> ResolveInstalledPackageSnapshotAsync(string fallb
206214
Logger.Warn(ex);
207215
}
208216

217+
return CreateSyntheticInstalledPackage(fallbackVersion);
218+
}
219+
220+
private IPackage CreateSyntheticInstalledPackage(string version)
221+
{
209222
return new Package(
210223
Package.Name,
211224
Package.Id,
212-
fallbackVersion,
225+
version,
213226
Package.Source,
214227
Package.Manager,
215228
Package.OverridenOptions
@@ -312,8 +325,10 @@ protected override Task HandleFailure()
312325
protected override async Task HandleSuccess()
313326
{
314327
Package.SetTag(PackageTag.AlreadyInstalled);
328+
bool explicitVersionRequested = !string.IsNullOrWhiteSpace(Options.Version);
315329
var installedPackage = await ResolveInstalledPackageSnapshotAsync(
316-
string.IsNullOrWhiteSpace(Options.Version) ? Package.VersionString : Options.Version
330+
explicitVersionRequested ? Options.Version : Package.VersionString,
331+
preferFallbackVersionWhenMissing: explicitVersionRequested
317332
);
318333
await InstalledPackagesLoader.Instance.AddForeign(installedPackage);
319334

@@ -388,10 +403,14 @@ protected override async Task HandleSuccess()
388403
UpgradablePackagesLoader.Instance.Remove(Package);
389404
InstalledPackagesLoader.Instance.Remove(Package);
390405

406+
bool explicitVersionRequested = !string.IsNullOrWhiteSpace(Options.Version);
391407
var installedPackage = await ResolveInstalledPackageSnapshotAsync(
392-
string.IsNullOrWhiteSpace(Package.NewVersionString)
393-
? Package.VersionString
394-
: Package.NewVersionString
408+
explicitVersionRequested
409+
? Options.Version
410+
: string.IsNullOrWhiteSpace(Package.NewVersionString)
411+
? Package.VersionString
412+
: Package.NewVersionString,
413+
preferFallbackVersionWhenMissing: explicitVersionRequested
395414
);
396415
await InstalledPackagesLoader.Instance.AddForeign(installedPackage);
397416

src/UniGetUI.PackageEngine.Tests/PackageOperationsTests.cs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,44 @@ await WaitForAsync(() =>
294294
);
295295
}
296296

297+
[Fact]
298+
public async Task UpdateOperationSuccessfulRunPrefersRequestedVersionWhenSnapshotLags()
299+
{
300+
TestPackageManager? manager = null;
301+
Package? installedPackage = null;
302+
manager = new PackageManagerBuilder()
303+
.WithInstalledPackages(_ => [Assert.IsType<Package>(installedPackage)])
304+
.Build();
305+
var installedBeforeUpdate = new PackageBuilder()
306+
.WithManager(manager)
307+
.WithId("dotnetsay")
308+
.WithVersion("2.1.4")
309+
.Build();
310+
installedPackage = new PackageBuilder()
311+
.WithManager(manager)
312+
.WithId("dotnetsay")
313+
.WithVersion("2.1.4")
314+
.Build();
315+
InitializeLoaders();
316+
await InstalledPackagesLoader.Instance.AddForeign(installedBeforeUpdate);
317+
using var operation = new SimulatedUpdatePackageOperation(
318+
installedBeforeUpdate,
319+
new InstallOptions { Version = "3.0.3" },
320+
OperationVeredict.Success
321+
);
322+
323+
await operation.MainThread();
324+
await WaitForAsync(() =>
325+
InstalledPackagesLoader.Instance.GetEquivalentPackages(installedBeforeUpdate)
326+
.Any(package => package.VersionString == "3.0.3")
327+
);
328+
329+
Assert.DoesNotContain(
330+
InstalledPackagesLoader.Instance.GetEquivalentPackages(installedBeforeUpdate),
331+
package => package.VersionString == "2.1.4"
332+
);
333+
}
334+
297335
private static IReadOnlyList<AbstractOperation.InnerOperation> GetInnerOperations(
298336
AbstractOperation operation,
299337
string fieldName

0 commit comments

Comments
 (0)