#develop (short for SharpDevelop) is a free IDE for .NET programming languages.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

172 lines
4.9 KiB

// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Versioning;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop;
using NuGet;
namespace ICSharpCode.AddInManager2.Model
{
/// <summary>
/// Wrapper around native NuGet package manager.
/// </summary>
public class NuGetPackageManager : INuGetPackageManager
{
/// <summary>
/// Helper for log messages generated by NuGet component.
/// </summary>
public class PackageMessageLogger : ILogger
{
IAddInManagerEvents _events = null;
public PackageMessageLogger(IAddInManagerEvents events)
{
_events = events;
}
public void Log(MessageLevel level, string message, params object[] args)
{
_events.OnPackageMessageLogged(new PackageMessageLoggedEventArgs(level, message, args));
}
}
private NuGetPackageManagerImplementation _packageManager = null;
private IPackageRepositories _repositories = null;
private IAddInManagerEvents _events = null;
private ISDAddInManagement _sdAddInManagement = null;
private ILogger _logger = null;
private string _packageOutputDirectory;
public NuGetPackageManager(IPackageRepositories repositories, IAddInManagerEvents events, ISDAddInManagement sdAddInManagement)
{
_repositories = repositories;
_events = events;
_sdAddInManagement = sdAddInManagement;
_packageOutputDirectory = Path.Combine(_sdAddInManagement.ConfigDirectory, "NuGet");
_logger = new PackageMessageLogger(_events);
_events.PackageMessageLogged += Events_PackageMessageLogged;
}
public IPackageManager Packages
{
get
{
// Create PackageManager instance lazily
return EnsurePackageManagerInstance();
}
}
public ILogger Logger
{
get
{
return _logger;
}
}
public string PackageOutputDirectory
{
get
{
return _packageOutputDirectory;
}
}
public IPackageOperationResolver CreateInstallPackageOperationResolver(bool allowPrereleaseVersions)
{
EnsurePackageManagerInstance();
return new InstallWalker(
_packageManager.LocalRepository,
_packageManager.SourceRepository,
null,
_logger,
false,
allowPrereleaseVersions);
}
public void ExecuteOperation(PackageOperation operation)
{
EnsurePackageManagerInstance();
_packageManager.ExecuteOperation(operation);
}
public string GetLocalPackageDirectory(IPackage package)
{
return Path.Combine(PackageOutputDirectory, package.Id + "." + package.Version.ToString());
}
private IPackageManager EnsurePackageManagerInstance()
{
if (_packageManager != null)
{
return _packageManager;
}
// Ensure that package directory exists
if (!Directory.Exists(_packageOutputDirectory))
{
Directory.CreateDirectory(_packageOutputDirectory);
}
// Create new package manager instance
_packageManager = new NuGetPackageManagerImplementation(_repositories.AllRegistered, _packageOutputDirectory, this);
_packageManager.PackageInstalled += _packageEvents_NuGetPackageInstalled;
_packageManager.PackageUninstalled += _packageEvents_NuGetPackageUninstalled;
return _packageManager;
}
private void _packageEvents_NuGetPackageInstalled(object sender, PackageOperationEventArgs e)
{
// NuGet package has been downloaded and extracted, now install the AddIn from it
// TODO Error management?
_events.OnAddInPackageDownloaded(e);
}
private void _packageEvents_NuGetPackageUninstalled(object sender, PackageOperationEventArgs e)
{
_events.OnAddInPackageRemoved(e);
}
private void Events_PackageMessageLogged(object sender, PackageMessageLoggedEventArgs e)
{
LoggingService.InfoFormatted("[NuGetPackageManager] {0}", e.Message);
}
private class NuGetPackageManagerImplementation : PackageManager
{
private INuGetPackageManager _internalPackageManager;
public NuGetPackageManagerImplementation(IPackageRepository sourceRepository, string path, INuGetPackageManager internalPackageManager)
: base(sourceRepository, path)
{
_internalPackageManager = internalPackageManager;
}
public void ExecuteOperation(PackageOperation operation)
{
// Allow to call this method from outside of the class
base.Execute(operation);
}
public override void UninstallPackage(IPackage package, bool forceRemove, bool removeDependencies)
{
base.UninstallPackage(package, forceRemove, removeDependencies);
string localPackageDirectory = _internalPackageManager.GetLocalPackageDirectory(package);
if (Directory.Exists(localPackageDirectory))
{
// Directory still exists after removing the package -> try to delete it explicitly
Directory.Delete(localPackageDirectory, true);
}
}
}
}
}