diff --git a/GVFS/GVFS.Platform.Mac/MacFileSystemVirtualizer.cs b/GVFS/GVFS.Platform.Mac/MacFileSystemVirtualizer.cs index faef5fc989..72582f09f5 100644 --- a/GVFS/GVFS.Platform.Mac/MacFileSystemVirtualizer.cs +++ b/GVFS/GVFS.Platform.Mac/MacFileSystemVirtualizer.cs @@ -17,7 +17,8 @@ public class MacFileSystemVirtualizer : FileSystemVirtualizer { public static readonly byte[] PlaceholderVersionId = ToVersionIdByteArray(new byte[] { PlaceholderVersion }); - private const int SymLinkTargetBufferSize = 4096; + private const int SymLinkTargetBufferSize = 4096; + private const long DummyFileSize = -1; private const string ClassName = nameof(MacFileSystemVirtualizer); @@ -83,6 +84,12 @@ public override void Stop() this.Context.Tracer.RelatedEvent(EventLevel.Informational, $"{nameof(this.Stop)}_StopRequested", metadata: null); } + /// + /// Writes a placeholder file. + /// + /// Placeholder's path relative to the root of the repo + /// Length of the file (ignored on this platform) + /// The SHA of the placeholder's contents, stored as the content ID in the placeholder public override FileSystemResult WritePlaceholderFile( string relativePath, long endOfFile, @@ -99,7 +106,6 @@ public override FileSystemResult WritePlaceholderFile( relativePath, PlaceholderVersionId, ToVersionIdByteArray(FileSystemVirtualizer.ConvertShaToContentId(sha)), - (ulong)endOfFile, fileMode); return new FileSystemResult(ResultToFSResult(result), unchecked((int)result)); @@ -560,31 +566,12 @@ private Result OnEnumerateDirectory( { try { - Result result; - try - { - IEnumerable projectedItems; - - // TODO: Pool these connections or schedule this work to run asynchronously using TryScheduleFileOrNetworkRequest - using (BlobSizes.BlobSizesConnection blobSizesConnection = this.FileSystemCallbacks.BlobSizes.CreateConnection()) - { - projectedItems = this.FileSystemCallbacks.GitIndexProjection.GetProjectedItems(CancellationToken.None, blobSizesConnection, relativePath); - } - - result = this.CreatePlaceholders(relativePath, projectedItems, triggeringProcessName); - } - catch (SizesUnavailableException e) - { - // TODO: Is this the correct Result to return? - result = Result.EIOError; - - EventMetadata metadata = this.CreateEventMetadata(relativePath, e); - metadata.Add("commandId", commandId); - metadata.Add(nameof(result), result.ToString("X") + "(" + result.ToString("G") + ")"); - this.Context.Tracer.RelatedError(metadata, nameof(this.OnEnumerateDirectory) + ": caught SizesUnavailableException"); - } + IEnumerable projectedItems = this.FileSystemCallbacks.GitIndexProjection.GetProjectedItems( + CancellationToken.None, + blobSizesConnection: null, + folderPath: relativePath); - return result; + return this.CreatePlaceholders(relativePath, projectedItems, triggeringProcessName); } catch (Exception e) { @@ -612,7 +599,9 @@ private Result CreatePlaceholders(string directoryRelativePath, IEnumerable + /// Gets the projected items within the specified folder. + /// + /// Cancellation token + /// + /// BlobSizes database connection, if null file sizes will not be populated + /// + /// Path of the folder relative to the repo's root public virtual List GetProjectedItems( CancellationToken cancellationToken, BlobSizes.BlobSizesConnection blobSizesConnection, @@ -396,12 +404,15 @@ public virtual List GetProjectedItems( FolderData folderData; if (this.TryGetOrAddFolderDataFromCache(folderPath, out folderData)) { - folderData.PopulateSizes( - this.context.Tracer, - this.gitObjects, - blobSizesConnection, - availableSizes: null, - cancellationToken: cancellationToken); + if (blobSizesConnection != null) + { + folderData.PopulateSizes( + this.context.Tracer, + this.gitObjects, + blobSizesConnection, + availableSizes: null, + cancellationToken: cancellationToken); + } return ConvertToProjectedFileInfos(folderData.ChildEntries); } diff --git a/MirrorProvider/MirrorProvider.Mac/MacFileSystemVirtualizer.cs b/MirrorProvider/MirrorProvider.Mac/MacFileSystemVirtualizer.cs index 98fe298f4a..12cff622ae 100644 --- a/MirrorProvider/MirrorProvider.Mac/MacFileSystemVirtualizer.cs +++ b/MirrorProvider/MirrorProvider.Mac/MacFileSystemVirtualizer.cs @@ -107,7 +107,6 @@ private Result OnEnumerateDirectory( Path.Combine(relativePath, child.Name), providerId: ToVersionIdByteArray(1), contentId: ToVersionIdByteArray(0), - fileSize: (ulong)child.Size, fileMode: fileMode); if (result != Result.Success) { diff --git a/ProjFS.Mac/PrjFSLib.Mac.Managed/Interop/PrjFSLib.cs b/ProjFS.Mac/PrjFSLib.Mac.Managed/Interop/PrjFSLib.cs index 19d53ff2e9..95feb1c08a 100644 --- a/ProjFS.Mac/PrjFSLib.Mac.Managed/Interop/PrjFSLib.cs +++ b/ProjFS.Mac/PrjFSLib.Mac.Managed/Interop/PrjFSLib.cs @@ -29,7 +29,6 @@ public static extern Result WritePlaceholderFile( byte[] providerId, [MarshalAs(UnmanagedType.LPArray, SizeConst = PlaceholderIdLength)] byte[] contentId, - ulong fileSize, ushort fileMode); [DllImport(PrjFSLibPath, EntryPoint = "PrjFS_WriteSymLink")] diff --git a/ProjFS.Mac/PrjFSLib.Mac.Managed/VirtualizationInstance.cs b/ProjFS.Mac/PrjFSLib.Mac.Managed/VirtualizationInstance.cs index eb78b7ce75..2f50b806ce 100644 --- a/ProjFS.Mac/PrjFSLib.Mac.Managed/VirtualizationInstance.cs +++ b/ProjFS.Mac/PrjFSLib.Mac.Managed/VirtualizationInstance.cs @@ -94,7 +94,6 @@ public virtual Result WritePlaceholderFile( string relativePath, byte[] providerId, byte[] contentId, - ulong fileSize, ushort fileMode) { if (providerId.Length != Interop.PrjFSLib.PlaceholderIdLength || @@ -107,7 +106,6 @@ public virtual Result WritePlaceholderFile( relativePath, providerId, contentId, - fileSize, fileMode); } diff --git a/ProjFS.Mac/PrjFSLib/PrjFSLib.cpp b/ProjFS.Mac/PrjFSLib/PrjFSLib.cpp index 29e76a4a2d..14348e5ff5 100644 --- a/ProjFS.Mac/PrjFSLib/PrjFSLib.cpp +++ b/ProjFS.Mac/PrjFSLib/PrjFSLib.cpp @@ -348,7 +348,6 @@ PrjFS_Result PrjFS_WritePlaceholderFile( _In_ const char* relativePath, _In_ unsigned char providerId[PrjFS_PlaceholderIdLength], _In_ unsigned char contentId[PrjFS_PlaceholderIdLength], - _In_ unsigned long fileSize, _In_ uint16_t fileMode) { #ifdef DEBUG @@ -357,7 +356,6 @@ PrjFS_Result PrjFS_WritePlaceholderFile( << relativePath << ", " << (int)providerId[0] << ", " << (int)contentId[0] << ", " - << fileSize << ", " << oct << fileMode << dec << ")" << endl; #endif @@ -494,7 +492,7 @@ PrjFS_Result PrjFS_UpdatePlaceholderFileIfNeeded( } // TODO(#1372): Ensure that races with hydration are handled properly - return PrjFS_WritePlaceholderFile(relativePath, providerId, contentId, fileSize, fileMode); + return PrjFS_WritePlaceholderFile(relativePath, providerId, contentId, fileMode); } PrjFS_Result PrjFS_ReplacePlaceholderFileWithSymLink( diff --git a/ProjFS.Mac/PrjFSLib/PrjFSLib.h b/ProjFS.Mac/PrjFSLib/PrjFSLib.h index 21a312c2c7..d68d47317a 100644 --- a/ProjFS.Mac/PrjFSLib/PrjFSLib.h +++ b/ProjFS.Mac/PrjFSLib/PrjFSLib.h @@ -85,7 +85,6 @@ extern "C" PrjFS_Result PrjFS_WritePlaceholderFile( _In_ const char* relativePath, _In_ unsigned char providerId[PrjFS_PlaceholderIdLength], _In_ unsigned char contentId[PrjFS_PlaceholderIdLength], - _In_ unsigned long fileSize, _In_ uint16_t fileMode); extern "C" PrjFS_Result PrjFS_WriteSymLink(