Skip to content

Commit 647c81b

Browse files
committed
Do not uninstall NuGet package from shared solution repository if it is still referenced by another project.
1 parent 9a7010a commit 647c81b

File tree

4 files changed

+77
-19
lines changed

4 files changed

+77
-19
lines changed

src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageRepository.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ public void AddPackage(IPackage package)
3131
public void RemovePackage(IPackage package)
3232
{
3333
IsRemovePackageCalled = true;
34+
FakePackages.Remove(package as FakePackage);
3435
}
3536

3637
public string Source { get; set; }

src/AddIns/Misc/PackageManagement/Project/Src/SharpDevelopPackageManager.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,15 @@ public override void InstallPackage(IPackage package, bool ignoreDependencies)
8585
public override void UninstallPackage(IPackage package, bool forceRemove, bool removeDependencies)
8686
{
8787
ProjectManager.RemovePackageReference(package.Id, forceRemove, removeDependencies);
88-
base.UninstallPackage(package, forceRemove, removeDependencies);
88+
if (!IsPackageReferencedByOtherProjects(package)) {
89+
base.UninstallPackage(package, forceRemove, removeDependencies);
90+
}
91+
}
92+
93+
bool IsPackageReferencedByOtherProjects(IPackage package)
94+
{
95+
var sharedRepository = LocalRepository as ISharedPackageRepository;
96+
return sharedRepository.IsReferenced(package.Id, package.Version);
8997
}
9098

9199
public IEnumerable<PackageOperation> GetInstallPackageOperations(IPackage package, bool ignoreDependencies)

src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeSharedPackageRepository.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
33

44
using System;
5+
using System.Collections.Generic;
56
using System.Linq;
67
using ICSharpCode.PackageManagement.Design;
78
using NuGet;
@@ -12,9 +13,15 @@ public class FakeSharedPackageRepository : FakePackageRepository, ISharedPackage
1213
{
1314
public string PathPassedToRegisterRepository;
1415

16+
public List<string> PackageIdsReferences = new List<string>();
17+
public string PackageIdPassedToIsReferenced;
18+
public Version VersionPassedToIsReferenced;
19+
1520
public bool IsReferenced(string packageId, Version version)
1621
{
17-
throw new NotImplementedException();
22+
PackageIdPassedToIsReferenced = packageId;
23+
VersionPassedToIsReferenced = version;
24+
return PackageIdsReferences.Contains(packageId);
1825
}
1926

2027
public void RegisterRepository(string path)

src/AddIns/Misc/PackageManagement/Test/Src/SharpDevelopPackageManagerTests.cs

Lines changed: 59 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ FakePackage UninstallPackageAndRemoveDependencies()
168168

169169
PackageOperation CreateOneInstallPackageOperation()
170170
{
171-
var package = CreateFakePackage();
171+
FakePackage package = CreateFakePackage();
172172
package.Id = "PackageToInstall";
173173

174174
return new PackageOperation(package, PackageAction.Install);
@@ -253,7 +253,7 @@ public void ProjectManager_InstanceCreated_PathResolverIsPackageManagerPathResol
253253
public void InstallPackage_PackageInstancePassed_AddsReferenceToProject()
254254
{
255255
CreatePackageManager();
256-
var package = InstallPackage();
256+
FakePackage package = InstallPackage();
257257

258258
Assert.AreEqual(package, testableProjectManager.PackagePassedToAddPackageReference);
259259
}
@@ -325,7 +325,7 @@ public void InstallPackage_PackageDependenciesIgnored_AddsReferenceToPackage()
325325
{
326326
CreatePackageManager();
327327
CreateTestableProjectManager();
328-
var package = InstallPackageAndIgnoreDependencies();
328+
FakePackage package = InstallPackageAndIgnoreDependencies();
329329

330330
Assert.AreEqual(package, testableProjectManager.PackagePassedToAddPackageReference);
331331
}
@@ -345,7 +345,7 @@ public void InstallPackage_PackageDependenciesNotIgnored_AddsReferenceToPackage(
345345
{
346346
CreatePackageManager();
347347
CreateTestableProjectManager();
348-
var package = InstallPackageAndDoNotIgnoreDependencies();
348+
FakePackage package = InstallPackageAndDoNotIgnoreDependencies();
349349

350350
Assert.AreEqual(package, testableProjectManager.PackagePassedToAddPackageReference);
351351
}
@@ -355,7 +355,7 @@ public void UninstallPackage_PackageInProjectLocalRepository_RemovesReferenceFro
355355
{
356356
CreatePackageManager();
357357
CreateTestableProjectManager();
358-
var package = UninstallPackage();
358+
FakePackage package = UninstallPackage();
359359

360360
Assert.AreEqual(package.Id, testableProjectManager.PackagePassedToRemovePackageReference.Id);
361361
}
@@ -422,14 +422,56 @@ public void UninstallPackage_ProjectLocalRepositoryHasPackage_PackageRemovedFrom
422422
Assert.AreEqual("Test", packageRemovedFromProject.Id);
423423
}
424424

425+
[Test]
426+
public void UninstallPackage_PackageReferencedByNoProjects_PackageIsRemovedFromSharedSolutionRepository()
427+
{
428+
CreatePackageManager();
429+
CreateTestableProjectManager();
430+
431+
FakePackage package = CreateFakePackage();
432+
package.Id = "MyPackageId";
433+
434+
testableProjectManager.FakeLocalRepository.FakePackages.Add(package);
435+
fakeSolutionSharedRepository.FakePackages.Add(package);
436+
437+
packageManager.UninstallPackage(package);
438+
439+
bool containsPackage = fakeSolutionSharedRepository.FakePackages.Contains(package);
440+
441+
Assert.IsFalse(containsPackage);
442+
}
443+
444+
[Test]
445+
public void UninstallPackage_PackageReferencedByTwoProjects_PackageIsNotRemovedFromSharedSolutionRepository()
446+
{
447+
CreatePackageManager();
448+
CreateTestableProjectManager();
449+
450+
FakePackage package = CreateFakePackage();
451+
package.Id = "MyPackageId";
452+
package.Version = new Version("1.4.5.2");
453+
454+
testableProjectManager.FakeLocalRepository.FakePackages.Add(package);
455+
fakeSolutionSharedRepository.FakePackages.Add(package);
456+
fakeSolutionSharedRepository.PackageIdsReferences.Add("MyPackageId");
457+
458+
packageManager.UninstallPackage(package);
459+
460+
bool containsPackage = fakeSolutionSharedRepository.FakePackages.Contains(package);
461+
462+
Assert.IsTrue(containsPackage);
463+
Assert.AreEqual("MyPackageId", fakeSolutionSharedRepository.PackageIdPassedToIsReferenced);
464+
Assert.AreEqual(package.Version, fakeSolutionSharedRepository.VersionPassedToIsReferenced);
465+
}
466+
425467
[Test]
426468
public void GetInstallPackageOperations_PackageOperationResolverFactoryUsed_PackageOperationsReturnedFromPackageOperationsResolverCreated()
427469
{
428470
CreatePackageManager();
429471
var package = new FakePackage();
430-
var operations = GetInstallPackageOperations(package);
472+
IEnumerable<PackageOperation> operations = GetInstallPackageOperations(package);
431473

432-
var expectedOperations = fakePackageOperationResolverFactory.FakeInstallPackageOperationResolver.PackageOperations;
474+
IEnumerable<PackageOperation> expectedOperations = fakePackageOperationResolverFactory.FakeInstallPackageOperationResolver.PackageOperations;
433475

434476
Assert.AreEqual(expectedOperations, operations);
435477
}
@@ -441,8 +483,8 @@ public void GetInstallPackageOperations_PackageOperationResolverFactoryUsed_Pack
441483
var package = new FakePackage();
442484
GetInstallPackageOperations(package);
443485

444-
var expectedRepository = packageManager.LocalRepository;
445-
var actualRepository = fakePackageOperationResolverFactory.LocalRepositoryPassedToCreateInstallPackageOperationsResolver;
486+
IPackageRepository expectedRepository = packageManager.LocalRepository;
487+
IPackageRepository actualRepository = fakePackageOperationResolverFactory.LocalRepositoryPassedToCreateInstallPackageOperationsResolver;
446488

447489
Assert.AreEqual(expectedRepository, actualRepository);
448490
}
@@ -454,8 +496,8 @@ public void GetInstallPackageOperations_PackageOperationResolverFactoryUsed_Pack
454496
var package = new FakePackage();
455497
GetInstallPackageOperations(package);
456498

457-
var expectedRepository = packageManager.SourceRepository;
458-
var actualRepository = fakePackageOperationResolverFactory.SourceRepositoryPassedToCreateInstallPackageOperationsResolver;
499+
IPackageRepository expectedRepository = packageManager.SourceRepository;
500+
IPackageRepository actualRepository = fakePackageOperationResolverFactory.SourceRepositoryPassedToCreateInstallPackageOperationsResolver;
459501

460502
Assert.AreEqual(expectedRepository, actualRepository);
461503
}
@@ -467,7 +509,7 @@ public void GetInstallPackageOperations_PackageOperationResolverFactoryUsed_Depe
467509
var package = new FakePackage();
468510
GetInstallPackageOperations(package);
469511

470-
var result = fakePackageOperationResolverFactory.IgnoreDependenciesPassedToCreateInstallPackageOperationResolver;
512+
bool result = fakePackageOperationResolverFactory.IgnoreDependenciesPassedToCreateInstallPackageOperationResolver;
471513

472514
Assert.IsFalse(result);
473515
}
@@ -479,8 +521,8 @@ public void GetInstallPackageOperations_PackageOperationResolverFactoryUsed_Pack
479521
var package = new FakePackage();
480522
GetInstallPackageOperations(package);
481523

482-
var expectedLogger = packageManager.Logger;
483-
var actualLogger = fakePackageOperationResolverFactory.LoggerPassedToCreateInstallPackageOperationResolver;
524+
ILogger expectedLogger = packageManager.Logger;
525+
ILogger actualLogger = fakePackageOperationResolverFactory.LoggerPassedToCreateInstallPackageOperationResolver;
484526

485527
Assert.AreEqual(expectedLogger, actualLogger);
486528
}
@@ -492,7 +534,7 @@ public void GetInstallPackageOperations_PackageOperationResolverFactoryUsed_Pack
492534
var package = new FakePackage();
493535
GetInstallPackageOperations(package);
494536

495-
var actualPackage = fakePackageOperationResolverFactory
537+
IPackage actualPackage = fakePackageOperationResolverFactory
496538
.FakeInstallPackageOperationResolver
497539
.PackagePassedToResolveOperations;
498540

@@ -515,7 +557,7 @@ public void UpdatePackage_PackageInstanceAndNoPackageOperationsPassed_UpdatesRef
515557
{
516558
CreatePackageManager();
517559
CreateTestableProjectManager();
518-
var package = UpdatePackageWithNoPackageOperations();
560+
FakePackage package = UpdatePackageWithNoPackageOperations();
519561

520562
Assert.AreEqual(package, testableProjectManager.PackagePassedToUpdatePackageReference);
521563
}
@@ -525,7 +567,7 @@ public void UpdatePackage_PackageInstanceAndNoPackageOperationsPassed_UpdatesDep
525567
{
526568
CreatePackageManager();
527569
CreateTestableProjectManager();
528-
var package = UpdatePackageWithNoPackageOperations();
570+
FakePackage package = UpdatePackageWithNoPackageOperations();
529571

530572
Assert.IsTrue(testableProjectManager.UpdateDependenciesPassedToUpdatePackageReference);
531573
}

0 commit comments

Comments
 (0)