diff --git a/.hgsub b/.hgsub index e69de29bb..b56970a41 100644 --- a/.hgsub +++ b/.hgsub @@ -0,0 +1 @@ +external/nuget = https://hg01.codeplex.com/nuget diff --git a/.hgsubstate b/.hgsubstate index e69de29bb..24976cad6 100644 --- a/.hgsubstate +++ b/.hgsubstate @@ -0,0 +1 @@ +faab9e4b2d3b9615fe9ac3b9eae71555a4e13131 external/nuget diff --git a/.hgtags b/.hgtags index e2628fbe5..83c01b25d 100644 --- a/.hgtags +++ b/.hgtags @@ -1,4 +1,8 @@ e048b594f33613d53b59a3578d17511dc833ecb5 MIX10 a6b8d094848d4efee67c787e52e5f7d358e3f0c1 0.5 48d6ca62955335ce6a51859d5fab43b3b48d1911 0.8 +48d6ca62955335ce6a51859d5fab43b3b48d1911 0.8 +0000000000000000000000000000000000000000 0.8 +0000000000000000000000000000000000000000 0.8 +083d09cd94a7c9175272fba453a156673be9db78 0.8 523f3564d2c053ff068970eab8c64eaf74e3dcec perf baseline diff --git a/src/Orchard.Tests.Modules/Orchard.Tests.Modules.csproj b/src/Orchard.Tests.Modules/Orchard.Tests.Modules.csproj index 43505d7f3..c6f555fc1 100644 --- a/src/Orchard.Tests.Modules/Orchard.Tests.Modules.csproj +++ b/src/Orchard.Tests.Modules/Orchard.Tests.Modules.csproj @@ -122,11 +122,15 @@ + + + + @@ -164,6 +168,10 @@ {17F86780-9A1F-4AA1-86F1-875EEC2730C7} Orchard.Modules + + {DFD137A2-DDB5-4D22-BE0D-FA9AD4C8B059} + Orchard.Packaging + {D10AD48F-407D-4DB5-A328-173EC7CB010F} Orchard.Roles @@ -206,7 +214,9 @@ true - + + + + + + + + + + + False + True + 40980 + / + + + False + True + http://orchard.codeplex.com + False + + + + + diff --git a/src/Orchard.Tests.Modules/Packaging/HelloDriver.cs.txt b/src/Orchard.Tests.Modules/Packaging/HelloDriver.cs.txt new file mode 100644 index 000000000..a376f809f --- /dev/null +++ b/src/Orchard.Tests.Modules/Packaging/HelloDriver.cs.txt @@ -0,0 +1,9 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Orchard.Tests.Modules.Packaging { + class HelloDriver { + } +} diff --git a/src/Orchard.Tests.Modules/Packaging/Migrations.cs.txt b/src/Orchard.Tests.Modules/Packaging/Migrations.cs.txt new file mode 100644 index 000000000..0c6c2a98b --- /dev/null +++ b/src/Orchard.Tests.Modules/Packaging/Migrations.cs.txt @@ -0,0 +1,9 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Orchard.Tests.Modules.Packaging { + class Migrations { + } +} diff --git a/src/Orchard.Tests.Modules/Packaging/PackageBuilderTests.cs b/src/Orchard.Tests.Modules/Packaging/PackageBuilderTests.cs new file mode 100644 index 000000000..134e7ff93 --- /dev/null +++ b/src/Orchard.Tests.Modules/Packaging/PackageBuilderTests.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.IO.Packaging; +using System.Linq; +using System.Text; +using Autofac; +using NUnit.Framework; +using Orchard.Environment.Extensions; +using Orchard.Environment.Extensions.Models; +using Orchard.FileSystems.WebSite; +using Orchard.Packaging.Services; +using Orchard.Tests.Stubs; + +namespace Orchard.Tests.Modules.Packaging { + [TestFixture] + public class PackageBuilderTests : ContainerTestBase { + protected override void Register(Autofac.ContainerBuilder builder) { + builder.RegisterType().As(); + builder.RegisterType().As() + .As().InstancePerLifetimeScope(); + } + + private Stream BuildHelloWorld(IPackageBuilder packageBuilder) { + return packageBuilder.BuildPackage(new ExtensionDescriptor { + ExtensionType = "Module", + Name = "Hello.World", + Version = "1.0", + Description = "a", + Author = "b" + }); + } + + [Test] + public void PackageForModuleIsOpcPackage() { + var packageBuilder = _container.Resolve(); + var stream = BuildHelloWorld(packageBuilder); + + var package = Package.Open(stream); + Assert.That(package, Is.Not.Null); + Assert.That(package.PackageProperties.Identifier, Is.EqualTo("Orchard.Module.Hello.World")); + } + + [Test] + public void PropertiesPassThroughAsExpected() { + var packageBuilder = _container.Resolve(); + var stream = BuildHelloWorld(packageBuilder); + + var package = Package.Open(stream); + Assert.That(package.PackageProperties.Description, Is.EqualTo("a")); + Assert.That(package.PackageProperties.Creator, Is.EqualTo("b")); + Assert.That(package.PackageProperties.Version, Is.EqualTo("1.0")); + } + + [Test] + public void ProjectFileIsAdded() { + var packageBuilder = _container.Resolve(); + var folder = _container.Resolve(); + string content; + using (var sourceStream = GetType().Assembly.GetManifestResourceStream(GetType(), "Hello.World.csproj.txt")) { + content = new StreamReader(sourceStream).ReadToEnd(); + } + folder.AddFile("~/Modules/Hello.World/Hello.World.csproj", content); + + var stream = BuildHelloWorld(packageBuilder); + + var package = Package.Open(stream); + var projectUri = PackUriHelper.CreatePartUri(new Uri("/Content/Modules/Hello.World/Hello.World.csproj", UriKind.Relative)); + var projectPart = package.GetPart(projectUri); + using (var projectStream = projectPart.GetStream()) { + var projectContent = new StreamReader(projectStream).ReadToEnd(); + Assert.That(projectContent, Is.EqualTo(content)); + } + } + + } +} diff --git a/src/Orchard.Tests.Modules/Packaging/PackageExpanderTests.cs b/src/Orchard.Tests.Modules/Packaging/PackageExpanderTests.cs new file mode 100644 index 000000000..f5d3a96fa --- /dev/null +++ b/src/Orchard.Tests.Modules/Packaging/PackageExpanderTests.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.IO.Packaging; +using System.Linq; +using System.Text; +using Autofac; +using NUnit.Framework; +using Orchard.Environment.Extensions; +using Orchard.Environment.Extensions.Models; +using Orchard.FileSystems.VirtualPath; +using Orchard.FileSystems.WebSite; +using Orchard.Packaging.Services; +using Orchard.Services; +using Orchard.Tests.Stubs; + +namespace Orchard.Tests.Modules.Packaging { + [TestFixture] + public class PackageExpanderTests : ContainerTestBase { + protected override void Register(Autofac.ContainerBuilder builder) { + builder.RegisterType().As(); + builder.RegisterType().As(); + builder.RegisterInstance(new StubVirtualPathProvider(new StubFileSystem(new Clock()))); + builder.RegisterType().As() + .As().InstancePerLifetimeScope(); + } + + private Stream BuildHelloWorld(IPackageBuilder packageBuilder) { + return packageBuilder.BuildPackage(new ExtensionDescriptor { + ExtensionType = "Module", + Name = "Hello.World", + Version = "1.0", + Description = "a", + Author = "b" + }); + } + } +} diff --git a/src/Orchard.Tests/Orchard.Framework.Tests.csproj b/src/Orchard.Tests/Orchard.Framework.Tests.csproj index a20c98878..1b2f8d313 100644 --- a/src/Orchard.Tests/Orchard.Framework.Tests.csproj +++ b/src/Orchard.Tests/Orchard.Framework.Tests.csproj @@ -246,6 +246,7 @@ + diff --git a/src/Orchard.Tests/Stubs/InMemoryWebSiteFolder.cs b/src/Orchard.Tests/Stubs/InMemoryWebSiteFolder.cs new file mode 100644 index 000000000..2a5fa7d79 --- /dev/null +++ b/src/Orchard.Tests/Stubs/InMemoryWebSiteFolder.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using Orchard.Caching; +using Orchard.FileSystems.WebSite; + +namespace Orchard.Tests.Stubs { + public class InMemoryWebSiteFolder : IWebSiteFolder { + Dictionary _contents = new Dictionary(StringComparer.OrdinalIgnoreCase); + + public void AddFile(string virtualPath, string contents) { + _contents[Canonical(virtualPath)] = contents; + } + + private string Canonical(string virtualPath) { + return virtualPath.Replace("\\", "/"); + } + + public IEnumerable ListDirectories(string virtualPath) { + throw new NotImplementedException(); + } + + public IEnumerable ListFiles(string virtualPath, bool recursive) { + throw new NotImplementedException(); + } + + public bool FileExists(string virtualPath) { + return _contents.ContainsKey(virtualPath); + } + + public string ReadFile(string virtualPath) { + string value; + return _contents.TryGetValue(Canonical(virtualPath), out value) ? value : null; + } + + public string ReadFile(string virtualPath, bool actualContent) { + throw new NotImplementedException(); + } + + public void CopyFileTo(string virtualPath, Stream destination) { + string value; + if (_contents.TryGetValue(Canonical(virtualPath), out value)) { + var bytes = Encoding.Default.GetBytes(value); + destination.Write(bytes, 0, bytes.Length); + } + } + + public void CopyFileTo(string virtualPath, Stream destination, bool actualContent) { + throw new NotImplementedException(); + } + + public IVolatileToken WhenPathChanges(string virtualPath) { + throw new NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Modules/Controllers/AdminController.cs b/src/Orchard.Web/Modules/Orchard.Modules/Controllers/AdminController.cs index 99808b43b..edd49f32c 100644 --- a/src/Orchard.Web/Modules/Orchard.Modules/Controllers/AdminController.cs +++ b/src/Orchard.Web/Modules/Orchard.Modules/Controllers/AdminController.cs @@ -76,11 +76,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/AdminMenu.cs b/src/Orchard.Web/Modules/Orchard.Packaging/AdminMenu.cs index 7730c5087..f34d93011 100644 --- a/src/Orchard.Web/Modules/Orchard.Packaging/AdminMenu.cs +++ b/src/Orchard.Web/Modules/Orchard.Packaging/AdminMenu.cs @@ -12,9 +12,9 @@ namespace Orchard.Packaging { public void GetNavigation(NavigationBuilder builder) { builder.Add(T("Gallery"), "30", menu => menu .Add(T("Modules"), "1.0", item => item - .Action("ModulesIndex", "Gallery", new { area = "Orchard.Packaging" })) + .Action("Modules", "Gallery", new { area = "Orchard.Packaging" })) .Add(T("Themes"), "2.0", item => item - .Action("ThemesIndex", "Gallery", new { area = "Orchard.Packaging" })) + .Action("Themes", "Gallery", new { area = "Orchard.Packaging" })) .Add(T("Feeds"), "3.0", item => item .Action("Sources", "Gallery", new { area = "Orchard.Packaging" }))); } diff --git a/src/Orchard.Web/Modules/Orchard.Packaging/Commands/GalleryCommands.cs b/src/Orchard.Web/Modules/Orchard.Packaging/Commands/GalleryCommands.cs deleted file mode 100644 index 845fae08f..000000000 --- a/src/Orchard.Web/Modules/Orchard.Packaging/Commands/GalleryCommands.cs +++ /dev/null @@ -1,105 +0,0 @@ -using System; -using System.IO; -using System.Net; -using Orchard.Commands; -using Orchard.Environment.Extensions; -using Orchard.Packaging.Services; - -namespace Orchard.Packaging.Commands { - [OrchardFeature("Gallery")] - public class GalleryCommands : DefaultOrchardCommandHandler { - private readonly IPackageManager _packageManager; - - [OrchardSwitch] - public string User { get; set; } - - [OrchardSwitch] - public string Password { get; set; } - - public GalleryCommands(IPackageManager packageManager) { - _packageManager = packageManager; - } - -#if false - [CommandHelp("harvest \r\n\t" + "Package a module into a distributable")] - [CommandName("harvest")] - public void PackageCreate(string moduleName) { - var packageData = _packageManager.Harvest(moduleName); - if (packageData.PackageStream.CanSeek) - packageData.PackageStream.Seek(0, SeekOrigin.Begin); - - const int chunk = 512; - var dataBuffer = new byte[3 * chunk]; - var charBuffer = new char[4 * chunk + 2]; - for (; ; ) { - var dataCount = packageData.PackageStream.Read(dataBuffer, 0, dataBuffer.Length); - if (dataCount <= 0) - return; - - var charCount = Convert.ToBase64CharArray(dataBuffer, 0, dataCount, charBuffer, 0); - Context.Output.Write(charBuffer, 0, charCount); - } - } -#endif - - [CommandHelp("gallery submit module /User: /Password:\r\n\t" + "Package a module into a distributable and push it to a feed server.")] - [CommandName("gallery submit module")] - [OrchardSwitches("User,Password")] - public void SubmitModule(string moduleName, string feedUrl) { - var packageData = _packageManager.Harvest(moduleName); - - if ( String.IsNullOrWhiteSpace(User) ) { - Context.Output.WriteLine(T("Missing or incorrect User")); - return; - } - - if ( String.IsNullOrWhiteSpace(Password) ) { - Context.Output.WriteLine(T("Missing or incorrect Password")); - return; - } - - try { - _packageManager.Push(packageData, feedUrl, User, Password); - Context.Output.WriteLine(T("Success")); - } - catch (WebException webException) { - string text = ""; - if (webException.Response != null) { - text = new StreamReader(webException.Response.GetResponseStream()).ReadToEnd(); - } - throw new ApplicationException(text); - } - } - - [CommandHelp("gallery submit package /User: /Password:\r\n\t" + "Push a packaged module to a feed server.")] - [CommandName("gallery submit package")] - [OrchardSwitches("User,Password")] - public void SubmitPackage(string filePath, string feedUrl) { - using (var stream = File.Open(filePath, FileMode.Open, FileAccess.Read)) { - var packageData = new PackageData { - PackageStream = stream - }; - - if ( String.IsNullOrWhiteSpace(User) ) { - Context.Output.WriteLine(T("Missing or incorrect User")); - return; - } - - if ( String.IsNullOrWhiteSpace(Password) ) { - Context.Output.WriteLine(T("Missing or incorrect Password")); - return; - } - - try { - _packageManager.Push(packageData, feedUrl, User, Password); - Context.Output.WriteLine(T("Success")); - } - catch (WebException webException) { - var text = new StreamReader(webException.Response.GetResponseStream()).ReadToEnd(); - throw new ApplicationException(text); - } - } - } - } -} - diff --git a/src/Orchard.Web/Modules/Orchard.Packaging/Commands/PackagingCommands.cs b/src/Orchard.Web/Modules/Orchard.Packaging/Commands/PackagingCommands.cs index e7720ff51..1e1ef1c59 100644 --- a/src/Orchard.Web/Modules/Orchard.Packaging/Commands/PackagingCommands.cs +++ b/src/Orchard.Web/Modules/Orchard.Packaging/Commands/PackagingCommands.cs @@ -1,4 +1,5 @@ using System.IO; +using System.Web.Hosting; using Orchard.Commands; using Orchard.Environment.Extensions; using Orchard.Packaging.Services; @@ -7,28 +8,40 @@ using Orchard.UI.Notify; namespace Orchard.Packaging.Commands { [OrchardFeature("Orchard.Packaging")] public class PackagingCommands : DefaultOrchardCommandHandler { - private readonly IPackageManager _packageManager; + private static readonly string OrchardWebProj = HostingEnvironment.MapPath("~/Orchard.Web.csproj"); + private const string CreatePackagePath = "CreatedPackages"; - public PackagingCommands(IPackageManager packageManager) { + private readonly IPackageManager _packageManager; + private readonly INotifier _notifier; + + public PackagingCommands(IPackageManager packageManager, INotifier notifier) { _packageManager = packageManager; + _notifier = notifier; } [OrchardSwitch] - public string Filename { get; set; } + public string Version { get; set; } - [CommandHelp("package create \r\n\t" + "Create a package for the module . The default filename is -.zip.")] + [CommandHelp("package create \r\n\t" + "Create a package for the module . The default filename is Orchard....nupkg.")] [CommandName("package create")] - [OrchardSwitches("Filename")] - public void CreatePackage(string moduleName) { - var packageData = _packageManager.Harvest(moduleName); + public void CreatePackage(string extensionName, string path) { + var packageData = _packageManager.Harvest(extensionName); if (packageData == null) { - Context.Output.WriteLine(T("Module \"{0}\" does not exist in this Orchard installation.", moduleName)); + Context.Output.WriteLine(T("Module or Theme \"{0}\" does not exist in this Orchard installation.", extensionName)); return; } - var filename = string.Format("{0}-{1}.zip", packageData.ExtensionName, packageData.ExtensionVersion); + // 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); - using(var stream = File.Create(filename)) { + if ( !Directory.Exists(path) ) { + Directory.CreateDirectory(path); + } + + // packages are created in a specific folder otherwise they are in /bin, which crashed the current shell + filename = Path.Combine(path, filename); + + using ( var stream = File.Create(filename) ) { packageData.PackageStream.CopyTo(stream); stream.Close(); } @@ -37,17 +50,41 @@ namespace Orchard.Packaging.Commands { Context.Output.WriteLine(T("Package \"{0}\" successfully created", fileInfo.FullName)); } - [CommandHelp("package install \r\n\t" + "Install a module from a package .")] + [CommandHelp("package install /Version: \r\n\t" + "Install a module or a theme from a package file.")] [CommandName("package install")] - public void InstallPackage(string filename) { - if (!File.Exists(filename)) { - Context.Output.WriteLine(T("File \"{0}\" does not exist.", filename)); + [OrchardSwitches("Version")] + public void InstallPackage(string packageId, string location) { + var solutionFolder = GetSolutionFolder(); + + if(solutionFolder == null) { + Context.Output.WriteLine(T("The project's location is not supported")); } - 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)); + _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/Controllers/GalleryController.cs b/src/Orchard.Web/Modules/Orchard.Packaging/Controllers/GalleryController.cs index ecec1329b..2289eee42 100644 --- a/src/Orchard.Web/Modules/Orchard.Packaging/Controllers/GalleryController.cs +++ b/src/Orchard.Web/Modules/Orchard.Packaging/Controllers/GalleryController.cs @@ -15,6 +15,7 @@ namespace Orchard.Packaging.Controllers { [OrchardFeature("Gallery")] [Themed, Admin] public class GalleryController : Controller { + private readonly IPackageManager _packageManager; private readonly IPackagingSourceManager _packagingSourceManager; private readonly IExtensionManager _extensionManager; @@ -34,24 +35,15 @@ namespace Orchard.Packaging.Controllers { Localizer T { get; set; } - public ActionResult ModulesIndex() { - return Modules(Guid.Empty); - } - - public ActionResult ThemesIndex() { - return Themes(Guid.Empty); - } - public ActionResult Sources() { return View(new PackagingSourcesViewModel { Sources = _packagingSourceManager.GetSources(), }); } - public ActionResult Remove(Guid id) { + public ActionResult Remove(int id) { _packagingSourceManager.RemoveSource(id); _notifier.Information(T("The feed has been removed successfully.")); - Update(null); return RedirectToAction("Sources"); } @@ -92,9 +84,9 @@ namespace Orchard.Packaging.Controllers { if ( !ModelState.IsValid ) return View(new PackagingAddSourceViewModel { Url = url }); - _packagingSourceManager.AddSource(new PackagingSource { Id = Guid.NewGuid(), FeedUrl = url, FeedTitle = title }); + _packagingSourceManager.AddSource(title, url); _notifier.Information(T("The feed has been added successfully.")); - Update(null); + return RedirectToAction("Sources"); } catch ( Exception exception ) { @@ -104,32 +96,36 @@ namespace Orchard.Packaging.Controllers { } - public ActionResult Modules(Guid? sourceId) { + public ActionResult Modules(int? sourceId) { var selectedSource = _packagingSourceManager.GetSources().Where(s => s.Id == sourceId).FirstOrDefault(); - return View("Modules", new PackagingModulesViewModel { - Modules = _packagingSourceManager.GetModuleList(selectedSource).Where(p => p.SyndicationItem.Categories.All(c => c.Name == "Orchard Module" || c.Name != "Orchard Theme")), + var sources = selectedSource != null + ? new [] { selectedSource } + : _packagingSourceManager.GetSources() + ; + + return View("Modules", new PackagingExtensionsViewModel { + Extensions = sources.SelectMany(source => _packagingSourceManager.GetModuleList(source)), Sources = _packagingSourceManager.GetSources().OrderBy(s => s.FeedTitle), SelectedSource = selectedSource }); } - public ActionResult Themes(Guid? sourceId) { + public ActionResult Themes(int? sourceId) { var selectedSource = _packagingSourceManager.GetSources().Where(s => s.Id == sourceId).FirstOrDefault(); - return View("Themes", new PackagingModulesViewModel { - Modules = _packagingSourceManager.GetModuleList(selectedSource).Where(p => p.SyndicationItem.Categories.Any(c => c.Name == "Orchard Theme")), + var sources = selectedSource != null + ? new[] { selectedSource } + : _packagingSourceManager.GetSources() + ; + + return View("Themes", new PackagingExtensionsViewModel { + Extensions = sources.SelectMany(source => _packagingSourceManager.GetThemeList(source)), Sources = _packagingSourceManager.GetSources().OrderBy(s => s.FeedTitle), SelectedSource = selectedSource }); } - public ActionResult Update(string cameFrom) { - _packagingSourceManager.UpdateLists(); - _notifier.Information(T("List of available modules and themes is updated.")); - return RedirectToAction(cameFrom == "Themes" ? "ThemesIndex" : "ModulesIndex"); - } - public ActionResult Harvest(string extensionName, string feedUrl) { return View(new PackagingHarvestViewModel { ExtensionName = extensionName, @@ -141,6 +137,7 @@ namespace Orchard.Packaging.Controllers { [HttpPost] public ActionResult Harvest(PackagingHarvestViewModel model) { + #if REFACTORING model.Sources = _packagingSourceManager.GetSources(); model.Extensions = _extensionManager.AvailableExtensions(); @@ -164,12 +161,18 @@ namespace Orchard.Packaging.Controllers { Update(null); return RedirectToAction("Harvest", new { model.ExtensionName, model.FeedUrl }); +#else + return View(); +#endif + } 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/DefaultPackagingUpdater.cs b/src/Orchard.Web/Modules/Orchard.Packaging/DefaultPackagingUpdater.cs index 0af950039..516a49f6f 100644 --- a/src/Orchard.Web/Modules/Orchard.Packaging/DefaultPackagingUpdater.cs +++ b/src/Orchard.Web/Modules/Orchard.Packaging/DefaultPackagingUpdater.cs @@ -4,23 +4,20 @@ using Orchard.Environment.Extensions; using Orchard.Environment.Extensions.Models; using Orchard.Localization; using Orchard.Packaging.Services; -using Orchard.UI.Notify; namespace Orchard.Packaging { - [OrchardFeature("Gallery")] + [OrchardFeature("PackagingServices")] public class DefaultPackagingUpdater : IFeatureEventHandler { private readonly IPackagingSourceManager _packagingSourceManager; - private readonly INotifier _notifier; - public DefaultPackagingUpdater(IPackagingSourceManager packagingSourceManager, INotifier notifier) { + public DefaultPackagingUpdater(IPackagingSourceManager packagingSourceManager) { _packagingSourceManager = packagingSourceManager; - _notifier = notifier; } public Localizer T { get; set; } public void Install(Feature feature) { - _packagingSourceManager.AddSource(new PackagingSource { Id = Guid.NewGuid(), FeedTitle = "Orchard Module Gallery", FeedUrl = "http://orchardproject.net/gallery08/feed" }); + _packagingSourceManager.AddSource( "Orchard Extensions Gallery", "http://feed.nuget.org/ctp2/odata/v1" ); } public void Enable(Feature feature) { diff --git a/src/Orchard.Web/Modules/Orchard.Packaging/Migrations.cs b/src/Orchard.Web/Modules/Orchard.Packaging/Migrations.cs new file mode 100644 index 000000000..6cb62c79b --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Packaging/Migrations.cs @@ -0,0 +1,18 @@ +using Orchard.Data.Migration; +using Orchard.Environment.Extensions; + +namespace Orchard.Packaging { + [OrchardFeature("PackagingServices")] + public class Migrations: DataMigrationImpl { + public int Create() { + SchemaBuilder.CreateTable("PackagingSourceRecord", + table => table + .Column("Id", column => column.PrimaryKey().Identity()) + .Column("FeedTitle", c => c.WithLength(255)) + .Column("FeedUrl", c => c.WithLength(2048)) + ); + + return 1; + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Packaging/Models/PackagingSource.cs b/src/Orchard.Web/Modules/Orchard.Packaging/Models/PackagingSource.cs new file mode 100644 index 000000000..070434df0 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Packaging/Models/PackagingSource.cs @@ -0,0 +1,7 @@ +namespace Orchard.Packaging.Models { + public class PackagingSource { + public virtual int Id { get; set; } + public virtual string FeedTitle { get; set; } + public virtual string FeedUrl { get; set; } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Packaging/Orchard.Packaging.csproj b/src/Orchard.Web/Modules/Orchard.Packaging/Orchard.Packaging.csproj index 9350824a9..e4d31f123 100644 --- a/src/Orchard.Web/Modules/Orchard.Packaging/Orchard.Packaging.csproj +++ b/src/Orchard.Web/Modules/Orchard.Packaging/Orchard.Packaging.csproj @@ -37,7 +37,9 @@ + + @@ -68,33 +70,32 @@ - - True - - + + + - + + - + - - + @@ -108,18 +109,17 @@ + - - - + + {F879F274-EFA0-4157-8404-33A19B4E6AEC} + NuPack.Core + {2D1D92BB-4555-4CBE-8D0E-63563D6CE4C6} Orchard.Framework - - - Designer @@ -135,6 +135,12 @@ Designer + + + + + +