From 4d27532e1ad53edbc3ff8eac445c0e3baa192298 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sun, 30 Sep 2012 13:31:12 +0100 Subject: [PATCH] Support disabling NuGet package sources. Add checkbox to NuGet package sources in Tools Options that can be used to enable or disable a package source. --- .../Project/Src/Design/FakeSettings.cs | 35 +++++- .../Project/Src/PackageSourceViewModel.cs | 5 + .../Project/Src/RegisteredPackageSource.cs | 10 +- .../Src/RegisteredPackageSourceSettings.cs | 34 +++++- .../RegisteredPackageSourcesUserControl.xaml | 4 +- .../Test/Src/PackageManagementOptionsTests.cs | 106 +++++++++++++++--- .../Test/Src/PackageSourceViewModelTests.cs | 54 +++++++++ 7 files changed, 222 insertions(+), 26 deletions(-) diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeSettings.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeSettings.cs index 84afc7bf54..59b21e1373 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeSettings.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeSettings.cs @@ -12,6 +12,9 @@ namespace ICSharpCode.PackageManagement.Design public List> PackageSources = new List>(); + public List> DisabledPackageSources + = new List>(); + public List> ActivePackageSourceSettings = new List>(); @@ -22,11 +25,18 @@ namespace ICSharpCode.PackageManagement.Design { Sections.Add(RegisteredPackageSourceSettings.PackageSourcesSectionName, PackageSources); Sections.Add(RegisteredPackageSourceSettings.ActivePackageSourceSectionName, ActivePackageSourceSettings); + Sections.Add(RegisteredPackageSourceSettings.DisabledPackageSourceSectionName, DisabledPackageSources); } public string GetValue(string section, string key) { - throw new NotImplementedException(); + IList> values = Sections[section]; + foreach (KeyValuePair keyPair in values) { + if (keyPair.Key == key) { + return keyPair.Value; + } + } + return null; } public IList> GetValues(string section) @@ -87,6 +97,12 @@ namespace ICSharpCode.PackageManagement.Design } } + public bool IsDisabledPackageSourcesSectionDeleted { + get { + return SectionsDeleted.Contains(RegisteredPackageSourceSettings.DisabledPackageSourceSectionName); + } + } + public bool IsActivePackageSourceSectionDeleted { get { return SectionsDeleted.Contains(RegisteredPackageSourceSettings.ActivePackageSourceSectionName); @@ -128,5 +144,22 @@ namespace ICSharpCode.PackageManagement.Design { throw new NotImplementedException(); } + + public void AddDisabledPackageSource(PackageSource packageSource) + { + var valuePair = new KeyValuePair(packageSource.Name, packageSource.Source); + DisabledPackageSources.Add(valuePair); + } + + public IList> GetValuesPassedToSetValuesForDisabledPackageSourcesSection() + { + return SavedSectionValueLists[RegisteredPackageSourceSettings.DisabledPackageSourceSectionName]; + } + + public bool AnyValuesPassedToSetValuesForDisabledPackageSourcesSection { + get { + return SavedSectionValueLists.ContainsKey(RegisteredPackageSourceSettings.DisabledPackageSourceSectionName); + } + } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageSourceViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageSourceViewModel.cs index d24345d865..c6a6f15032 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageSourceViewModel.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageSourceViewModel.cs @@ -29,5 +29,10 @@ namespace ICSharpCode.PackageManagement get { return packageSource.Source; } set { packageSource.Source = value; } } + + public bool IsEnabled { + get { return packageSource.IsEnabled; } + set { packageSource.IsEnabled = value; } + } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSource.cs b/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSource.cs index 5f427eb212..c1dc210073 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSource.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSource.cs @@ -10,26 +10,22 @@ namespace ICSharpCode.PackageManagement { public string Source { get; set; } public string Name { get; set; } + public bool IsEnabled { get; set; } public RegisteredPackageSource() { } - public RegisteredPackageSource(string name, string source) - { - this.Name = name; - this.Source = source; - } - public RegisteredPackageSource(PackageSource packageSource) { Source = packageSource.Source; Name = packageSource.Name; + IsEnabled = packageSource.IsEnabled; } public PackageSource ToPackageSource() { - return new PackageSource(Source, Name); + return new PackageSource(Source, Name, IsEnabled); } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSourceSettings.cs b/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSourceSettings.cs index f894e96898..5ca49b1238 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSourceSettings.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSourceSettings.cs @@ -14,6 +14,7 @@ namespace ICSharpCode.PackageManagement { public static readonly string PackageSourcesSectionName = "packageSources"; public static readonly string ActivePackageSourceSectionName = "activePackageSource"; + public static readonly string DisabledPackageSourceSectionName = "disabledPackageSources"; public static readonly PackageSource AggregatePackageSource = new PackageSource("(Aggregate source)", "All"); @@ -64,7 +65,16 @@ namespace ICSharpCode.PackageManagement IEnumerable GetPackageSourcesFromSettings() { IList> savedPackageSources = settings.GetValues(PackageSourcesSectionName); - return PackageSourceConverter.ConvertFromKeyValuePairs(savedPackageSources); + foreach (PackageSource packageSource in PackageSourceConverter.ConvertFromKeyValuePairs(savedPackageSources)) { + packageSource.IsEnabled = IsPackageSourceEnabled(packageSource); + yield return packageSource; + } + } + + bool IsPackageSourceEnabled(PackageSource packageSource) + { + string disabled = settings.GetValue(DisabledPackageSourceSectionName, packageSource.Name); + return String.IsNullOrEmpty(disabled); } void PackageSourcesChanged(object sender, NotifyCollectionChangedEventArgs e) @@ -74,8 +84,10 @@ namespace ICSharpCode.PackageManagement void UpdatePackageSourceSettingsWithChanges() { - var newPackageSourceSettings = GetSettingsFromPackageSources(); + IList> newPackageSourceSettings = GetSettingsFromPackageSources(); SavePackageSourceSettings(newPackageSourceSettings); + IList> disabledPackageSourceSettings = GetSettingsForDisabledPackageSources(); + SaveDisabledPackageSourceSettings(disabledPackageSourceSettings); } IList> GetSettingsFromPackageSources() @@ -94,6 +106,22 @@ namespace ICSharpCode.PackageManagement settings.SetValues(PackageSourcesSectionName, newPackageSourceSettings); } + IList> GetSettingsForDisabledPackageSources() + { + return packageSources + .Where(source => !source.IsEnabled) + .Select(source => new KeyValuePair(source.Name, "true")) + .ToList(); + } + + void SaveDisabledPackageSourceSettings(IList> disabledPackageSourceSettings) + { + settings.DeleteSection(DisabledPackageSourceSectionName); + if (disabledPackageSourceSettings.Any()) { + settings.SetValues(DisabledPackageSourceSectionName, disabledPackageSourceSettings); + } + } + public PackageSource ActivePackageSource { get { if (activePackageSource != null) { @@ -125,7 +153,7 @@ namespace ICSharpCode.PackageManagement { RemoveActivePackageSourceSetting(); - var activePackageSourceSetting = PackageSourceConverter.ConvertToKeyValuePair(activePackageSource); + KeyValuePair activePackageSourceSetting = PackageSourceConverter.ConvertToKeyValuePair(activePackageSource); SaveActivePackageSourceSetting(activePackageSourceSetting); } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSourcesUserControl.xaml b/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSourcesUserControl.xaml index 69b2c00ec4..9e01edf5e1 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSourcesUserControl.xaml +++ b/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSourcesUserControl.xaml @@ -41,7 +41,9 @@ - + diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementOptionsTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementOptionsTests.cs index b0acb97dfe..58ea7a53b2 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementOptionsTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementOptionsTests.cs @@ -80,7 +80,7 @@ namespace PackageManagement.Tests fakeSettings.AddFakePackageSource(packageSource); CreateOptions(fakeSettings); - var actualSources = options.PackageSources; + RegisteredPackageSources actualSources = options.PackageSources; List expectedSources = new List(); expectedSources.Add(packageSource); @@ -97,7 +97,7 @@ namespace PackageManagement.Tests List expectedSources = new List(); expectedSources.Add(RegisteredPackageSources.DefaultPackageSource); - var actualPackageSources = options.PackageSources; + RegisteredPackageSources actualPackageSources = options.PackageSources; CollectionAssert.AreEqual(expectedSources, actualPackageSources); } @@ -108,16 +108,16 @@ namespace PackageManagement.Tests CreateSettings(); CreateOptions(fakeSettings); - var packageSources = options.PackageSources; + RegisteredPackageSources packageSources = options.PackageSources; - var defaultSource = RegisteredPackageSources.DefaultPackageSource; + PackageSource defaultSource = RegisteredPackageSources.DefaultPackageSource; var expectedSavedPackageSourceSettings = new List>(); string name = defaultSource.Name; string sourceUrl = defaultSource.Source; expectedSavedPackageSourceSettings.Add(new KeyValuePair(name, sourceUrl)); - var actualSavedPackageSourceSettings = fakeSettings.GetValuesPassedToSetValuesForPackageSourcesSection(); + IList> actualSavedPackageSourceSettings = fakeSettings.GetValuesPassedToSetValuesForPackageSourcesSection(); Assert.AreEqual(expectedSavedPackageSourceSettings, actualSavedPackageSourceSettings); } @@ -127,7 +127,7 @@ namespace PackageManagement.Tests { CreateSettings(); CreateOptions(fakeSettings); - var registeredPackageSources = options.PackageSources; + RegisteredPackageSources registeredPackageSources = options.PackageSources; var packageSource = new PackageSource("http://codeplex.com", "Test"); registeredPackageSources.Clear(); @@ -136,7 +136,7 @@ namespace PackageManagement.Tests var expectedSavedPackageSourceSettings = new List>(); expectedSavedPackageSourceSettings.Add(new KeyValuePair("Test", "http://codeplex.com")); - var actualSavedPackageSourceSettings = fakeSettings.GetValuesPassedToSetValuesForPackageSourcesSection(); + IList> actualSavedPackageSourceSettings = fakeSettings.GetValuesPassedToSetValuesForPackageSourcesSection(); Assert.AreEqual(expectedSavedPackageSourceSettings, actualSavedPackageSourceSettings); } @@ -146,7 +146,7 @@ namespace PackageManagement.Tests { CreateSettings(); CreateOptions(fakeSettings); - var registeredPackageSources = options.PackageSources; + RegisteredPackageSources registeredPackageSources = options.PackageSources; var packageSource = new PackageSource("http://codeplex.com", "Test"); registeredPackageSources.Clear(); @@ -185,7 +185,7 @@ namespace PackageManagement.Tests options.ActivePackageSource = packageSource; var expectedKeyValuePair = new KeyValuePair("Test", "http://sharpdevelop.com"); - var actualKeyValuePair = fakeSettings.GetValuePassedToSetValueForActivePackageSourceSection(); + KeyValuePair actualKeyValuePair = fakeSettings.GetValuePassedToSetValueForActivePackageSourceSection(); Assert.AreEqual(expectedKeyValuePair, actualKeyValuePair); } @@ -227,7 +227,7 @@ namespace PackageManagement.Tests var differentSource = new PackageSource("http://different-url", "Test2"); options.ActivePackageSource = differentSource; - var activeSource = options.ActivePackageSource; + PackageSource activeSource = options.ActivePackageSource; Assert.IsNull(activeSource); } @@ -280,7 +280,7 @@ namespace PackageManagement.Tests options.RecentPackages.Add(recentPackage); CreateOptions(properties); - var recentPackages = options.RecentPackages; + IList recentPackages = options.RecentPackages; var expectedRecentPackages = new RecentPackageInfo[] { new RecentPackageInfo(package) @@ -293,7 +293,7 @@ namespace PackageManagement.Tests public void RecentPackages_SaveRecentPackages_DoesNotThrowInvalidOperationException() { CreateOptions(); - var recentPackage = AddRecentPackageToOptions("id", "1.0"); + RecentPackageInfo recentPackage = AddRecentPackageToOptions("id", "1.0"); Assert.DoesNotThrow(() => SaveOptions()); } @@ -302,13 +302,91 @@ namespace PackageManagement.Tests public void ActivePackageSource_AggregatePackageSourceIsActivePackageSourceInSettings_ReturnsAggregatePackageSource() { CreateSettings(); - var expectedPackageSource = RegisteredPackageSourceSettings.AggregatePackageSource; + PackageSource expectedPackageSource = RegisteredPackageSourceSettings.AggregatePackageSource; fakeSettings.SetFakeActivePackageSource(expectedPackageSource); CreateOptions(fakeSettings); - var activePackageSource = options.ActivePackageSource; + PackageSource activePackageSource = options.ActivePackageSource; Assert.AreEqual(expectedPackageSource, activePackageSource); } + + [Test] + public void PackageSources_OneEnabledPackageSourceInSettings_ContainsSingleEnabledPackageSourceFromSettings() + { + CreateSettings(); + var packageSource = new PackageSource("http://codeplex.com", "Test") { IsEnabled = true }; + fakeSettings.AddFakePackageSource(packageSource); + CreateOptions(fakeSettings); + + RegisteredPackageSources actualSources = options.PackageSources; + + Assert.IsTrue(actualSources[0].IsEnabled); + } + + [Test] + public void PackageSources_OneDisabledPackageSourceInSettings_ContainsSingleDisabledPackageSourceFromSettings() + { + CreateSettings(); + var packageSource = new PackageSource("http://codeplex.com", "Test") { IsEnabled = false }; + fakeSettings.AddFakePackageSource(packageSource); + fakeSettings.AddDisabledPackageSource(packageSource); + CreateOptions(fakeSettings); + + RegisteredPackageSources actualSources = options.PackageSources; + + Assert.IsFalse(actualSources[0].IsEnabled); + } + + [Test] + public void PackageSources_OnePackageSourceAdded_DisabledPackageSourcesSectionDeletedFromSettings() + { + CreateSettings(); + CreateOptions(fakeSettings); + RegisteredPackageSources registeredPackageSources = options.PackageSources; + + var packageSource = new PackageSource("http://codeplex.com", "Test"); + registeredPackageSources.Clear(); + registeredPackageSources.Add(packageSource); + + bool sectionDeleted = fakeSettings.IsDisabledPackageSourcesSectionDeleted; + + Assert.IsTrue(sectionDeleted); + } + + [Test] + public void PackageSources_OneDisabledPackageSourceAdded_DisabledPackageSourcesSectionSaved() + { + CreateSettings(); + CreateOptions(fakeSettings); + RegisteredPackageSources registeredPackageSources = options.PackageSources; + + var packageSource = new PackageSource("http://codeplex.com", "Test") { IsEnabled = false }; + registeredPackageSources.Clear(); + registeredPackageSources.Add(packageSource); + + var expectedSavedPackageSourceSettings = new List>(); + expectedSavedPackageSourceSettings.Add(new KeyValuePair(packageSource.Name, "true")); + + IList> actualSavedPackageSourceSettings = + fakeSettings.GetValuesPassedToSetValuesForDisabledPackageSourcesSection(); + Assert.AreEqual(expectedSavedPackageSourceSettings, actualSavedPackageSourceSettings); + } + + [Test] + public void PackageSources_OneEnabledPackageSourceAdded_DisabledPackageSourcesSectionNotChanged() + { + CreateSettings(); + CreateOptions(fakeSettings); + RegisteredPackageSources registeredPackageSources = options.PackageSources; + + var packageSource = new PackageSource("http://codeplex.com", "Test") { IsEnabled = true }; + registeredPackageSources.Clear(); + registeredPackageSources.Add(packageSource); + + bool result = fakeSettings.AnyValuesPassedToSetValuesForDisabledPackageSourcesSection; + + Assert.IsFalse(result); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/PackageSourceViewModelTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/PackageSourceViewModelTests.cs index d0afd9c9b3..1f03e156ac 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/PackageSourceViewModelTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/PackageSourceViewModelTests.cs @@ -39,6 +39,18 @@ namespace PackageManagement.Tests viewModel = new PackageSourceViewModel(packageSource); } + void CreateEnabledPackageSource() + { + CreatePackageSource(); + packageSource.IsEnabled = true; + } + + void CreateDisabledPackageSource() + { + CreatePackageSource(); + packageSource.IsEnabled = false; + } + [Test] public void Name_InstanceCreatedWithRegisteredPackageSource_MatchesRegisteredPackageSourceName() { @@ -76,5 +88,47 @@ namespace PackageManagement.Tests Assert.AreEqual("changed", viewModel.SourceUrl); } + + [Test] + public void IsEnabled_PackageSourceIsEnabled_ReturnsTrue() + { + CreateEnabledPackageSource(); + CreateViewModel(packageSource); + + Assert.IsTrue(viewModel.IsEnabled); + } + + [Test] + public void IsEnabled_PackageSourceIsNotEnabled_ReturnsFalse() + { + CreateDisabledPackageSource(); + CreateViewModel(packageSource); + + Assert.IsFalse(viewModel.IsEnabled); + } + + [Test] + public void IsEnabled_ChangedFromTrueToFalse_UpdatesPackageSource() + { + CreateEnabledPackageSource(); + CreateViewModel(packageSource); + + viewModel.IsEnabled = false; + + PackageSource updatedPackageSource = viewModel.GetPackageSource(); + Assert.IsFalse(updatedPackageSource.IsEnabled); + } + + [Test] + public void IsEnabled_ChangedFromFalseToTrue_UpdatesPackageSource() + { + CreateDisabledPackageSource(); + CreateViewModel(packageSource); + + viewModel.IsEnabled = true; + + PackageSource updatedPackageSource = viewModel.GetPackageSource(); + Assert.IsTrue(updatedPackageSource.IsEnabled); + } } }