diff --git a/src/Orchard.Web/Modules/Orchard.Modules/Controllers/AdminController.cs b/src/Orchard.Web/Modules/Orchard.Modules/Controllers/AdminController.cs index 867082e3f..54062264e 100644 --- a/src/Orchard.Web/Modules/Orchard.Modules/Controllers/AdminController.cs +++ b/src/Orchard.Web/Modules/Orchard.Modules/Controllers/AdminController.cs @@ -63,11 +63,13 @@ namespace Orchard.Modules.Controllers { foreach (string fileName in Request.Files) { var file = Request.Files[fileName]; - +#if REFACTORING var info = _packageManager.Install(file.InputStream); + Services.Notifier.Information(T("Installed package \"{0}\", version {1} of type \"{2}\" at location \"{3}\"", info.ExtensionName, info.ExtensionVersion, info.ExtensionType, info.ExtensionPath)); - } +#endif + } return RedirectToAction("index"); } diff --git a/src/Orchard.Web/Modules/Orchard.Packaging/Commands/PackagingCommands.cs b/src/Orchard.Web/Modules/Orchard.Packaging/Commands/PackagingCommands.cs index f24e6bd02..77034404d 100644 --- a/src/Orchard.Web/Modules/Orchard.Packaging/Commands/PackagingCommands.cs +++ b/src/Orchard.Web/Modules/Orchard.Packaging/Commands/PackagingCommands.cs @@ -10,7 +10,7 @@ namespace Orchard.Packaging.Commands { [OrchardFeature("Orchard.Packaging")] public class PackagingCommands : DefaultOrchardCommandHandler { private static readonly string OrchardWebProj = HostingEnvironment.MapPath("~/Orchard.Web.csproj"); - private const string PackagePath = "Packages"; + private const string CreatePackagePath = "CreatedPackages"; private readonly IPackageManager _packageManager; @@ -29,7 +29,7 @@ namespace Orchard.Packaging.Commands { // append "Orchard.[ExtensionType]" to prevent conflicts with other packages (e.g, TinyMce, jQuery, ...) var filename = string.Format("Orchard.{0}.{1}.{2}.nupkg", packageData.ExtensionType, packageData.ExtensionName, packageData.ExtensionVersion); - var packagePath = Path.Combine(Directory.GetParent(OrchardWebProj).FullName, PackagePath); + var packagePath = Path.Combine(GetSolutionFolder(), CreatePackagePath); if(!Directory.Exists(packagePath)) { Directory.CreateDirectory(packagePath); @@ -54,10 +54,12 @@ namespace Orchard.Packaging.Commands { Context.Output.WriteLine(T("File \"{0}\" does not exist.", filename)); } - using (var stream = File.Open(filename, FileMode.Open, FileAccess.Read)) { - var packageInfo = _packageManager.Install(stream); - Context.Output.WriteLine(T("Package \"{0}\" successfully installed at \"{1}\"", packageInfo.ExtensionName, packageInfo.ExtensionPath)); - } + var packageInfo = _packageManager.Install(filename, GetSolutionFolder()); + Context.Output.WriteLine(T("Package \"{0}\" successfully installed at \"{1}\"", packageInfo.ExtensionName, packageInfo.ExtensionPath)); + } + + private string GetSolutionFolder() { + return Directory.GetParent(OrchardWebProj).Parent.FullName; } } } diff --git a/src/Orchard.Web/Modules/Orchard.Packaging/Controllers/GalleryController.cs b/src/Orchard.Web/Modules/Orchard.Packaging/Controllers/GalleryController.cs index ecec1329b..ecc8b7941 100644 --- a/src/Orchard.Web/Modules/Orchard.Packaging/Controllers/GalleryController.cs +++ b/src/Orchard.Web/Modules/Orchard.Packaging/Controllers/GalleryController.cs @@ -167,9 +167,11 @@ namespace Orchard.Packaging.Controllers { } public ActionResult Install(string syndicationId, string cameFrom) { +#if REFACTORING var packageData = _packageManager.Download(syndicationId); _packageManager.Install(packageData.PackageStream); _notifier.Information(T("Installed module")); +#endif return RedirectToAction(cameFrom == "Themes" ? "ThemesIndex" : "ModulesIndex"); } } diff --git a/src/Orchard.Web/Modules/Orchard.Packaging/Services/IPackageExpander.cs b/src/Orchard.Web/Modules/Orchard.Packaging/Services/IPackageExpander.cs index 6735e8b26..ef9137bc1 100644 --- a/src/Orchard.Web/Modules/Orchard.Packaging/Services/IPackageExpander.cs +++ b/src/Orchard.Web/Modules/Orchard.Packaging/Services/IPackageExpander.cs @@ -10,6 +10,6 @@ namespace Orchard.Packaging.Services { } public interface IPackageExpander : IDependency { - PackageInfo ExpandPackage(Stream packageStream); + PackageInfo ExpandPackage(string packageId, string version, string location, string destination); } } \ 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 9e0ace57a..689a68272 100644 --- a/src/Orchard.Web/Modules/Orchard.Packaging/Services/IPackageManager.cs +++ b/src/Orchard.Web/Modules/Orchard.Packaging/Services/IPackageManager.cs @@ -6,6 +6,6 @@ namespace Orchard.Packaging.Services { PackageData Download(string feedItemId); void Push(PackageData packageData, string feedUrl, string login, string password); - PackageInfo Install(Stream packageStream); + PackageInfo Install(string filename, string destination); } } \ 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/PackageExpander.cs index 1aecaf388..b18d59ed8 100644 --- a/src/Orchard.Web/Modules/Orchard.Packaging/Services/PackageExpander.cs +++ b/src/Orchard.Web/Modules/Orchard.Packaging/Services/PackageExpander.cs @@ -4,10 +4,13 @@ using System.IO; using System.Linq; using System.Reflection; using System.Xml.Linq; +using NuGet; using Orchard.Environment.Extensions; using Orchard.FileSystems.VirtualPath; using Orchard.Localization; +using NuGetPackageManager = NuGet.PackageManager; + namespace Orchard.Packaging.Services { [OrchardFeature("PackagingServices")] public class PackageExpander : IPackageExpander { @@ -23,10 +26,49 @@ namespace Orchard.Packaging.Services { public Localizer T { get; set; } - public PackageInfo ExpandPackage(Stream packageStream) { + public PackageInfo ExpandPackage(string packageId, string version, string location, string destination) { var context = new ExpandContext(); - BeginPackage(context, packageStream); + + var packagesPath = Path.Combine(destination, "packages"); + var projectPath = Path.Combine(destination, "Orchard.Web"); + + BeginPackage(context, packageId, version, location, packagesPath); try { + + var packageRepository = Uri.IsWellFormedUriString(location, UriKind.Absolute) + ? new DataServicePackageRepository(new Uri(location)) + : new LocalPackageRepository(location) as IPackageRepository; + + var package = packageRepository.FindPackage(packageId, exactVersion: new Version(version)); + + if(package == null) { + throw new ArgumentException(T("The specified package could not be found: {0}.{1}", packageId, version).Text); + } + + context.ExtensionName = package.Title; + context.ExtensionVersion = package.Version.ToString(); + context.TargetPath = projectPath; + + // packageManager.InstallPackage(package, ignoreDependencies: true); + + //var packageManager = new NuGetPackageManager( + // packageRepository, + // new DefaultPackagePathResolver(location), + // new FileBasedProjectSystem(packagesPath) + //); + + var projectManager = new ProjectManager( + packageRepository, // source repository for the package to install + new DefaultPackagePathResolver(location), + new FileBasedProjectSystem(projectPath), // the location of the project (where to copy the content files) + new LocalPackageRepository(packagesPath) // the location of the uncompressed package, used to check if the package is already installed + ); + + // add the package to the project + projectManager.AddPackageReference(packageId, new Version(version)); + + +#if REFACTORING GetCoreProperties(context); EstablishPaths(context, _virtualPathProvider); @@ -40,6 +82,7 @@ namespace Orchard.Packaging.Services { // this is a simple theme with no csproj ExtractThemeFiles(context); } +#endif } finally { EndPackage(context); @@ -148,14 +191,8 @@ namespace Orchard.Packaging.Services { return true; } - private void BeginPackage(ExpandContext context, Stream packageStream) { - if (packageStream.CanSeek) { - context.Stream = packageStream; - } - else { - context.Stream = new MemoryStream(); - packageStream.CopyTo(context.Stream); - } + private void BeginPackage(ExpandContext context, string packageId, string version, string location, string destination) { + #if REFACTORING context.Package = Package.Open(context.Stream, FileMode.Open, FileAccess.Read); #endif diff --git a/src/Orchard.Web/Modules/Orchard.Packaging/Services/PackageManager.cs b/src/Orchard.Web/Modules/Orchard.Packaging/Services/PackageManager.cs index 7c072b92a..11846277c 100644 --- a/src/Orchard.Web/Modules/Orchard.Packaging/Services/PackageManager.cs +++ b/src/Orchard.Web/Modules/Orchard.Packaging/Services/PackageManager.cs @@ -5,6 +5,7 @@ using System.Net; using System.Text; using Orchard.Environment.Extensions; using Orchard.Environment.Extensions.Models; +using System.Text.RegularExpressions; namespace Orchard.Packaging.Services { [OrchardFeature("PackagingServices")] @@ -82,8 +83,14 @@ namespace Orchard.Packaging.Services { #endif } - public PackageInfo Install(Stream packageStream) { - return _packageExpander.ExpandPackage(packageStream); + public PackageInfo Install(string filename, string destination) { + var name = Path.GetFileNameWithoutExtension(filename); + + string version = String.Join(".", name.Split('.').Reverse().TakeWhile(part => part.All(Char.IsDigit)).Take(4).Reverse().ToArray()); + string packageId = name.Substring(0, name.Length - version.Length -1); + string location = Path.GetDirectoryName(filename); + + return _packageExpander.ExpandPackage(packageId, version, location, destination); } #endregion