From 92e7cbef4ad5b59cb16cfb776270594df2f8f92f Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Thu, 11 Nov 2010 13:50:32 -0800 Subject: [PATCH] Adding package uninstall command --HG-- branch : nuget --- .../Packaging/PackageExpanderTests.cs | 2 +- .../Commands/PackagingCommands.cs | 17 +++++++- .../Orchard.Packaging.csproj | 4 +- ...ackageExpander.cs => IPackageInstaller.cs} | 8 ++-- .../Services/IPackageManager.cs | 4 +- ...PackageExpander.cs => PackageInstaller.cs} | 39 ++++++++++++++++--- .../Services/PackageManager.cs | 9 +++-- 7 files changed, 63 insertions(+), 20 deletions(-) rename src/Orchard.Web/Modules/Orchard.Packaging/Services/{IPackageExpander.cs => IPackageInstaller.cs} (55%) rename src/Orchard.Web/Modules/Orchard.Packaging/Services/{PackageExpander.cs => PackageInstaller.cs} (52%) diff --git a/src/Orchard.Tests.Modules/Packaging/PackageExpanderTests.cs b/src/Orchard.Tests.Modules/Packaging/PackageExpanderTests.cs index 53078d6c7..f5d3a96fa 100644 --- a/src/Orchard.Tests.Modules/Packaging/PackageExpanderTests.cs +++ b/src/Orchard.Tests.Modules/Packaging/PackageExpanderTests.cs @@ -19,7 +19,7 @@ namespace Orchard.Tests.Modules.Packaging { public class PackageExpanderTests : ContainerTestBase { protected override void Register(Autofac.ContainerBuilder builder) { builder.RegisterType().As(); - builder.RegisterType().As(); + builder.RegisterType().As(); builder.RegisterInstance(new StubVirtualPathProvider(new StubFileSystem(new Clock()))); builder.RegisterType().As() .As().InstancePerLifetimeScope(); diff --git a/src/Orchard.Web/Modules/Orchard.Packaging/Commands/PackagingCommands.cs b/src/Orchard.Web/Modules/Orchard.Packaging/Commands/PackagingCommands.cs index 111b88aed..1e1ef1c59 100644 --- a/src/Orchard.Web/Modules/Orchard.Packaging/Commands/PackagingCommands.cs +++ b/src/Orchard.Web/Modules/Orchard.Packaging/Commands/PackagingCommands.cs @@ -60,13 +60,28 @@ namespace Orchard.Packaging.Commands { Context.Output.WriteLine(T("The project's location is not supported")); } - var packageInfo = _packageManager.Install(packageId, Version, Path.GetFullPath(location), solutionFolder); + _packageManager.Install(packageId, Version, Path.GetFullPath(location), solutionFolder); foreach(var message in _notifier.List()) { Context.Output.WriteLine(message.Message); } } + [CommandHelp("package uninstall \r\n\t" + "Uninstall a module or a theme.")] + [CommandName("package uninstall")] + public void UninstallPackage(string packageId) { + var solutionFolder = GetSolutionFolder(); + + if ( solutionFolder == null ) { + Context.Output.WriteLine(T("The project's location is not supported")); + } + + _packageManager.Uninstall(packageId, solutionFolder); + + foreach ( var message in _notifier.List() ) { + Context.Output.WriteLine(message.Message); + } + } private static string GetSolutionFolder() { var orchardDirectory = Directory.GetParent(OrchardWebProj); return orchardDirectory.Parent == null ? null : orchardDirectory.Parent.FullName; diff --git a/src/Orchard.Web/Modules/Orchard.Packaging/Orchard.Packaging.csproj b/src/Orchard.Web/Modules/Orchard.Packaging/Orchard.Packaging.csproj index 86fa7d893..78832e852 100644 --- a/src/Orchard.Web/Modules/Orchard.Packaging/Orchard.Packaging.csproj +++ b/src/Orchard.Web/Modules/Orchard.Packaging/Orchard.Packaging.csproj @@ -82,13 +82,13 @@ - + - + diff --git a/src/Orchard.Web/Modules/Orchard.Packaging/Services/IPackageExpander.cs b/src/Orchard.Web/Modules/Orchard.Packaging/Services/IPackageInstaller.cs similarity index 55% rename from src/Orchard.Web/Modules/Orchard.Packaging/Services/IPackageExpander.cs rename to src/Orchard.Web/Modules/Orchard.Packaging/Services/IPackageInstaller.cs index 1810884a5..38a28186a 100644 --- a/src/Orchard.Web/Modules/Orchard.Packaging/Services/IPackageExpander.cs +++ b/src/Orchard.Web/Modules/Orchard.Packaging/Services/IPackageInstaller.cs @@ -1,6 +1,3 @@ -using System.IO; -using Orchard.Environment.Extensions; - namespace Orchard.Packaging.Services { public class PackageInfo { public string ExtensionName { get; set; } @@ -9,7 +6,8 @@ namespace Orchard.Packaging.Services { public string ExtensionPath { get; set; } } - public interface IPackageExpander : IDependency { - PackageInfo ExpandPackage(string packageId, string version, string location, string solutionFolder); + public interface IPackageInstaller : IDependency { + PackageInfo Install(string packageId, string version, string location, string solutionFolder); + void Uninstall(string packageId, string solutionFolder); } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Packaging/Services/IPackageManager.cs b/src/Orchard.Web/Modules/Orchard.Packaging/Services/IPackageManager.cs index c9f430931..37e9a06a0 100644 --- a/src/Orchard.Web/Modules/Orchard.Packaging/Services/IPackageManager.cs +++ b/src/Orchard.Web/Modules/Orchard.Packaging/Services/IPackageManager.cs @@ -1,9 +1,7 @@ -using System; -using System.IO; - namespace Orchard.Packaging.Services { public interface IPackageManager : IDependency { PackageData Harvest(string extensionName); PackageInfo Install(string packageId, string version, string location, string solutionFolder); + void Uninstall(string packageId, string solutionFolder); } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Packaging/Services/PackageExpander.cs b/src/Orchard.Web/Modules/Orchard.Packaging/Services/PackageInstaller.cs similarity index 52% rename from src/Orchard.Web/Modules/Orchard.Packaging/Services/PackageExpander.cs rename to src/Orchard.Web/Modules/Orchard.Packaging/Services/PackageInstaller.cs index 9c9447c3e..55c328571 100644 --- a/src/Orchard.Web/Modules/Orchard.Packaging/Services/PackageExpander.cs +++ b/src/Orchard.Web/Modules/Orchard.Packaging/Services/PackageInstaller.cs @@ -8,20 +8,23 @@ using NuGetPackageManager = NuGet.PackageManager; namespace Orchard.Packaging.Services { [OrchardFeature("PackagingServices")] - public class PackageExpander : IPackageExpander { + public class PackageInstaller : IPackageInstaller { + private const string PackagesPath = "packages"; + private const string ProjectPath = "Orchard.Web"; + private readonly INotifier _notifier; - public PackageExpander(INotifier notifier) { + public PackageInstaller(INotifier notifier) { _notifier = notifier; T = NullLocalizer.Instance; } public Localizer T { get; set; } - public PackageInfo ExpandPackage(string packageId, string version, string location, string solutionFolder) { + public PackageInfo Install(string packageId, string version, string location, string solutionFolder) { - var packagesPath = Path.Combine(solutionFolder, "packages"); // where to download/uncompress packages - var projectPath = Path.Combine(solutionFolder, "Orchard.Web"); // where to install packages (in the project's folder) + var packagesPath = Path.Combine(solutionFolder, PackagesPath); // where to download/uncompress packages + var projectPath = Path.Combine(solutionFolder, ProjectPath); // where to install packages (in the project's folder) var logger = new NugetLogger(_notifier); // instantiates the appropriate package repository @@ -61,5 +64,31 @@ namespace Orchard.Packaging.Services { }; } + public void Uninstall(string packageId, string solutionFolder) { + var packagesPath = Path.Combine(solutionFolder, PackagesPath); // where to download/uncompress packages + var projectPath = Path.Combine(solutionFolder, ProjectPath); // where to install packages (in the project's folder) + var logger = new NugetLogger(_notifier); + + // instantiates the appropriate package repository + var packageRepository = PackageRepositoryFactory.Default.CreateRepository(new PackageSource("Default", packagesPath)); + + var packageManager = new NuGetPackageManager( + packageRepository, + new DefaultPackagePathResolver(packagesPath), + new PhysicalFileSystem(packagesPath) { Logger = logger } + ) { Logger = logger }; + + // specifically tells to ignore dependencies + packageManager.UninstallPackage(packageId); + + var projectManager = new ProjectManager( + new LocalPackageRepository(packagesPath), // source repository for the package to install + new DefaultPackagePathResolver(packagesPath), + new FileBasedProjectSystem(projectPath) { Logger = logger } // the location of the project (where to copy the content files) + ) { Logger = logger }; + + // add the package to the project + projectManager.RemovePackageReference(packageId); + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Packaging/Services/PackageManager.cs b/src/Orchard.Web/Modules/Orchard.Packaging/Services/PackageManager.cs index e3d9656d9..6c7eebd33 100644 --- a/src/Orchard.Web/Modules/Orchard.Packaging/Services/PackageManager.cs +++ b/src/Orchard.Web/Modules/Orchard.Packaging/Services/PackageManager.cs @@ -7,12 +7,12 @@ namespace Orchard.Packaging.Services { public class PackageManager : IPackageManager { private readonly IExtensionManager _extensionManager; private readonly IPackageBuilder _packageBuilder; - private readonly IPackageExpander _packageExpander; + private readonly IPackageInstaller _packageExpander; public PackageManager( IExtensionManager extensionManager, IPackageBuilder packageBuilder, - IPackageExpander packageExpander) { + IPackageInstaller packageExpander) { _extensionManager = extensionManager; _packageBuilder = packageBuilder; _packageExpander = packageExpander; @@ -34,9 +34,12 @@ namespace Orchard.Packaging.Services { } public PackageInfo Install(string packageId, string version, string location, string solutionFolder) { - return _packageExpander.ExpandPackage(packageId, version, location, solutionFolder); + return _packageExpander.Install(packageId, version, location, solutionFolder); } + public void Uninstall(string packageId, string solutionFolder) { + _packageExpander.Uninstall(packageId, solutionFolder); + } #endregion } } \ No newline at end of file