Browse Source

Fix incorrect package sources being used when updating a package.

On updating a package all the enabled package sources are used. On
changing the enabled package sources, after opening a solution, the
original set of enabled package sources were being still used.

The change to support solution specific NuGet.Config files broke the
original behaviour since the package sources are reloaded when a
solution is opened or closed and the package repository cache was
still using the original set of package sources.
pull/484/head
Matt Ward 11 years ago
parent
commit
8384a172d6
  1. 2
      src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementServices.cs
  2. 41
      src/AddIns/Misc/PackageManagement/Project/Src/PackageRepositoryCache.cs
  3. 12
      src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageRepositoryFactory.cs
  4. 8
      src/AddIns/Misc/PackageManagement/Test/Src/Helpers/OneRegisteredPackageSourceHelper.cs
  5. 2
      src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestablePackageManagementOptions.cs
  6. 38
      src/AddIns/Misc/PackageManagement/Test/Src/PackageRepositoryCacheTests.cs

2
src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementServices.cs

@ -42,7 +42,7 @@ namespace ICSharpCode.PackageManagement
static PackageManagementServices() static PackageManagementServices()
{ {
options = new PackageManagementOptions(); options = new PackageManagementOptions();
packageRepositoryCache = new PackageRepositoryCache(options.PackageSources, options.RecentPackages); packageRepositoryCache = new PackageRepositoryCache(options);
userAgentGenerator = new UserAgentGeneratorForRepositoryRequests(packageRepositoryCache); userAgentGenerator = new UserAgentGeneratorForRepositoryRequests(packageRepositoryCache);
registeredPackageRepositories = new RegisteredPackageRepositories(packageRepositoryCache, options); registeredPackageRepositories = new RegisteredPackageRepositories(packageRepositoryCache, options);

41
src/AddIns/Misc/PackageManagement/Project/Src/PackageRepositoryCache.cs

@ -26,30 +26,36 @@ namespace ICSharpCode.PackageManagement
public class PackageRepositoryCache : IPackageRepositoryCache, IPackageRepositoryFactoryEvents public class PackageRepositoryCache : IPackageRepositoryCache, IPackageRepositoryFactoryEvents
{ {
ISharpDevelopPackageRepositoryFactory factory; ISharpDevelopPackageRepositoryFactory factory;
RegisteredPackageSources registeredPackageSources; RegisteredPackageSources packageSources;
PackageManagementOptions options;
IList<RecentPackageInfo> recentPackages; IList<RecentPackageInfo> recentPackages;
IRecentPackageRepository recentPackageRepository; IRecentPackageRepository recentPackageRepository;
ConcurrentDictionary<string, IPackageRepository> repositories = ConcurrentDictionary<string, IPackageRepository> repositories =
new ConcurrentDictionary<string, IPackageRepository>(); new ConcurrentDictionary<string, IPackageRepository>();
public PackageRepositoryCache( public PackageRepositoryCache(
ISharpDevelopPackageRepositoryFactory factory, PackageManagementOptions options,
RegisteredPackageSources registeredPackageSources, ISharpDevelopPackageRepositoryFactory factory)
IList<RecentPackageInfo> recentPackages)
{ {
this.options = options;
this.factory = factory; this.factory = factory;
this.registeredPackageSources = registeredPackageSources; this.recentPackages = options.RecentPackages;
this.recentPackages = recentPackages;
} }
public PackageRepositoryCache(PackageManagementOptions options)
: this(
options,
new SharpDevelopPackageRepositoryFactory())
{
}
public PackageRepositoryCache( public PackageRepositoryCache(
RegisteredPackageSources registeredPackageSources, RegisteredPackageSources packageSources,
IList<RecentPackageInfo> recentPackages) IList<RecentPackageInfo> recentPackages)
: this(
new SharpDevelopPackageRepositoryFactory(),
registeredPackageSources,
recentPackages)
{ {
this.factory = new SharpDevelopPackageRepositoryFactory();
this.recentPackages = recentPackages;
this.packageSources = packageSources;
} }
public event EventHandler<PackageRepositoryFactoryEventArgs> RepositoryCreated; public event EventHandler<PackageRepositoryFactoryEventArgs> RepositoryCreated;
@ -102,10 +108,19 @@ namespace ICSharpCode.PackageManagement
IEnumerable<IPackageRepository> CreateAllEnabledRepositories() IEnumerable<IPackageRepository> CreateAllEnabledRepositories()
{ {
foreach (PackageSource source in registeredPackageSources.GetEnabledPackageSources()) { foreach (PackageSource source in PackageSources.GetEnabledPackageSources()) {
yield return CreateRepository(source.Source); yield return CreateRepository(source.Source);
} }
} }
RegisteredPackageSources PackageSources {
get {
if (packageSources != null) {
return packageSources;
}
return options.PackageSources;
}
}
public IPackageRepository CreateAggregateRepository(IEnumerable<IPackageRepository> repositories) public IPackageRepository CreateAggregateRepository(IEnumerable<IPackageRepository> repositories)
{ {

12
src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageRepositoryFactory.cs

@ -38,6 +38,13 @@ namespace PackageManagement.Tests.Helpers
public Dictionary<string, FakePackageRepository> FakePackageRepositories = public Dictionary<string, FakePackageRepository> FakePackageRepositories =
new Dictionary<string, FakePackageRepository>(); new Dictionary<string, FakePackageRepository>();
public FakePackageRepositoryFactory()
{
CreateAggregrateRepositoryAction = (repositories) => {
return FakeAggregateRepository;
};
}
public IPackageRepository CreateRepository(string packageSource) public IPackageRepository CreateRepository(string packageSource)
{ {
PackageSourcesPassedToCreateRepository.Add(packageSource); PackageSourcesPassedToCreateRepository.Add(packageSource);
@ -84,16 +91,17 @@ namespace PackageManagement.Tests.Helpers
} }
public IEnumerable<IPackageRepository> RepositoriesPassedToCreateAggregateRepository; public IEnumerable<IPackageRepository> RepositoriesPassedToCreateAggregateRepository;
public Func<IEnumerable<IPackageRepository>, IPackageRepository> CreateAggregrateRepositoryAction;
public IPackageRepository CreateAggregateRepository(IEnumerable<IPackageRepository> repositories) public IPackageRepository CreateAggregateRepository(IEnumerable<IPackageRepository> repositories)
{ {
RepositoriesPassedToCreateAggregateRepository = repositories; RepositoriesPassedToCreateAggregateRepository = repositories;
return FakeAggregateRepository; return CreateAggregrateRepositoryAction(repositories);
} }
public FakePackageRepository AddFakePackageRepositoryForPackageSource(string source) public FakePackageRepository AddFakePackageRepositoryForPackageSource(string source)
{ {
var repository = new FakePackageRepository(); var repository = new FakePackageRepository();
FakePackageRepositories.Add(source, repository); FakePackageRepositories.Add(source, repository);
return repository; return repository;
} }

8
src/AddIns/Misc/PackageManagement/Test/Src/Helpers/OneRegisteredPackageSourceHelper.cs

@ -26,11 +26,14 @@ namespace PackageManagement.Tests.Helpers
{ {
public class OneRegisteredPackageSourceHelper public class OneRegisteredPackageSourceHelper
{ {
public RegisteredPackageSources RegisteredPackageSources;
public TestablePackageManagementOptions Options; public TestablePackageManagementOptions Options;
public FakeSettings FakeSettings; public FakeSettings FakeSettings;
public PackageSource PackageSource = new PackageSource("http://sharpdevelop.com", "Test Package Source"); public PackageSource PackageSource = new PackageSource("http://sharpdevelop.com", "Test Package Source");
public RegisteredPackageSources RegisteredPackageSources {
get { return Options.PackageSources; }
}
public OneRegisteredPackageSourceHelper() public OneRegisteredPackageSourceHelper()
{ {
CreateOneRegisteredPackageSource(); CreateOneRegisteredPackageSource();
@ -41,7 +44,6 @@ namespace PackageManagement.Tests.Helpers
Properties properties = new Properties(); Properties properties = new Properties();
Options = new TestablePackageManagementOptions(); Options = new TestablePackageManagementOptions();
FakeSettings = Options.FakeSettings; FakeSettings = Options.FakeSettings;
RegisteredPackageSources = Options.PackageSources;
AddOnePackageSource(); AddOnePackageSource();
} }
@ -58,7 +60,7 @@ namespace PackageManagement.Tests.Helpers
} }
public void AddTwoPackageSources() public void AddTwoPackageSources()
{ {
AddOnePackageSource(); AddOnePackageSource();
var packageSource = new PackageSource("http://second.codeplex.com", "second"); var packageSource = new PackageSource("http://second.codeplex.com", "second");
RegisteredPackageSources.Add(packageSource); RegisteredPackageSources.Add(packageSource);

2
src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestablePackageManagementOptions.cs

@ -27,6 +27,7 @@ namespace PackageManagement.Tests.Helpers
{ {
public Properties Properties; public Properties Properties;
public FakeSettings FakeSettings; public FakeSettings FakeSettings;
public FakePackageManagementProjectService ProjectService;
public TestablePackageManagementOptions() public TestablePackageManagementOptions()
: this(new Properties(), new FakeSettings(), new FakePackageManagementProjectService()) : this(new Properties(), new FakeSettings(), new FakePackageManagementProjectService())
@ -41,6 +42,7 @@ namespace PackageManagement.Tests.Helpers
{ {
this.Properties = properties; this.Properties = properties;
this.FakeSettings = fakeSettings; this.FakeSettings = fakeSettings;
this.ProjectService = projectService;
} }
public static void ChangeSettingsReturnedBySettingsProvider(FakeSettings settings) public static void ChangeSettingsReturnedBySettingsProvider(FakeSettings settings)

38
src/AddIns/Misc/PackageManagement/Test/Src/PackageRepositoryCacheTests.cs

@ -19,6 +19,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO.Packaging; using System.IO.Packaging;
using System.Linq;
using ICSharpCode.PackageManagement; using ICSharpCode.PackageManagement;
using ICSharpCode.PackageManagement.Design; using ICSharpCode.PackageManagement.Design;
using NuGet; using NuGet;
@ -52,9 +53,7 @@ namespace PackageManagement.Tests
{ {
nuGetPackageSource = new PackageSource("http://nuget.org", "NuGet"); nuGetPackageSource = new PackageSource("http://nuget.org", "NuGet");
fakePackageRepositoryFactory = new FakePackageRepositoryFactory(); fakePackageRepositoryFactory = new FakePackageRepositoryFactory();
RegisteredPackageSources packageSources = packageSourcesHelper.Options.PackageSources; cache = new PackageRepositoryCache(packageSourcesHelper.Options, fakePackageRepositoryFactory);
IList<RecentPackageInfo> recentPackages = packageSourcesHelper.Options.RecentPackages;
cache = new PackageRepositoryCache(fakePackageRepositoryFactory, packageSources, recentPackages);
} }
FakePackageRepository AddFakePackageRepositoryForPackageSource(string source) FakePackageRepository AddFakePackageRepositoryForPackageSource(string source)
@ -395,5 +394,38 @@ namespace PackageManagement.Tests
Assert.IsNull(eventArgs); Assert.IsNull(eventArgs);
} }
[Test]
public void CreateAggregateRepository_SolutionClosedAndEnabledPackageSourcesChangedAfterCacheCreated_AggregateRepositoryContainsCorrectEnabledPackageRepositories()
{
CreatePackageSources();
packageSourcesHelper.AddTwoPackageSources("Source1", "Source2");
CreateCacheUsingPackageSources();
FakePackageRepository source1Repo = AddFakePackageRepositoryForPackageSource("Source1");
FakePackageRepository source2Repo = AddFakePackageRepositoryForPackageSource("Source2");
fakePackageRepositoryFactory.CreateAggregrateRepositoryAction = (repositories) => {
return new AggregateRepository (repositories);
};
var initialAggregateRepository = cache.CreateAggregateRepository() as AggregateRepository;
var expectedInitialRepositories = new FakePackageRepository[] {
source1Repo,
source2Repo
};
List<IPackageRepository> actualInitialRepositories = initialAggregateRepository.Repositories.ToList();
var solution = new SolutionHelper().MSBuildSolution;
packageSourcesHelper.Options.ProjectService.FireSolutionClosedEvent(solution);
packageSourcesHelper.Options.PackageSources.Clear();
packageSourcesHelper.Options.PackageSources.Add(new PackageSource ("Source3"));
FakePackageRepository source3Repo = AddFakePackageRepositoryForPackageSource("Source3");
var expectedRepositories = new FakePackageRepository[] {
source3Repo
};
var aggregateRepository = cache.CreateAggregateRepository() as AggregateRepository;
List<IPackageRepository> actualRepositories = aggregateRepository.Repositories.ToList();
CollectionAssert.AreEqual(expectedInitialRepositories, actualInitialRepositories);
CollectionAssert.AreEqual(expectedRepositories, actualRepositories);
}
} }
} }

Loading…
Cancel
Save