diff options
author | Ben Barham <ben_barham@apple.com> | 2022-04-11 14:50:28 -0700 |
---|---|---|
committer | Ben Barham <ben_barham@apple.com> | 2022-04-11 14:52:48 -0700 |
commit | fe2478d44e4f7f191c43fef629ac7a23d0251e72 (patch) | |
tree | 176fd46b0cd3aab8bc45b3fdc4392b96767c215d /llvm/unittests/Support/VirtualFileSystemTest.cpp | |
parent | 8b5e4c038ed7d79e377afd19e804b0b2e5419aa3 (diff) | |
download | llvm-fe2478d44e4f7f191c43fef629ac7a23d0251e72.zip llvm-fe2478d44e4f7f191c43fef629ac7a23d0251e72.tar.gz llvm-fe2478d44e4f7f191c43fef629ac7a23d0251e72.tar.bz2 |
[VFS] RedirectingFileSystem only replace path if not already mapped
If the `ExternalFS` has already remapped to an external path then
`RedirectingFileSystem` should not change it to the originally provided
path. This fixes the original path always being used if multiple VFS
overlays were provided and the path wasn't found in the highest (ie.
first in the chain).
For now this is accomplished through the use of a new
`ExposesExternalVFSPath` field on `vfs::Status`. This flag is true when
the `Status` has an external path that's different from its virtual
path, ie. the contained path is the external path. See the plan in
`FileManager::getFileRef` for where this is going - eventually we won't
need `IsVFSMapped` any more and all returned paths should be virtual.
Resolves rdar://90578880 and llvm-project#53306.
Reviewed By: dexonsmith
Differential Revision: https://reviews.llvm.org/D123398
Diffstat (limited to 'llvm/unittests/Support/VirtualFileSystemTest.cpp')
-rw-r--r-- | llvm/unittests/Support/VirtualFileSystemTest.cpp | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/llvm/unittests/Support/VirtualFileSystemTest.cpp b/llvm/unittests/Support/VirtualFileSystemTest.cpp index 9f73e89..52eba15 100644 --- a/llvm/unittests/Support/VirtualFileSystemTest.cpp +++ b/llvm/unittests/Support/VirtualFileSystemTest.cpp @@ -1443,11 +1443,13 @@ TEST_F(VFSFromYAMLTest, MappedFiles) { ASSERT_FALSE(S.getError()); EXPECT_EQ("//root/foo/bar/a", S->getName()); EXPECT_TRUE(S->IsVFSMapped); + EXPECT_TRUE(S->ExposesExternalVFSPath); ErrorOr<vfs::Status> SLower = O->status("//root/foo/bar/a"); EXPECT_EQ("//root/foo/bar/a", SLower->getName()); EXPECT_TRUE(S->equivalent(*SLower)); EXPECT_FALSE(SLower->IsVFSMapped); + EXPECT_FALSE(SLower->ExposesExternalVFSPath); // file after opening auto OpenedF = O->openFileForRead("//root/file1"); @@ -1456,6 +1458,7 @@ TEST_F(VFSFromYAMLTest, MappedFiles) { ASSERT_FALSE(OpenedS.getError()); EXPECT_EQ("//root/foo/bar/a", OpenedS->getName()); EXPECT_TRUE(OpenedS->IsVFSMapped); + EXPECT_TRUE(OpenedS->ExposesExternalVFSPath); // directory S = O->status("//root/"); @@ -1468,26 +1471,30 @@ TEST_F(VFSFromYAMLTest, MappedFiles) { ASSERT_FALSE(S.getError()); EXPECT_TRUE(S->isDirectory()); EXPECT_TRUE(S->IsVFSMapped); + EXPECT_TRUE(S->ExposesExternalVFSPath); EXPECT_TRUE(S->equivalent(*O->status("//root/foo/bar"))); SLower = O->status("//root/foo/bar"); EXPECT_EQ("//root/foo/bar", SLower->getName()); EXPECT_TRUE(S->equivalent(*SLower)); EXPECT_FALSE(SLower->IsVFSMapped); + EXPECT_FALSE(SLower->ExposesExternalVFSPath); // file in remapped directory S = O->status("//root/mappeddir/a"); ASSERT_FALSE(S.getError()); - ASSERT_FALSE(S->isDirectory()); - ASSERT_TRUE(S->IsVFSMapped); - ASSERT_EQ("//root/foo/bar/a", S->getName()); + EXPECT_FALSE(S->isDirectory()); + EXPECT_TRUE(S->IsVFSMapped); + EXPECT_TRUE(S->ExposesExternalVFSPath); + EXPECT_EQ("//root/foo/bar/a", S->getName()); // file in remapped directory, with use-external-name=false S = O->status("//root/mappeddir2/a"); ASSERT_FALSE(S.getError()); - ASSERT_FALSE(S->isDirectory()); - ASSERT_TRUE(S->IsVFSMapped); - ASSERT_EQ("//root/mappeddir2/a", S->getName()); + EXPECT_FALSE(S->isDirectory()); + EXPECT_TRUE(S->IsVFSMapped); + EXPECT_FALSE(S->ExposesExternalVFSPath); + EXPECT_EQ("//root/mappeddir2/a", S->getName()); // file contents in remapped directory OpenedF = O->openFileForRead("//root/mappeddir/a"); @@ -1496,6 +1503,7 @@ TEST_F(VFSFromYAMLTest, MappedFiles) { ASSERT_FALSE(OpenedS.getError()); EXPECT_EQ("//root/foo/bar/a", OpenedS->getName()); EXPECT_TRUE(OpenedS->IsVFSMapped); + EXPECT_TRUE(OpenedS->ExposesExternalVFSPath); // file contents in remapped directory, with use-external-name=false OpenedF = O->openFileForRead("//root/mappeddir2/a"); @@ -1504,6 +1512,7 @@ TEST_F(VFSFromYAMLTest, MappedFiles) { ASSERT_FALSE(OpenedS.getError()); EXPECT_EQ("//root/mappeddir2/a", OpenedS->getName()); EXPECT_TRUE(OpenedS->IsVFSMapped); + EXPECT_FALSE(OpenedS->ExposesExternalVFSPath); // broken mapping EXPECT_EQ(O->status("//root/file2").getError(), @@ -1536,11 +1545,13 @@ TEST_F(VFSFromYAMLTest, MappedRoot) { ASSERT_FALSE(S.getError()); EXPECT_EQ("//root/foo/bar/a", S->getName()); EXPECT_TRUE(S->IsVFSMapped); + EXPECT_TRUE(S->ExposesExternalVFSPath); ErrorOr<vfs::Status> SLower = O->status("//root/foo/bar/a"); EXPECT_EQ("//root/foo/bar/a", SLower->getName()); EXPECT_TRUE(S->equivalent(*SLower)); EXPECT_FALSE(SLower->IsVFSMapped); + EXPECT_FALSE(SLower->ExposesExternalVFSPath); // file after opening auto OpenedF = O->openFileForRead("//mappedroot/a"); @@ -1549,6 +1560,7 @@ TEST_F(VFSFromYAMLTest, MappedRoot) { ASSERT_FALSE(OpenedS.getError()); EXPECT_EQ("//root/foo/bar/a", OpenedS->getName()); EXPECT_TRUE(OpenedS->IsVFSMapped); + EXPECT_TRUE(OpenedS->ExposesExternalVFSPath); EXPECT_EQ(0, NumDiagnostics); } @@ -1697,11 +1709,13 @@ TEST_F(VFSFromYAMLTest, ReturnsRequestedPathVFSMiss) { ASSERT_FALSE(OpenedS.getError()); EXPECT_EQ("a", OpenedS->getName()); EXPECT_FALSE(OpenedS->IsVFSMapped); + EXPECT_FALSE(OpenedS->ExposesExternalVFSPath); auto DirectS = RemappedFS->status("a"); ASSERT_FALSE(DirectS.getError()); EXPECT_EQ("a", DirectS->getName()); EXPECT_FALSE(DirectS->IsVFSMapped); + EXPECT_FALSE(DirectS->ExposesExternalVFSPath); EXPECT_EQ(0, NumDiagnostics); } @@ -1737,11 +1751,13 @@ TEST_F(VFSFromYAMLTest, ReturnsExternalPathVFSHit) { ASSERT_FALSE(OpenedS.getError()); EXPECT_EQ("realname", OpenedS->getName()); EXPECT_TRUE(OpenedS->IsVFSMapped); + EXPECT_TRUE(OpenedS->ExposesExternalVFSPath); auto DirectS = FS->status("vfsname"); ASSERT_FALSE(DirectS.getError()); EXPECT_EQ("realname", DirectS->getName()); EXPECT_TRUE(DirectS->IsVFSMapped); + EXPECT_TRUE(DirectS->ExposesExternalVFSPath); EXPECT_EQ(0, NumDiagnostics); } @@ -1777,11 +1793,13 @@ TEST_F(VFSFromYAMLTest, ReturnsInternalPathVFSHit) { ASSERT_FALSE(OpenedS.getError()); EXPECT_EQ("vfsname", OpenedS->getName()); EXPECT_TRUE(OpenedS->IsVFSMapped); + EXPECT_FALSE(OpenedS->ExposesExternalVFSPath); auto DirectS = FS->status("vfsname"); ASSERT_FALSE(DirectS.getError()); EXPECT_EQ("vfsname", DirectS->getName()); EXPECT_TRUE(DirectS->IsVFSMapped); + EXPECT_FALSE(DirectS->ExposesExternalVFSPath); EXPECT_EQ(0, NumDiagnostics); } |