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(