Browse Source

Introduced more stable way to identify NuGet package updates for already installed AddIns.

pull/32/head
Andreas Weizel 13 years ago
parent
commit
cddce9c007
  1. 52
      src/AddIns/Misc/AddInManager2/Project/Src/Model/AddInSetup.cs

52
src/AddIns/Misc/AddInManager2/Project/Src/Model/AddInSetup.cs

@ -5,6 +5,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Xml;
using ICSharpCode.Core; using ICSharpCode.Core;
using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpZipLib.Zip; using ICSharpCode.SharpZipLib.Zip;
@ -17,11 +18,14 @@ namespace ICSharpCode.AddInManager2.Model
/// </summary> /// </summary>
public class AddInSetup : IAddInSetup public class AddInSetup : IAddInSetup
{ {
private const string NuGetPackageIDManifestAttribute = "__nuGetPackageID";
private IAddInManagerEvents _events = null; private IAddInManagerEvents _events = null;
private INuGetPackageManager _nuGet = null; private INuGetPackageManager _nuGet = null;
private ISDAddInManagement _sdAddInManagement = null; private ISDAddInManagement _sdAddInManagement = null;
private List<ManagedAddIn> _addInsMarkedForInstall; private List<ManagedAddIn> _addInsMarkedForInstall;
private Dictionary<string, string> _nuGetToAddInMappings;
public AddInSetup(IAddInManagerEvents events, INuGetPackageManager nuGet, ISDAddInManagement sdAddInManagement) public AddInSetup(IAddInManagerEvents events, INuGetPackageManager nuGet, ISDAddInManagement sdAddInManagement)
{ {
@ -30,6 +34,7 @@ namespace ICSharpCode.AddInManager2.Model
_sdAddInManagement = sdAddInManagement; _sdAddInManagement = sdAddInManagement;
_addInsMarkedForInstall = new List<ManagedAddIn>(); _addInsMarkedForInstall = new List<ManagedAddIn>();
_nuGetToAddInMappings = new Dictionary<string, string>();
// Register event handlers // Register event handlers
_events.AddInPackageDownloaded += events_AddInPackageDownloaded; _events.AddInPackageDownloaded += events_AddInPackageDownloaded;
@ -243,6 +248,15 @@ namespace ICSharpCode.AddInManager2.Model
{ {
SD.Log.DebugFormatted("[AddInManager2] Installing AddIn from package {0} {1}", package.Id, package.Version.ToString()); SD.Log.DebugFormatted("[AddInManager2] Installing AddIn from package {0} {1}", package.Id, package.Version.ToString());
// Patch metadata of AddIn to have a permanent link to the NuGet package
if (!PatchAddInManifest(addInManifestFile, package))
{
_events.OnAddInOperationError(
new AddInOperationErrorEventArgs(
SD.ResourceService.GetString("AddInManager2.InvalidPackage")));
return null;
}
AddIn addIn = _sdAddInManagement.Load(addInManifestFile); AddIn addIn = _sdAddInManagement.Load(addInManifestFile);
if (addIn.Manifest.PrimaryIdentity == null) if (addIn.Manifest.PrimaryIdentity == null)
{ {
@ -297,10 +311,10 @@ namespace ICSharpCode.AddInManager2.Model
SD.Log.DebugFormatted("[AddInManager2] AddIn's manifest states no identity."); SD.Log.DebugFormatted("[AddInManager2] AddIn's manifest states no identity.");
} }
if (addIn.Properties.Contains("nuGetPackageID")) if (addIn.Properties.Contains(NuGetPackageIDManifestAttribute))
{ {
SD.Log.DebugFormatted("[AddInManager2] AddIn's manifest states NuGet ID '{0}'", SD.Log.DebugFormatted("[AddInManager2] AddIn's manifest states NuGet ID '{0}'",
addIn.Properties["nuGetPackageID"]); addIn.Properties[NuGetPackageIDManifestAttribute]);
} }
else else
{ {
@ -335,6 +349,32 @@ namespace ICSharpCode.AddInManager2.Model
return null; return null;
} }
private bool PatchAddInManifest(string addInManifestFile, IPackage package)
{
if (!File.Exists(addInManifestFile))
{
return false;
}
try
{
XmlDocument addInManifestDoc = new XmlDocument();
addInManifestDoc.Load(addInManifestFile);
// Set our special attribute in root
XmlAttribute nuGetPackageIDAttribute = addInManifestDoc.CreateAttribute(NuGetPackageIDManifestAttribute);
nuGetPackageIDAttribute.Value = package.Id;
addInManifestDoc.DocumentElement.Attributes.Append(nuGetPackageIDAttribute);
addInManifestDoc.Save(addInManifestFile);
return true;
}
catch (Exception)
{
return false;
}
}
private bool CopyAddInFromZip(AddIn addIn, string zipFile) private bool CopyAddInFromZip(AddIn addIn, string zipFile)
{ {
if ((addIn != null) && (addIn.Manifest != null)) if ((addIn != null) && (addIn.Manifest != null))
@ -602,9 +642,9 @@ namespace ICSharpCode.AddInManager2.Model
IPackage package = null; IPackage package = null;
string nuGetPackageID = null; string nuGetPackageID = null;
if (addIn.Properties.Contains("nuGetPackageID")) if (addIn.Properties.Contains(NuGetPackageIDManifestAttribute))
{ {
nuGetPackageID = addIn.Properties["nuGetPackageID"]; nuGetPackageID = addIn.Properties[NuGetPackageIDManifestAttribute];
} }
string primaryIdentity = null; string primaryIdentity = null;
if (addIn.Manifest != null) if (addIn.Manifest != null)
@ -656,7 +696,7 @@ namespace ICSharpCode.AddInManager2.Model
AddIn foundAddIn = _sdAddInManagement.AddIns.Where( AddIn foundAddIn = _sdAddInManagement.AddIns.Where(
a => ((a.Manifest != null) && (a.Manifest.PrimaryIdentity == package.Id)) a => ((a.Manifest != null) && (a.Manifest.PrimaryIdentity == package.Id))
|| (a.Properties.Contains("nuGetPackageID") && (a.Properties["nuGetPackageID"] == package.Id))) || (a.Properties.Contains(NuGetPackageIDManifestAttribute) && (a.Properties[NuGetPackageIDManifestAttribute] == package.Id)))
.FirstOrDefault(); .FirstOrDefault();
return foundAddIn; return foundAddIn;
@ -671,7 +711,7 @@ namespace ICSharpCode.AddInManager2.Model
ManagedAddIn foundAddIn = AddInsWithMarkedForInstallation.Where( ManagedAddIn foundAddIn = AddInsWithMarkedForInstallation.Where(
a => ((a.AddIn.Manifest != null) && (a.AddIn.Manifest.PrimaryIdentity == package.Id)) a => ((a.AddIn.Manifest != null) && (a.AddIn.Manifest.PrimaryIdentity == package.Id))
|| (a.AddIn.Properties.Contains("nuGetPackageID") && (a.AddIn.Properties["nuGetPackageID"] == package.Id))) || (a.AddIn.Properties.Contains(NuGetPackageIDManifestAttribute) && (a.AddIn.Properties[NuGetPackageIDManifestAttribute] == package.Id)))
.FirstOrDefault(); .FirstOrDefault();
return (foundAddIn != null) ? foundAddIn.AddIn : null; return (foundAddIn != null) ? foundAddIn.AddIn : null;

Loading…
Cancel
Save