diff options
author | Marius Ungureanu <marius.ungureanu@xamarin.com> | 2020-07-27 19:46:53 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-07-27 19:46:53 +0300 |
commit | 6788491d545966417e7d7842cd176dc38da1772d (patch) | |
tree | 4f6d61d68e5fb0aa34e3365193762fe60518f9f7 | |
parent | 40a4b54a22c5c4251d2c669f975824e194301adf (diff) | |
parent | 2193b6a78bf80ed1a1621073b95f4f25c6f596d5 (diff) |
Merge pull request #164 from mono/dev/therzok/opt-fsext
6 files changed, 26 insertions, 18 deletions
diff --git a/Mono.Addins.Setup/Mono.Addins.Setup/SetupService.cs b/Mono.Addins.Setup/Mono.Addins.Setup/SetupService.cs index 4de0ccd..e9ee1d4 100644 --- a/Mono.Addins.Setup/Mono.Addins.Setup/SetupService.cs +++ b/Mono.Addins.Setup/Mono.Addins.Setup/SetupService.cs @@ -746,7 +746,7 @@ namespace Mono.Addins.Setup bool modified = false; monitor.Log.WriteLine ("Checking directory: " + mainPath); - foreach (string file in Directory.GetFiles (mainPath, "*.mpack")) { + foreach (string file in Directory.EnumerateFiles (mainPath, "*.mpack")) { DateTime date = File.GetLastWriteTime (file); string fname = Path.GetFileName (file); @@ -801,7 +801,7 @@ namespace Mono.Addins.Setup rootrep.AddEntry (repEntry); } - foreach (string dir in Directory.GetDirectories (mainPath)) { + foreach (string dir in Directory.EnumerateDirectories (mainPath)) { if (Path.GetFileName (dir) == addinFilesDir) continue; string based = dir.Substring (rootPath.Length + 1); @@ -818,7 +818,7 @@ namespace Mono.Addins.Setup File.Delete (file); } } - if (Directory.Exists (targetDir) && Directory.GetFileSystemEntries (targetDir).Length == 0) + if (Directory.Exists (targetDir) && !Directory.EnumerateFileSystemEntries (targetDir).Any()) Directory.Delete (targetDir, true); } diff --git a/Mono.Addins/Mono.Addins.Database/AddinDatabase.cs b/Mono.Addins/Mono.Addins.Database/AddinDatabase.cs index b1cb643..97cdbbf 100644 --- a/Mono.Addins/Mono.Addins.Database/AddinDatabase.cs +++ b/Mono.Addins/Mono.Addins.Database/AddinDatabase.cs @@ -1381,7 +1381,7 @@ namespace Mono.Addins.Database // Check if any of the previously scanned folders has been deleted - foreach (string file in Directory.GetFiles (AddinFolderCachePath, "*.data")) { + foreach (string file in Directory.EnumerateFiles (AddinFolderCachePath, "*.data")) { AddinScanFolderInfo folderInfo; bool res = ReadFolderInfo (monitor, file, out folderInfo); bool validForDomain = scanResult.Domain == null || folderInfo.Domain == GlobalDomain || folderInfo.Domain == scanResult.Domain; diff --git a/Mono.Addins/Mono.Addins.Database/AddinFileSystemExtension.cs b/Mono.Addins/Mono.Addins.Database/AddinFileSystemExtension.cs index ce5f6ae..74e16d2 100644 --- a/Mono.Addins/Mono.Addins.Database/AddinFileSystemExtension.cs +++ b/Mono.Addins/Mono.Addins.Database/AddinFileSystemExtension.cs @@ -94,7 +94,7 @@ namespace Mono.Addins.Database /// </param> public virtual System.Collections.Generic.IEnumerable<string> GetFiles (string path) { - return Directory.GetFiles (path); + return Directory.EnumerateFiles (path); } /// <summary> @@ -108,7 +108,7 @@ namespace Mono.Addins.Database /// </param> public virtual System.Collections.Generic.IEnumerable<string> GetDirectories (string path) { - return Directory.GetDirectories (path); + return Directory.EnumerateDirectories (path); } /// <summary> diff --git a/Mono.Addins/Mono.Addins.Database/AddinFolderVisitor.cs b/Mono.Addins/Mono.Addins.Database/AddinFolderVisitor.cs index 37c64d6..3ba62f0 100644 --- a/Mono.Addins/Mono.Addins.Database/AddinFolderVisitor.cs +++ b/Mono.Addins/Mono.Addins.Database/AddinFolderVisitor.cs @@ -27,6 +27,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Xml; namespace Mono.Addins.Database @@ -49,8 +50,11 @@ namespace Mono.Addins.Database public void VisitFolder (IProgressStatus monitor, string path, string domain, bool recursive) { - path = Path.GetFullPath (path); + VisitFolderInternal (monitor, Path.GetFullPath (path), domain, recursive); + } + void VisitFolderInternal (IProgressStatus monitor, string path, string domain, bool recursive) + { // Avoid folders including each other if (!visitedFolders.Add (path) || ScanContext.IgnorePath (path)) return; @@ -63,7 +67,7 @@ namespace Mono.Addins.Database if (!FileSystem.DirectoryExists (path)) return; - var files = FileSystem.GetFiles (path); + var files = FileSystem.GetFiles (path).ToArray(); // First of all scan .addins files, since they can contain exclude paths. // Only extract the information, don't follow directory inclusions yet @@ -98,16 +102,17 @@ namespace Mono.Addins.Database foreach (var entry in addinsFileEntries) { string dir = entry.Folder; - if (!Path.IsPathRooted (dir)) - dir = Path.Combine (path, entry.Folder); - VisitFolder (monitor, dir, entry.Domain, entry.Recursive); + if (!Path.IsPathRooted(dir)) + dir = Path.GetFullPath (Path.Combine (path, entry.Folder)); + + VisitFolderInternal (monitor, dir, entry.Domain, entry.Recursive); } // Scan subfolders if (recursive) { foreach (string sd in FileSystem.GetDirectories (path)) - VisitFolder (monitor, sd, domain, true); + VisitFolderInternal (monitor, sd, domain, true); } } @@ -125,8 +130,6 @@ namespace Mono.Addins.Database { List<AddinsEntry> entries = new List<AddinsEntry>(); XmlTextReader r = null; - List<string []> directories = new List<string []> (); - List<string []> directoriesWithSubdirs = new List<string []> (); string basePath = Path.GetDirectoryName (file); try { diff --git a/Mono.Addins/Mono.Addins.Database/AssemblyLocatorVisitor.cs b/Mono.Addins/Mono.Addins.Database/AssemblyLocatorVisitor.cs index 545b3be..2149adf 100644 --- a/Mono.Addins/Mono.Addins.Database/AssemblyLocatorVisitor.cs +++ b/Mono.Addins/Mono.Addins.Database/AssemblyLocatorVisitor.cs @@ -97,15 +97,17 @@ namespace Mono.Addins.Database int i = fullName.IndexOf (','); string name = fullName.Substring (0, i); if (name == "Mono.Addins") - return GetType ().Assembly.Location; + return typeof (AssemblyIndex).Assembly.Location; if (!assemblyLocations.TryGetValue (name, out var list)) return null; string lastAsm = null; - foreach (string file in list.ToArray ()) { + for (int n = list.Count - 1; n >= 0; --n) { try { - list.Remove (file); + var file = list[n]; + list.RemoveAt(n); + AssemblyName aname = AssemblyName.GetAssemblyName (file); lastAsm = file; assemblyLocationsByFullName [aname.FullName] = file; @@ -116,6 +118,9 @@ namespace Mono.Addins.Database // In this case, just ignore it. } } + + // If we got here, we removed all the list's items. + assemblyLocations.Remove (name); if (lastAsm != null) { // If an exact version is not found, just take any of them diff --git a/Mono.Addins/Mono.Addins/AddinRegistry.cs b/Mono.Addins/Mono.Addins/AddinRegistry.cs index f51b4db..0e1ef2a 100644 --- a/Mono.Addins/Mono.Addins/AddinRegistry.cs +++ b/Mono.Addins/Mono.Addins/AddinRegistry.cs @@ -760,7 +760,7 @@ namespace Mono.Addins if (!Directory.Exists (database.HostsPath)) Directory.CreateDirectory (database.HostsPath); - foreach (string s in Directory.GetFiles (database.HostsPath, baseName + "*.addins")) { + foreach (string s in Directory.EnumerateFiles (database.HostsPath, baseName + "*.addins")) { try { using (StreamReader sr = new StreamReader (s)) { XmlTextReader tr = new XmlTextReader (sr); |