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

129 lines
5.9 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 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.FileSystems.AppData;
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 readonly INotifier _notifier;
private readonly IExtensionManager _extensionManager;
private readonly IAppDataFolderRoot _appDataFolderRoot;
public PackageInstaller(INotifier notifier,
IExtensionManager extensionManager,
IAppDataFolderRoot appDataFolderRoot) {
_notifier = notifier;
_extensionManager = extensionManager;
_appDataFolderRoot = appDataFolderRoot;
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
var installedPackagesPath = Path.Combine(_appDataFolderRoot.RootFolder, PackagesPath);
try
{
var packageManager = new NuGetPackageManager(
packageRepository,
new DefaultPackagePathResolver(location),
new PhysicalFileSystem(installedPackagesPath) { Logger = logger }
) { Logger = logger };
packageManager.InstallPackage(package, ignoreDependencies: true);
installed = true;
}
catch
{
// installing the package in the appdata folder 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("Orchard.Theme") ? 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);
var installedPackagesPath = Path.Combine(_appDataFolderRoot.RootFolder, 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);
}
}
}