From 82e98ec949bc57b01c5fe1468285077298bea587 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Mon, 23 Jun 2014 21:29:49 +0100 Subject: [PATCH] Support custom NuGet package directory. NuGet allows a solution to override the standard packages directory with a repositoryPath setting in the NuGet.config file at the solution level in the .nuget directory. This is now supported by SharpDevelop. --- .../Project/Src/Design/FakeSettings.cs | 17 ++++++++++++- .../Project/Src/PackageManagementOptions.cs | 5 ++++ .../Src/RegisteredPackageSourceSettings.cs | 4 ++++ .../Src/SharpDevelopPackageManagerFactory.cs | 2 +- .../Src/SolutionPackageRepositoryPath.cs | 15 +++++++----- .../Src/SolutionPackageRepositoryPathTests.cs | 24 ++++++++++++++++++- 6 files changed, 58 insertions(+), 9 deletions(-) diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeSettings.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeSettings.cs index bc37ce523f..0c1980b65c 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeSettings.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeSettings.cs @@ -18,6 +18,8 @@ using System; using System.Collections.Generic; +using System.Linq; + using NuGet; namespace ICSharpCode.PackageManagement.Design @@ -36,6 +38,8 @@ namespace ICSharpCode.PackageManagement.Design public Dictionary>> Sections = new Dictionary>>(); + public const string ConfigSectionName = "config"; + public FakeSettings() { Sections.Add(RegisteredPackageSourceSettings.PackageSourcesSectionName, PackageSources); @@ -200,7 +204,11 @@ namespace ICSharpCode.PackageManagement.Design public string GetValue(string section, string key, bool isPath) { - throw new NotImplementedException(); + if (Sections.ContainsKey(section)) { + var matchedSection = Sections[section]; + return matchedSection.FirstOrDefault(item => item.Key == key).Value; + } + return null; } public IList> GetValues(string section, bool isPath) @@ -212,5 +220,12 @@ namespace ICSharpCode.PackageManagement.Design { throw new NotImplementedException(); } + + public void SetRepositoryPathSetting(string fullPath) + { + var items = new List> (); + items.Add (new KeyValuePair("repositoryPath", fullPath)); + Sections.Add(ConfigSectionName, items); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementOptions.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementOptions.cs index 655d9be0d1..4ae99a301d 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementOptions.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementOptions.cs @@ -95,5 +95,10 @@ namespace ICSharpCode.PackageManagement { properties.SetList(RecentPackagesPropertyName, recentPackages); } + + public string GetCustomPackagesDirectory() + { + return registeredPackageSourceSettings.Settings.GetRepositoryPath(); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSourceSettings.cs b/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSourceSettings.cs index 2a6aae2c30..829c1bef8d 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSourceSettings.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/RegisteredPackageSourceSettings.cs @@ -204,5 +204,9 @@ namespace ICSharpCode.PackageManagement packageSources = null; } } + + public ISettings Settings { + get { return settings; } + } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/SharpDevelopPackageManagerFactory.cs b/src/AddIns/Misc/PackageManagement/Project/Src/SharpDevelopPackageManagerFactory.cs index dc79c7c396..92d31f3a12 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/SharpDevelopPackageManagerFactory.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/SharpDevelopPackageManagerFactory.cs @@ -32,7 +32,7 @@ namespace ICSharpCode.PackageManagement : this( new SharpDevelopPackageRepositoryFactory(), new SharpDevelopProjectSystemFactory(), - new PackageManagementOptions()) + PackageManagementServices.Options) { } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/SolutionPackageRepositoryPath.cs b/src/AddIns/Misc/PackageManagement/Project/Src/SolutionPackageRepositoryPath.cs index 9be3cb7e0b..b188e91669 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/SolutionPackageRepositoryPath.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/SolutionPackageRepositoryPath.cs @@ -25,12 +25,11 @@ namespace ICSharpCode.PackageManagement { public class SolutionPackageRepositoryPath { - string packagesRelativeDirectory; ISolution solution; DefaultPackagePathResolver pathResolver; public SolutionPackageRepositoryPath(IProject project) - : this(project, new PackageManagementOptions()) + : this(project, PackageManagementServices.Options) { } @@ -41,14 +40,18 @@ namespace ICSharpCode.PackageManagement public SolutionPackageRepositoryPath(ISolution solution, PackageManagementOptions options) { - packagesRelativeDirectory = options.PackagesDirectory; this.solution = solution; - GetSolutionPackageRepositoryPath(); + PackageRepositoryPath = GetSolutionPackageRepositoryPath(options); } - void GetSolutionPackageRepositoryPath() + string GetSolutionPackageRepositoryPath(PackageManagementOptions options) { - PackageRepositoryPath = Path.Combine(solution.Directory, packagesRelativeDirectory); + string customPath = options.GetCustomPackagesDirectory (); + if (!String.IsNullOrEmpty (customPath)) { + return customPath; + } + + return Path.Combine (solution.Directory, options.PackagesDirectory); } public string PackageRepositoryPath { get; private set; } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/SolutionPackageRepositoryPathTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/SolutionPackageRepositoryPathTests.cs index 6623b8e461..5e55e9cef6 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/SolutionPackageRepositoryPathTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/SolutionPackageRepositoryPathTests.cs @@ -32,8 +32,9 @@ namespace PackageManagement.Tests { SolutionPackageRepositoryPath repositoryPath; IProject testProject; - PackageManagementOptions options; + TestablePackageManagementOptions options; ISolution solution; + FakeSettings settings; void CreateSolutionPackageRepositoryPath() { @@ -61,6 +62,12 @@ namespace PackageManagement.Tests void CreateOptions() { options = new TestablePackageManagementOptions(); + settings = options.FakeSettings; + } + + void SolutionNuGetConfigFileHasCustomPackagesPath(string fullPath) + { + settings.SetRepositoryPathSetting(fullPath); } [Test] @@ -109,5 +116,20 @@ namespace PackageManagement.Tests Assert.AreEqual(expectedInstallPath, installPath); } + + [Test] + public void PackageRepositoryPath_SolutionHasNuGetFileThatOverridesDefaultPackagesRepositoryPath_OverriddenPathReturned() + { + CreateOptions(); + CreateSolution(@"d:\projects\MySolution\MySolution.sln"); + options.PackagesDirectory = "Packages"; + SolutionNuGetConfigFileHasCustomPackagesPath(@"d:\Team\MyPackages"); + CreateSolutionPackageRepositoryPath(solution); + string expectedPath = @"d:\Team\MyPackages"; + + string path = repositoryPath.PackageRepositoryPath; + + Assert.AreEqual(expectedPath, path); + } } }