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-19 20:27:20 +0400
committerLluis Sanchez Gual <lluis@novell.com>2011-04-19 20:27:20 +0400
commit1fb8c79894fc4aca78eef78dcd9069326fdf3914 (patch)
tree36ad6ecb6f698cfa7909a16e9546a66b10899a9c
parenta1bc5dce22442d6dfec2c65b77ee997f56ac63fe (diff)
Delay add-in uninstallation if there is any write lock hold on its filesmono-addins-0.6.10.6.1
-rw-r--r--Mono.Addins.Setup/Mono.Addins.Setup/AddinPackage.cs16
1 files changed, 15 insertions, 1 deletions
diff --git a/Mono.Addins.Setup/Mono.Addins.Setup/AddinPackage.cs b/Mono.Addins.Setup/Mono.Addins.Setup/AddinPackage.cs
index bfde245..c18b1d9 100644
--- a/Mono.Addins.Setup/Mono.Addins.Setup/AddinPackage.cs
+++ b/Mono.Addins.Setup/Mono.Addins.Setup/AddinPackage.cs
@@ -40,6 +40,7 @@ using ICSharpCode.SharpZipLib.Zip;
using Mono.Addins;
using Mono.Addins.Description;
using System.Collections.Generic;
+using System.Linq;
namespace Mono.Addins.Setup
{
@@ -236,8 +237,9 @@ namespace Mono.Addins.Setup
return;
}
+ // If the add-in assemblies are loaded, or if there is any file with a write lock, delay the uninstallation
HashSet<string> files = new HashSet<string> (GetInstalledFiles (conf));
- if (AddinManager.CheckAssembliesLoaded (files)) {
+ if (AddinManager.CheckAssembliesLoaded (files) || files.Any (f => HasWriteLock (f))) {
uninstallingLoaded = true;
return;
}
@@ -254,6 +256,18 @@ namespace Mono.Addins.Setup
CopyAddinFiles (monitor, conf, iaddin.AddinFile, tempFolder);
}
+ bool HasWriteLock (string file)
+ {
+ if (!File.Exists (file))
+ return false;
+ try {
+ File.OpenWrite (file).Close ();
+ return false;
+ } catch {
+ return true;
+ }
+ }
+
IEnumerable<string> GetInstalledFiles (AddinDescription conf)
{
string basePath = Path.GetDirectoryName (conf.AddinFile);