From 20b8640b048912e8e93ff83bcadd24e164377ca3 Mon Sep 17 00:00:00 2001 From: Lance Barnes Date: Mon, 12 May 2025 17:13:08 -0600 Subject: [PATCH 1/6] Added test to verify root can be virtualized --- .../InMemoryFileSystemTests.cs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/test/Microsoft.TemplateEngine.Utils.UnitTests/InMemoryFileSystemTests.cs b/test/Microsoft.TemplateEngine.Utils.UnitTests/InMemoryFileSystemTests.cs index 7da80beb1b1..c9f04209b36 100644 --- a/test/Microsoft.TemplateEngine.Utils.UnitTests/InMemoryFileSystemTests.cs +++ b/test/Microsoft.TemplateEngine.Utils.UnitTests/InMemoryFileSystemTests.cs @@ -22,5 +22,18 @@ public void VerifyMultipleVirtualizationsAreHandled() Assert.True(virtualized1.FileExists(testFilePath)); Assert.True(virtualized2.FileExists(testFilePath)); } + + [Fact] + public void VerifyRootCanBeVirtualized() + { + IPhysicalFileSystem mockFileSystem = new MockFileSystem(); + IPhysicalFileSystem virtualized = new InMemoryFileSystem(Path.GetPathRoot(Directory.GetCurrentDirectory())!, mockFileSystem); + + string testFilePath = Path.Combine(Directory.GetCurrentDirectory(), "test.txt"); + virtualized.WriteAllText(testFilePath, "test"); + + var entries = virtualized.EnumerateFileSystemEntries(Directory.GetCurrentDirectory(), "*", SearchOption.TopDirectoryOnly).ToList(); + Assert.Single(entries); + } } } From 7a3a999180ab1731de79436b9dda687cc219422b Mon Sep 17 00:00:00 2001 From: Lance Barnes Date: Mon, 12 May 2025 17:51:29 -0600 Subject: [PATCH 2/6] Update InMemoryFileSystemTests.cs --- .../InMemoryFileSystemTests.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/Microsoft.TemplateEngine.Utils.UnitTests/InMemoryFileSystemTests.cs b/test/Microsoft.TemplateEngine.Utils.UnitTests/InMemoryFileSystemTests.cs index c9f04209b36..0828fc5f65d 100644 --- a/test/Microsoft.TemplateEngine.Utils.UnitTests/InMemoryFileSystemTests.cs +++ b/test/Microsoft.TemplateEngine.Utils.UnitTests/InMemoryFileSystemTests.cs @@ -34,6 +34,8 @@ public void VerifyRootCanBeVirtualized() var entries = virtualized.EnumerateFileSystemEntries(Directory.GetCurrentDirectory(), "*", SearchOption.TopDirectoryOnly).ToList(); Assert.Single(entries); + + Assert.Equal(testFilePath, entries[0]); } } } From bd3a363c4868274e5e785a0d4622481f3b49e47d Mon Sep 17 00:00:00 2001 From: Lance Barnes Date: Mon, 12 May 2025 17:52:48 -0600 Subject: [PATCH 3/6] Update InMemoryFileSystem.cs --- src/Microsoft.TemplateEngine.Utils/InMemoryFileSystem.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Microsoft.TemplateEngine.Utils/InMemoryFileSystem.cs b/src/Microsoft.TemplateEngine.Utils/InMemoryFileSystem.cs index 7bdfa45d325..680abbad7fa 100644 --- a/src/Microsoft.TemplateEngine.Utils/InMemoryFileSystem.cs +++ b/src/Microsoft.TemplateEngine.Utils/InMemoryFileSystem.cs @@ -81,6 +81,8 @@ public Stream CreateFile(string path) currentDir = dir; } + Console.WriteLine($"Creating file {parts[parts.Length - 1]} in {currentDir.FullPath}"); + if (!currentDir.Files.TryGetValue(parts[parts.Length - 1], out FileSystemFile targetFile)) { targetFile = new FileSystemFile(parts[parts.Length - 1], Path.Combine(currentDir.FullPath, parts[parts.Length - 1])); From 2d7c5d5f87d85ec98eb75d17c8b3d6734b0cc0bb Mon Sep 17 00:00:00 2001 From: Lance Barnes Date: Mon, 12 May 2025 18:03:10 -0600 Subject: [PATCH 4/6] Update InMemoryFileSystem.cs --- .../InMemoryFileSystem.cs | 54 +------------------ 1 file changed, 2 insertions(+), 52 deletions(-) diff --git a/src/Microsoft.TemplateEngine.Utils/InMemoryFileSystem.cs b/src/Microsoft.TemplateEngine.Utils/InMemoryFileSystem.cs index 680abbad7fa..7c6a093ca41 100644 --- a/src/Microsoft.TemplateEngine.Utils/InMemoryFileSystem.cs +++ b/src/Microsoft.TemplateEngine.Utils/InMemoryFileSystem.cs @@ -698,58 +698,8 @@ public IDisposable WatchFileChanges(string filePath, FileSystemEventHandler file private bool IsPathInCone(string path, out string processedPath) { - if (!Path.IsPathRooted(path)) - { - path = Path.Combine(GetCurrentDirectory(), path); - } - - path = path.Replace('\\', '/'); - - bool leadSlash = path[0] == '/'; - - if (leadSlash) - { - path = path.Substring(1); - } - - string[] parts = path.Split('/'); - - List realParts = new(); - - for (int i = 0; i < parts.Length; ++i) - { - if (string.IsNullOrEmpty(parts[i])) - { - continue; - } - - switch (parts[i]) - { - case ".": - continue; - case "..": - realParts.RemoveAt(realParts.Count - 1); - break; - default: - realParts.Add(parts[i]); - break; - } - } - - if (leadSlash) - { - realParts.Insert(0, string.Empty); - } - - processedPath = string.Join(Path.DirectorySeparatorChar + string.Empty, realParts); - if (processedPath.Equals(_root.FullPath) || processedPath.StartsWith(_root.FullPath.TrimEnd('/', '\\') + Path.DirectorySeparatorChar)) - { - return true; - } - else - { - return false; - } + processedPath = Path.IsPathRooted(path) ? path : Path.Combine(GetCurrentDirectory(), path); + return processedPath.Equals(_root.FullPath) || processedPath.StartsWith(_root.FullPath); } private class FileSystemDirectory From b326caa2579d8604cac4ea8f5eb805658d0f2f14 Mon Sep 17 00:00:00 2001 From: Lance Barnes Date: Mon, 12 May 2025 18:17:52 -0600 Subject: [PATCH 5/6] Remove Console WriteLine --- src/Microsoft.TemplateEngine.Utils/InMemoryFileSystem.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Microsoft.TemplateEngine.Utils/InMemoryFileSystem.cs b/src/Microsoft.TemplateEngine.Utils/InMemoryFileSystem.cs index 7c6a093ca41..03ff14d7b41 100644 --- a/src/Microsoft.TemplateEngine.Utils/InMemoryFileSystem.cs +++ b/src/Microsoft.TemplateEngine.Utils/InMemoryFileSystem.cs @@ -81,8 +81,6 @@ public Stream CreateFile(string path) currentDir = dir; } - Console.WriteLine($"Creating file {parts[parts.Length - 1]} in {currentDir.FullPath}"); - if (!currentDir.Files.TryGetValue(parts[parts.Length - 1], out FileSystemFile targetFile)) { targetFile = new FileSystemFile(parts[parts.Length - 1], Path.Combine(currentDir.FullPath, parts[parts.Length - 1])); From 239ed9f3ca3c39134973a1b00d90612d1654794f Mon Sep 17 00:00:00 2001 From: Lance Barnes Date: Mon, 12 May 2025 19:22:57 -0600 Subject: [PATCH 6/6] Re-introduce handling mount point in IsPathInCone --- src/Microsoft.TemplateEngine.Utils/InMemoryFileSystem.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.TemplateEngine.Utils/InMemoryFileSystem.cs b/src/Microsoft.TemplateEngine.Utils/InMemoryFileSystem.cs index 03ff14d7b41..e0d5d9927d9 100644 --- a/src/Microsoft.TemplateEngine.Utils/InMemoryFileSystem.cs +++ b/src/Microsoft.TemplateEngine.Utils/InMemoryFileSystem.cs @@ -697,7 +697,11 @@ public IDisposable WatchFileChanges(string filePath, FileSystemEventHandler file private bool IsPathInCone(string path, out string processedPath) { processedPath = Path.IsPathRooted(path) ? path : Path.Combine(GetCurrentDirectory(), path); - return processedPath.Equals(_root.FullPath) || processedPath.StartsWith(_root.FullPath); + processedPath = processedPath + .Replace('/', Path.DirectorySeparatorChar) + .Replace('\\', Path.DirectorySeparatorChar) + .Replace($"{Path.DirectorySeparatorChar}.{Path.DirectorySeparatorChar}", $"{Path.DirectorySeparatorChar}"); + return processedPath.StartsWith(_root.FullPath); } private class FileSystemDirectory