From bc5ecc650f5a798dae094b64883b11688fe0fbf0 Mon Sep 17 00:00:00 2001 From: Renaud Paquay Date: Fri, 12 Jun 2020 15:08:33 -0700 Subject: [PATCH] Shorten logging when skipping directories --- src/Core/Chromium/ChromiumDiscovery.cs | 14 +++++++++++--- src/Core/Win32/Files/NativeFile.cs | 11 ++--------- .../Builder/ProjectRootSnapshotBuilder.cs | 10 ++++++++-- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/Core/Chromium/ChromiumDiscovery.cs b/src/Core/Chromium/ChromiumDiscovery.cs index f2f86081..e577ea64 100644 --- a/src/Core/Chromium/ChromiumDiscovery.cs +++ b/src/Core/Chromium/ChromiumDiscovery.cs @@ -2,11 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +using System; using System.Collections.Generic; using System.Linq; using VsChromium.Core.Configuration; using VsChromium.Core.Files; using VsChromium.Core.Files.PatternMatching; +using VsChromium.Core.Logging; using VsChromium.Core.Win32.Files; namespace VsChromium.Core.Chromium { @@ -37,9 +39,15 @@ private bool IsChromiumSourceDirectory(FullPath path, IFilePatternsPathMatcherPr } // We need to ensure that all pattern lines are covered by at least one file/directory of |path|. - var entries = _fileSystem.GetDirectoryEntries(path); - return chromiumEnlistmentFilePatterns.PathMatcherEntries - .All(item => MatchFileOrDirectory(item, entries)); + try { + var entries = _fileSystem.GetDirectoryEntries(path); + return chromiumEnlistmentFilePatterns.PathMatcherEntries + .All(item => MatchFileOrDirectory(item, entries)); + } + catch (Exception e) { + Logger.LogWarn(e, "Error detecting chromium root directory, skipping directory \"{0}\"", path); + return false; + } } private static bool MatchFileOrDirectory(IPathMatcher item, IList entries) { diff --git a/src/Core/Win32/Files/NativeFile.cs b/src/Core/Win32/Files/NativeFile.cs index 61edebf6..a8394c93 100644 --- a/src/Core/Win32/Files/NativeFile.cs +++ b/src/Core/Win32/Files/NativeFile.cs @@ -84,15 +84,8 @@ public static unsafe List GetDirectoryEntries(string path) { IntPtr.Zero); if (fileHandle.IsInvalid) { var lastWin32Error = Marshal.GetLastWin32Error(); - if (lastWin32Error != (int)Win32Errors.ERROR_FILE_NOT_FOUND && - lastWin32Error != (int)Win32Errors.ERROR_PATH_NOT_FOUND && - lastWin32Error != (int)Win32Errors.ERROR_ACCESS_DENIED) { - throw new LastWin32ErrorException(lastWin32Error, - string.Format("Error enumerating files at \"{0}\".", path)); - } - - // Skip this directory - return directoryEntries; + throw new LastWin32ErrorException(lastWin32Error, + string.Format("Error enumerating files at \"{0}\".", path)); } using (fileHandle) { diff --git a/src/Server/FileSystem/Builder/ProjectRootSnapshotBuilder.cs b/src/Server/FileSystem/Builder/ProjectRootSnapshotBuilder.cs index 1815f300..99571548 100644 --- a/src/Server/FileSystem/Builder/ProjectRootSnapshotBuilder.cs +++ b/src/Server/FileSystem/Builder/ProjectRootSnapshotBuilder.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Concurrent; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -289,11 +290,16 @@ private List ProcessDirectory(DirectoryData directory, ConcurrentBag GetDirectoryEntries(DirectoryData directory) { + var path = _project.RootPath.Combine(directory.DirectoryName.RelativePath); try { - return _fileSystem.GetDirectoryEntries(_project.RootPath.Combine(directory.DirectoryName.RelativePath)); + return _fileSystem.GetDirectoryEntries(path); + } + catch (Win32Exception e) { + Logger.LogWarn("Skipping directory \"{0}\": {1} ({2})", path, e.Message, e.NativeErrorCode); + return ArrayUtilities.EmptyList.Instance; } catch (Exception e) { - Logger.LogWarn(e, "Skipping directory due to error"); + Logger.LogWarn(e, "Skipping directory \"{0}\"", path); return ArrayUtilities.EmptyList.Instance; } }