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
+
+
+
+
+
+