Files
Orchard/src/Orchard.Web/Modules/Orchard.Packaging/Services/PackageInstaller.cs

160 lines
7.5 KiB
C#
Raw Normal View History

Move Orchard Packaging API to Orchard Frx We have decided to use OPC for Orchard packages, so it makes sense to move the API from Futures to the Frx. --HG-- branch : dev rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Services/AtomExtensions.cs => src/Orchard/Packaging/AtomExtensions.cs rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Services/IPackageBuilder.cs => src/Orchard/Packaging/IPackageBuilder.cs rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Services/IPackageExpander.cs => src/Orchard/Packaging/IPackageExpander.cs rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Services/IPackageManager.cs => src/Orchard/Packaging/IPackageManager.cs rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Services/IPackageSourceManager.cs => src/Orchard/Packaging/IPackageSourceManager.cs rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Services/PackageBuilder.cs => src/Orchard/Packaging/PackageBuilder.cs rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Services/PackageData.cs => src/Orchard/Packaging/PackageData.cs rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Services/PackageEntry.cs => src/Orchard/Packaging/PackageEntry.cs rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Services/PackageExpander.cs => src/Orchard/Packaging/PackageExpander.cs rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Services/PackageManager.cs => src/Orchard/Packaging/PackageManager.cs rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Services/PackageSource.cs => src/Orchard/Packaging/PackageSource.cs rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Services/PackageSourceManager.cs => src/Orchard/Packaging/PackageSourceManager.cs
2010-07-18 12:36:02 -07:00
using System;
using System.IO;
using System.Web.Hosting;
using NuGet;
Rename "Future.Modules.Packaging" to "Orchard.Packaging" --HG-- branch : dev rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/AdminMenu.cs => src/Orchard.Web/Modules/Orchard.Packaging/AdminMenu.cs rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Commands/PackagingCommands.cs => src/Orchard.Web/Modules/Orchard.Packaging/Commands/GalleryCommands.cs rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Commands/PackagingCommands.cs => src/Orchard.Web/Modules/Orchard.Packaging/Commands/PackagingCommands.cs rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Controllers/DownloadStreamResult.cs => src/Orchard.Web/Modules/Orchard.Packaging/Controllers/DownloadStreamResult.cs rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Controllers/PackagingController.cs => src/Orchard.Web/Modules/Orchard.Packaging/Controllers/PackagingController.cs rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Module.txt => src/Orchard.Web/Modules/Orchard.Packaging/Module.txt rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Futures.Modules.Packaging.csproj => src/Orchard.Web/Modules/Orchard.Packaging/Orchard.Packaging.csproj rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Properties/AssemblyInfo.cs => src/Orchard.Web/Modules/Orchard.Packaging/Properties/AssemblyInfo.cs rename : src/Orchard/Packaging/AtomExtensions.cs => src/Orchard.Web/Modules/Orchard.Packaging/Services/AtomExtensions.cs rename : src/Orchard/Packaging/IPackageBuilder.cs => src/Orchard.Web/Modules/Orchard.Packaging/Services/IPackageBuilder.cs rename : src/Orchard/Packaging/IPackageExpander.cs => src/Orchard.Web/Modules/Orchard.Packaging/Services/IPackageExpander.cs rename : src/Orchard/Packaging/IPackageManager.cs => src/Orchard.Web/Modules/Orchard.Packaging/Services/IPackageManager.cs rename : src/Orchard/Packaging/IPackagingSourceManager.cs => src/Orchard.Web/Modules/Orchard.Packaging/Services/IPackagingSourceManager.cs rename : src/Orchard/Packaging/PackageBuilder.cs => src/Orchard.Web/Modules/Orchard.Packaging/Services/PackageBuilder.cs rename : src/Orchard/Packaging/PackageData.cs => src/Orchard.Web/Modules/Orchard.Packaging/Services/PackageData.cs rename : src/Orchard/Packaging/PackageExpander.cs => src/Orchard.Web/Modules/Orchard.Packaging/Services/PackageExpander.cs rename : src/Orchard/Packaging/PackageManager.cs => src/Orchard.Web/Modules/Orchard.Packaging/Services/PackageManager.cs rename : src/Orchard/Packaging/PackagingEntry.cs => src/Orchard.Web/Modules/Orchard.Packaging/Services/PackagingEntry.cs rename : src/Orchard/Packaging/PackagingSource.cs => src/Orchard.Web/Modules/Orchard.Packaging/Services/PackagingSource.cs rename : src/Orchard/Packaging/PackagingSourceManager.cs => src/Orchard.Web/Modules/Orchard.Packaging/Services/PackagingSourceManager.cs rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/ViewModels/PackagingHarvestViewModel.cs => src/Orchard.Web/Modules/Orchard.Packaging/ViewModels/PackagingHarvestViewModel.cs rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/ViewModels/PackagingModulesViewModel.cs => src/Orchard.Web/Modules/Orchard.Packaging/ViewModels/PackagingModulesViewModel.cs rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/ViewModels/PackagingSourcesViewModel.cs => src/Orchard.Web/Modules/Orchard.Packaging/ViewModels/PackagingSourcesViewModel.cs rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Views/Packaging/Harvest.ascx => src/Orchard.Web/Modules/Orchard.Packaging/Views/Packaging/Harvest.ascx rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Views/Packaging/Modules.ascx => src/Orchard.Web/Modules/Orchard.Packaging/Views/Packaging/Modules.ascx rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Views/Packaging/Sources.ascx => src/Orchard.Web/Modules/Orchard.Packaging/Views/Packaging/Sources.ascx rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Views/Packaging/_Subnav.ascx => src/Orchard.Web/Modules/Orchard.Packaging/Views/Packaging/_Subnav.ascx rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Views/Web.config => src/Orchard.Web/Modules/Orchard.Packaging/Views/Web.config rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Web.config => src/Orchard.Web/Modules/Orchard.Packaging/Web.config
2010-07-22 22:09:34 -07:00
using Orchard.Environment.Extensions;
using Orchard.Environment.Extensions.Models;
using Orchard.Localization;
using Orchard.UI.Notify;
using NuGetPackageManager = NuGet.PackageManager;
Rename "Future.Modules.Packaging" to "Orchard.Packaging" --HG-- branch : dev rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/AdminMenu.cs => src/Orchard.Web/Modules/Orchard.Packaging/AdminMenu.cs rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Commands/PackagingCommands.cs => src/Orchard.Web/Modules/Orchard.Packaging/Commands/GalleryCommands.cs rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Commands/PackagingCommands.cs => src/Orchard.Web/Modules/Orchard.Packaging/Commands/PackagingCommands.cs rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Controllers/DownloadStreamResult.cs => src/Orchard.Web/Modules/Orchard.Packaging/Controllers/DownloadStreamResult.cs rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Controllers/PackagingController.cs => src/Orchard.Web/Modules/Orchard.Packaging/Controllers/PackagingController.cs rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Module.txt => src/Orchard.Web/Modules/Orchard.Packaging/Module.txt rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Futures.Modules.Packaging.csproj => src/Orchard.Web/Modules/Orchard.Packaging/Orchard.Packaging.csproj rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Properties/AssemblyInfo.cs => src/Orchard.Web/Modules/Orchard.Packaging/Properties/AssemblyInfo.cs rename : src/Orchard/Packaging/AtomExtensions.cs => src/Orchard.Web/Modules/Orchard.Packaging/Services/AtomExtensions.cs rename : src/Orchard/Packaging/IPackageBuilder.cs => src/Orchard.Web/Modules/Orchard.Packaging/Services/IPackageBuilder.cs rename : src/Orchard/Packaging/IPackageExpander.cs => src/Orchard.Web/Modules/Orchard.Packaging/Services/IPackageExpander.cs rename : src/Orchard/Packaging/IPackageManager.cs => src/Orchard.Web/Modules/Orchard.Packaging/Services/IPackageManager.cs rename : src/Orchard/Packaging/IPackagingSourceManager.cs => src/Orchard.Web/Modules/Orchard.Packaging/Services/IPackagingSourceManager.cs rename : src/Orchard/Packaging/PackageBuilder.cs => src/Orchard.Web/Modules/Orchard.Packaging/Services/PackageBuilder.cs rename : src/Orchard/Packaging/PackageData.cs => src/Orchard.Web/Modules/Orchard.Packaging/Services/PackageData.cs rename : src/Orchard/Packaging/PackageExpander.cs => src/Orchard.Web/Modules/Orchard.Packaging/Services/PackageExpander.cs rename : src/Orchard/Packaging/PackageManager.cs => src/Orchard.Web/Modules/Orchard.Packaging/Services/PackageManager.cs rename : src/Orchard/Packaging/PackagingEntry.cs => src/Orchard.Web/Modules/Orchard.Packaging/Services/PackagingEntry.cs rename : src/Orchard/Packaging/PackagingSource.cs => src/Orchard.Web/Modules/Orchard.Packaging/Services/PackagingSource.cs rename : src/Orchard/Packaging/PackagingSourceManager.cs => src/Orchard.Web/Modules/Orchard.Packaging/Services/PackagingSourceManager.cs rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/ViewModels/PackagingHarvestViewModel.cs => src/Orchard.Web/Modules/Orchard.Packaging/ViewModels/PackagingHarvestViewModel.cs rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/ViewModels/PackagingModulesViewModel.cs => src/Orchard.Web/Modules/Orchard.Packaging/ViewModels/PackagingModulesViewModel.cs rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/ViewModels/PackagingSourcesViewModel.cs => src/Orchard.Web/Modules/Orchard.Packaging/ViewModels/PackagingSourcesViewModel.cs rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Views/Packaging/Harvest.ascx => src/Orchard.Web/Modules/Orchard.Packaging/Views/Packaging/Harvest.ascx rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Views/Packaging/Modules.ascx => src/Orchard.Web/Modules/Orchard.Packaging/Views/Packaging/Modules.ascx rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Views/Packaging/Sources.ascx => src/Orchard.Web/Modules/Orchard.Packaging/Views/Packaging/Sources.ascx rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Views/Packaging/_Subnav.ascx => src/Orchard.Web/Modules/Orchard.Packaging/Views/Packaging/_Subnav.ascx rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Views/Web.config => src/Orchard.Web/Modules/Orchard.Packaging/Views/Web.config rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Web.config => src/Orchard.Web/Modules/Orchard.Packaging/Web.config
2010-07-22 22:09:34 -07:00
namespace Orchard.Packaging.Services {
[OrchardFeature("PackagingServices")]
public class PackageInstaller : IPackageInstaller {
private const string PackagesPath = "packages";
private const string SolutionFilename = "Orchard.sln";
private readonly INotifier _notifier;
private readonly IExtensionManager _extensionManager;
public PackageInstaller(INotifier notifier,
IExtensionManager extensionManager) {
_notifier = notifier;
_extensionManager = extensionManager;
T = NullLocalizer.Instance;
}
public Localizer T { get; set; }
public PackageInfo Install(string packageId, string version, string location, string applicationPath) {
// instantiates the appropriate package repository
IPackageRepository packageRepository = PackageRepositoryFactory.Default.CreateRepository(new PackageSource(location, "Default"));
// gets an IPackage instance from the repository
var packageVersion = String.IsNullOrEmpty(version) ? null : new Version(version);
var package = packageRepository.FindPackage(packageId, packageVersion);
if (package == null)
{
throw new ArgumentException(T("The specified package could not be found, id:{0} version:{1}", packageId, String.IsNullOrEmpty(version) ? T("No version").Text : version).Text);
}
return Install(package, packageRepository, location, applicationPath);
}
public PackageInfo Install(IPackage package, string location, string applicationPath) {
// instantiates the appropriate package repository
IPackageRepository packageRepository = PackageRepositoryFactory.Default.CreateRepository(new PackageSource(location, "Default"));
return Install(package, packageRepository, location, applicationPath);
}
protected PackageInfo Install(IPackage package, IPackageRepository packageRepository, string location, string applicationPath) {
// this logger is used to render NuGet's log on the notifier
var logger = new NugetLogger(_notifier);
bool installed = false;
// if we can access the parent directory, and the solution is inside, NuGet-install the package here
string solutionPath;
var installedPackagesPath = String.Empty;
if (TryGetSolutionPath(applicationPath, out solutionPath)) {
installedPackagesPath = Path.Combine(solutionPath, PackagesPath);
try {
var packageManager = new NuGetPackageManager(
packageRepository,
new DefaultPackagePathResolver(location),
new PhysicalFileSystem(installedPackagesPath) {Logger = logger}
) {Logger = logger};
packageManager.InstallPackage(package, true);
installed = true;
}
catch {
// installing the package at the solution level failed
}
}
// if the package got installed successfully, use it, otherwise use the previous repository
var sourceRepository = installed
? new LocalPackageRepository(installedPackagesPath)
: packageRepository;
var project = new FileBasedProjectSystem(applicationPath) { Logger = logger };
var projectManager = new ProjectManager(
sourceRepository, // source repository for the package to install
new DefaultPackagePathResolver(applicationPath),
project,
new ExtensionReferenceRepository(project, sourceRepository, _extensionManager)
) { Logger = logger };
// add the package to the project
projectManager.AddPackageReference(package.Id, package.Version);
return new PackageInfo
{
ExtensionName = package.Title ?? package.Id,
ExtensionVersion = package.Version.ToString(),
ExtensionType = package.Id.StartsWith(PackagingSourceManager.ThemesPrefix) ? DefaultExtensionTypes.Theme : DefaultExtensionTypes.Module,
ExtensionPath = applicationPath
};
}
public void Uninstall(string packageId, string applicationPath) {
// this logger is used to render NuGet's log on the notifier
var logger = new NugetLogger(_notifier);
string solutionPath;
// if we can access the parent directory, and the solution is inside, NuGet-uninstall the package here
if (TryGetSolutionPath(applicationPath, out solutionPath)) {
var installedPackagesPath = Path.Combine(solutionPath, PackagesPath);
var sourcePackageRepository = new LocalPackageRepository(installedPackagesPath);
var project = new FileBasedProjectSystem(applicationPath) { Logger = logger };
var projectManager = new ProjectManager(
sourcePackageRepository,
new DefaultPackagePathResolver(installedPackagesPath),
project,
new ExtensionReferenceRepository(project, sourcePackageRepository, _extensionManager)
) { Logger = logger };
// add the package to the project
projectManager.RemovePackageReference(packageId);
var packageManager = new NuGetPackageManager(
sourcePackageRepository,
new DefaultPackagePathResolver(applicationPath),
new PhysicalFileSystem(installedPackagesPath) { Logger = logger }
) { Logger = logger };
packageManager.UninstallPackage(packageId);
} else {
// otherwise delete the folder
string extensionPath = packageId.StartsWith(PackagingSourceManager.ThemesPrefix)
? "~/Themes/" + packageId.Substring(PackagingSourceManager.ThemesPrefix.Length)
: "~/Modules/" + packageId.Substring(PackagingSourceManager.ThemesPrefix.Length);
string extensionFullPath = HostingEnvironment.MapPath(extensionPath);
if (Directory.Exists(extensionFullPath)) {
Directory.Delete(extensionFullPath, true);
}
else {
throw new OrchardException(T("Package not found: ", packageId));
}
}
}
2010-12-07 16:11:29 -08:00
private static bool TryGetSolutionPath(string applicationPath, out string parentPath) {
try {
parentPath = Directory.GetParent(applicationPath).Parent.FullName;
var solutionPath = Path.Combine(parentPath, SolutionFilename);
return File.Exists(solutionPath);
}
catch {
// Either solution does not exist or we are running under medium trust
parentPath = null;
return false;
}
}
}
}