Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono-addins.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLluis Sanchez Gual <lluis@novell.com>2011-04-12 22:19:06 +0400
committerLluis Sanchez Gual <lluis@novell.com>2011-04-12 22:21:02 +0400
commit302b0a741fbec2a37c7207a1835d7ad4e4f20053 (patch)
treeb3c7a494ca8c70787918ffb29ea44fd991830c96
parentc7a69e203de4ad6b2e0f3c7f367eef082e2043d1 (diff)
Added support for uninstalling multiple add-ins at once.
Also Improved error reporting.
-rw-r--r--Mono.Addins.Setup/Mono.Addins.Setup/AddinStore.cs153
1 files changed, 92 insertions, 61 deletions
diff --git a/Mono.Addins.Setup/Mono.Addins.Setup/AddinStore.cs b/Mono.Addins.Setup/Mono.Addins.Setup/AddinStore.cs
index 91d925a..9dd5861 100644
--- a/Mono.Addins.Setup/Mono.Addins.Setup/AddinStore.cs
+++ b/Mono.Addins.Setup/Mono.Addins.Setup/AddinStore.cs
@@ -43,6 +43,8 @@ using Mono.Addins;
using Mono.Addins.Setup.ProgressMonitoring;
using Mono.Addins.Description;
using Mono.Addins.Serialization;
+using System.Collections.Generic;
+using System.Linq;
namespace Mono.Addins.Setup
{
@@ -120,7 +122,7 @@ namespace Mono.Addins.Setup
throw new InstallException ("Installation cancelled.");
monitor.Step (1);
} catch (Exception ex) {
- monitor.ReportError (null, ex);
+ ReportException (monitor, ex);
rollback = true;
break;
}
@@ -136,7 +138,7 @@ namespace Mono.Addins.Setup
prepared.Add (mpack);
monitor.Step (1);
} catch (Exception ex) {
- monitor.ReportError (null, ex);
+ ReportException (monitor, ex);
rollback = true;
break;
}
@@ -156,7 +158,7 @@ namespace Mono.Addins.Setup
throw new InstallException ("Installation cancelled.");
monitor.Step (1);
} catch (Exception ex) {
- monitor.ReportError (null, ex);
+ ReportException (monitor, ex);
rollback = true;
break;
}
@@ -173,7 +175,7 @@ namespace Mono.Addins.Setup
throw new InstallException ("Installation cancelled.");
monitor.Step (1);
} catch (Exception ex) {
- monitor.ReportError (null, ex);
+ ReportException (monitor, ex);
rollback = true;
break;
}
@@ -195,7 +197,7 @@ namespace Mono.Addins.Setup
mpack.RollbackInstall (monitor, this);
monitor.Step (1);
} catch (Exception ex) {
- monitor.ReportError (null, ex);
+ ReportException (monitor, ex);
}
}
@@ -204,7 +206,7 @@ namespace Mono.Addins.Setup
mpack.RollbackUninstall (monitor, this);
monitor.Step (1);
} catch (Exception ex) {
- monitor.ReportError (null, ex);
+ ReportException (monitor, ex);
}
}
} else
@@ -245,79 +247,98 @@ namespace Mono.Addins.Setup
return !rollback;
}
+ void ReportException (IProgressMonitor statusMonitor, Exception ex)
+ {
+ if (ex is InstallException)
+ statusMonitor.ReportError (ex.Message, null);
+ else
+ statusMonitor.ReportError (null, ex);
+ }
+
public void Uninstall (IProgressStatus statusMonitor, string id)
{
- IProgressMonitor monitor = ProgressStatusMonitor.GetProgressMonitor (statusMonitor);
+ Uninstall (statusMonitor, new string[] { id });
+ }
- bool rollback = false;
- ArrayList toUninstall = new ArrayList ();
- ArrayList uninstallPrepared = new ArrayList ();
-
- Addin ia = service.Registry.GetAddin (id);
- if (ia == null)
- throw new InstallException ("The add-in '" + id + "' is not installed.");
-
- toUninstall.Add (AddinPackage.FromInstalledAddin (ia));
-
- Addin[] deps = GetDependentAddins (id, true);
- foreach (Addin dep in deps)
- toUninstall.Add (AddinPackage.FromInstalledAddin (dep));
-
- monitor.BeginTask ("Deleting files", toUninstall.Count*2 + uninstallPrepared.Count + 1);
-
- // Prepare install
-
- foreach (Package mpack in toUninstall) {
- try {
- mpack.PrepareUninstall (monitor, this);
- monitor.Step (1);
- uninstallPrepared.Add (mpack);
- } catch (Exception ex) {
- monitor.ReportError (null, ex);
- rollback = true;
- break;
- }
- }
-
- // Commit install
+ public void Uninstall (IProgressStatus statusMonitor, IEnumerable<string> ids)
+ {
+ IProgressMonitor monitor = ProgressStatusMonitor.GetProgressMonitor (statusMonitor);
+ monitor.BeginTask ("Uninstalling add-ins", ids.Count ());
- if (!rollback) {
+ foreach (string id in ids) {
+ bool rollback = false;
+ ArrayList toUninstall = new ArrayList ();
+ ArrayList uninstallPrepared = new ArrayList ();
+
+ Addin ia = service.Registry.GetAddin (id);
+ if (ia == null)
+ throw new InstallException ("The add-in '" + id + "' is not installed.");
+
+ toUninstall.Add (AddinPackage.FromInstalledAddin (ia));
+
+ Addin[] deps = GetDependentAddins (id, true);
+ foreach (Addin dep in deps)
+ toUninstall.Add (AddinPackage.FromInstalledAddin (dep));
+
+ monitor.BeginTask ("Deleting files", toUninstall.Count*2 + uninstallPrepared.Count + 1);
+
+ // Prepare install
+
foreach (Package mpack in toUninstall) {
try {
- mpack.CommitUninstall (monitor, this);
+ mpack.PrepareUninstall (monitor, this);
monitor.Step (1);
+ uninstallPrepared.Add (mpack);
} catch (Exception ex) {
- monitor.ReportError (null, ex);
+ ReportException (monitor, ex);
rollback = true;
break;
}
}
- }
-
- // Rollback if failed
-
- if (rollback) {
- monitor.BeginTask ("Rolling back uninstall", uninstallPrepared.Count);
+
+ // Commit install
+
+ if (!rollback) {
+ foreach (Package mpack in toUninstall) {
+ try {
+ mpack.CommitUninstall (monitor, this);
+ monitor.Step (1);
+ } catch (Exception ex) {
+ ReportException (monitor, ex);
+ rollback = true;
+ break;
+ }
+ }
+ }
+
+ // Rollback if failed
+
+ if (rollback) {
+ monitor.BeginTask ("Rolling back uninstall", uninstallPrepared.Count);
+ foreach (Package mpack in uninstallPrepared) {
+ try {
+ mpack.RollbackUninstall (monitor, this);
+ } catch (Exception ex) {
+ ReportException (monitor, ex);
+ }
+ }
+ monitor.EndTask ();
+ }
+ monitor.Step (1);
+
+ // Cleanup
+
foreach (Package mpack in uninstallPrepared) {
try {
- mpack.RollbackUninstall (monitor, this);
+ mpack.EndUninstall (monitor, this);
+ monitor.Step (1);
} catch (Exception ex) {
- monitor.ReportError (null, ex);
+ monitor.Log.WriteLine (ex);
}
}
+
monitor.EndTask ();
- }
- monitor.Step (1);
-
- // Cleanup
-
- foreach (Package mpack in uninstallPrepared) {
- try {
- mpack.EndUninstall (monitor, this);
- monitor.Step (1);
- } catch (Exception ex) {
- monitor.Log.WriteLine (ex);
- }
+ monitor.Step (1);
}
// Update the extension maps
@@ -458,6 +479,16 @@ namespace Mono.Addins.Setup
}
}
+ // Don't allow installing add-ins which are scheduled for uninstall
+
+ foreach (Package p in packages) {
+ AddinPackage ap = p as AddinPackage;
+ if (ap != null && Registry.IsRegisteredForUninstall (ap.Addin.Id)) {
+ error = true;
+ monitor.ReportError ("The addin " + ap.Addin.Name + " v" + ap.Addin.Version + " is scheduled for uninstallation. Please restart the application before trying to re-install it.", null);
+ }
+ }
+
return !error;
}