diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/AvailablePackagesViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/AvailablePackagesViewModel.cs index 4fb004f9a9..cb59d8abf5 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/AvailablePackagesViewModel.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/AvailablePackagesViewModel.cs @@ -11,6 +11,8 @@ namespace ICSharpCode.PackageManagement { public class AvailablePackagesViewModel : PackagesViewModel { + IPackageRepository repository; + public AvailablePackagesViewModel( IPackageManagementService packageManagementService, ITaskFactory taskFactory) @@ -20,9 +22,14 @@ namespace ICSharpCode.PackageManagement ShowPackageSources = packageManagementService.HasMultiplePackageSources; } + protected override void UpdateRepositoryBeforeReadPackagesTaskStarts() + { + repository = PackageManagementService.ActivePackageRepository; + } + protected override IQueryable GetAllPackages() { - return PackageManagementService.ActivePackageRepository.GetPackages(); + return repository.GetPackages(); } protected override IEnumerable GetFilteredPackagesBeforePagingResults(IQueryable allPackages) diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeProjectManager.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeProjectManager.cs index e8b19c022b..e5f69adae2 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeProjectManager.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeProjectManager.cs @@ -8,15 +8,22 @@ namespace ICSharpCode.PackageManagement.Design { public class FakeProjectManager : ISharpDevelopProjectManager { - public FakePackageRepository FakeLocalRepository = new FakePackageRepository(); - public FakePackageRepository FakeSourceRepository = new FakePackageRepository(); + public FakePackageRepository FakeLocalRepository { + get { return LocalRepository as FakePackageRepository; } + set { LocalRepository = value; } + } + + public FakePackageRepository FakeSourceRepository { + get { return SourceRepository as FakePackageRepository; } + set { SourceRepository = value; } + } public bool IsInstalledReturnValue; public FakeProjectManager() { - LocalRepository = FakeLocalRepository; - SourceRepository = FakeSourceRepository; + LocalRepository = new FakePackageRepository(); + SourceRepository = new FakePackageRepository(); } public event EventHandler PackageReferenceAdded; diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/InstalledPackagesViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/InstalledPackagesViewModel.cs index 2876adc550..5d997ad44a 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/InstalledPackagesViewModel.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/InstalledPackagesViewModel.cs @@ -11,6 +11,7 @@ namespace ICSharpCode.PackageManagement public class InstalledPackagesViewModel : PackagesViewModel { IProjectManager projectManager; + IPackageRepository repository; string errorMessage = String.Empty; public InstalledPackagesViewModel( @@ -44,18 +45,19 @@ namespace ICSharpCode.PackageManagement ReadPackages(); } - protected override IQueryable GetAllPackages() + protected override void UpdateRepositoryBeforeReadPackagesTaskStarts() { - IPackageRepository repository = GetRepository(); - return repository.GetPackages(); + if (projectManager != null) { + repository = projectManager.LocalRepository; + } } - IPackageRepository GetRepository() + protected override IQueryable GetAllPackages() { if (projectManager == null) { ThrowOriginalExceptionWhenTryingToGetProjectManager(); } - return projectManager.LocalRepository; + return repository.GetPackages(); } void ThrowOriginalExceptionWhenTryingToGetProjectManager() diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageUpdatesViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageUpdatesViewModel.cs index 93cdaad823..43daa6323a 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageUpdatesViewModel.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageUpdatesViewModel.cs @@ -13,6 +13,8 @@ namespace ICSharpCode.PackageManagement { List packages = new List(); IPackageManagementService packageManagementService; + IPackageRepository localRepository; + IPackageRepository sourceRepository; public PackageUpdatesViewModel( IPackageManagementService packageManagementService, @@ -22,22 +24,22 @@ namespace ICSharpCode.PackageManagement this.packageManagementService = packageManagementService; } - protected override IQueryable GetAllPackages() + protected override void UpdateRepositoryBeforeReadPackagesTaskStarts() { - IQueryable localPackages = GetLocalRepositoryPackages(); - return GetUpdatedPackages(localPackages); + IProjectManager projectManager = packageManagementService.ActiveProjectManager; + localRepository = projectManager.LocalRepository; + + sourceRepository = packageManagementService.CreateAggregatePackageRepository(); } - IQueryable GetLocalRepositoryPackages() + protected override IQueryable GetAllPackages() { - IProjectManager projectManager = packageManagementService.ActiveProjectManager; - IPackageRepository localRepository = projectManager.LocalRepository; - return localRepository.GetPackages(); + IQueryable localPackages = localRepository.GetPackages(); + return GetUpdatedPackages(localPackages); } IQueryable GetUpdatedPackages(IQueryable localPackages) { - IPackageRepository sourceRepository = packageManagementService.CreateAggregatePackageRepository(); return sourceRepository.GetUpdates(localPackages).AsQueryable(); } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModel.cs index f92cf26d5d..efdc1c70af 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModel.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModel.cs @@ -113,6 +113,7 @@ namespace ICSharpCode.PackageManagement { allPackages = null; SelectedPageNumber = 1; + UpdateRepositoryBeforeReadPackagesTaskStarts(); StartReadPackagesTask(); } @@ -126,6 +127,10 @@ namespace ICSharpCode.PackageManagement task.Start(); } + protected virtual void UpdateRepositoryBeforeReadPackagesTaskStarts() + { + } + void CancelReadPackagesTask() { if (task != null) { diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/AvailablePackagesViewModelTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/AvailablePackagesViewModelTests.cs index 1bd4a1f004..4501e0405c 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/AvailablePackagesViewModelTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/AvailablePackagesViewModelTests.cs @@ -344,5 +344,20 @@ namespace PackageManagement.Tests Assert.IsFalse(fired); } + + [Test] + public void GetAllPackages_OnePackageInRepository_RepositoryNotCreatedByBackgroundThread() + { + CreatePackageManagementService(); + AddOnePackageSourceToRegisteredSources(); + packageManagementService.FakeActivePackageRepository.FakePackages.Add(new FakePackage()); + CreateViewModel(packageManagementService); + viewModel.ReadPackages(); + + packageManagementService.FakeActivePackageRepository = null; + CompleteReadPackagesTask(); + + Assert.AreEqual(1, viewModel.PackageViewModels.Count); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/InstalledPackagesViewModelTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/InstalledPackagesViewModelTests.cs index 7edbace352..400eb55dbf 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/InstalledPackagesViewModelTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/InstalledPackagesViewModelTests.cs @@ -114,5 +114,19 @@ namespace PackageManagement.Tests ApplicationException ex = Assert.Throws(() => CompleteReadPackagesTask()); Assert.AreEqual("Test", ex.Message); } + + [Test] + public void ReadPackages_OnePackageInLocalRepository_RepositoryIsNotCreatedByBackgroundThread() + { + CreatePackageManagementService(); + packageManagementService.AddPackageToProjectLocalRepository(new FakePackage()); + CreateViewModel(packageManagementService); + viewModel.ReadPackages(); + + packageManagementService.FakeActiveProjectManager.FakeLocalRepository = null; + CompleteReadPackagesTask(); + + Assert.AreEqual(1, viewModel.PackageViewModels.Count); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/PackageUpdatesViewModelTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/PackageUpdatesViewModelTests.cs index 920bd37902..50938e3b30 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/PackageUpdatesViewModelTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/PackageUpdatesViewModelTests.cs @@ -86,5 +86,21 @@ namespace PackageManagement.Tests PackageCollectionAssert.AreEqual(expectedPackages, viewModel.PackageViewModels); } + + [Test] + public void ReadPackages_OneNewerPackage_RepositoriesNotCreatedByBackgroundThread() + { + CreateViewModel(); + AddPackageToLocalRepository("1.0.0.0"); + var newerPackage = AddPackageToSourceRepository("1.1.0.0"); + + viewModel.ReadPackages(); + + packageManagementService.FakeAggregateRepository = null; + packageManagementService.FakeActiveProjectManager.LocalRepository = null; + CompleteReadPackagesTask(); + + Assert.AreEqual(1, viewModel.PackageViewModels.Count); + } } }