[PATCH] D65297: [FileCollector] add support for recording empty directories

Alex Lorenz via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 25 14:46:56 PDT 2019


This revision was automatically updated to reflect the committed changes.
Closed by commit rL367061: [FileCollector] add support for recording empty directories (authored by arphaman, committed by ).
Herald added a subscriber: kristina.

Changed prior to commit:
  https://reviews.llvm.org/D65297?vs=211804&id=211827#toc

Repository:
  rL LLVM

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D65297/new/

https://reviews.llvm.org/D65297

Files:
  llvm/trunk/lib/Support/FileCollector.cpp
  llvm/trunk/unittests/Support/FileCollectorTest.cpp


Index: llvm/trunk/lib/Support/FileCollector.cpp
===================================================================
--- llvm/trunk/lib/Support/FileCollector.cpp
+++ llvm/trunk/lib/Support/FileCollector.cpp
@@ -132,6 +132,25 @@
         return EC;
     }
 
+    // Get the status of the original file/directory.
+    sys::fs::file_status Stat;
+    if (std::error_code EC = sys::fs::status(entry.VPath, Stat)) {
+      if (StopOnError)
+        return EC;
+      continue;
+    }
+
+    if (Stat.type() == sys::fs::file_type::directory_file) {
+      // Construct a directory when it's just a directory entry.
+      if (std::error_code EC =
+              sys::fs::create_directories(entry.RPath,
+                                          /*IgnoreExisting=*/true)) {
+        if (StopOnError)
+          return EC;
+      }
+      continue;
+    }
+
     // Copy file over.
     if (std::error_code EC = sys::fs::copy_file(entry.VPath, entry.RPath)) {
       if (StopOnError)
@@ -147,12 +166,6 @@
     }
 
     // Copy over modification time.
-    sys::fs::file_status Stat;
-    if (std::error_code EC = sys::fs::status(entry.VPath, Stat)) {
-      if (StopOnError)
-        return EC;
-      continue;
-    }
     copyAccessAndModificationTime(entry.RPath, Stat);
   }
   return {};
Index: llvm/trunk/unittests/Support/FileCollectorTest.cpp
===================================================================
--- llvm/trunk/unittests/Support/FileCollectorTest.cpp
+++ llvm/trunk/unittests/Support/FileCollectorTest.cpp
@@ -148,6 +148,37 @@
   EXPECT_FALSE(ec);
 }
 
+TEST(FileCollectorTest, recordAndConstructDirectory) {
+  ScopedDir file_root("dir_root", true);
+  ScopedDir subdir(file_root + "/subdir");
+  ScopedDir subdir2(file_root + "/subdir2");
+  ScopedFile a(subdir2 + "/a");
+
+  // Create file collector and add files.
+  ScopedDir root("copy_files_root", true);
+  std::string root_fs = root.Path.str();
+  TestingFileCollector FileCollector(root_fs, root_fs);
+  FileCollector.addFile(a.Path);
+
+  // The empty directory isn't seen until we add it.
+  EXPECT_TRUE(FileCollector.hasSeen(a.Path));
+  EXPECT_FALSE(FileCollector.hasSeen(subdir.Path));
+
+  FileCollector.addFile(subdir.Path);
+  EXPECT_TRUE(FileCollector.hasSeen(subdir.Path));
+
+  // Make sure we can construct the directory.
+  std::error_code ec = FileCollector.copyFiles(true);
+  EXPECT_FALSE(ec);
+  bool IsDirectory = false;
+  llvm::SmallString<128> SubdirInRoot = root.Path;
+  llvm::sys::path::append(SubdirInRoot,
+                          llvm::sys::path::relative_path(subdir.Path));
+  ec = sys::fs::is_directory(SubdirInRoot, IsDirectory);
+  EXPECT_FALSE(ec);
+  ASSERT_TRUE(IsDirectory);
+}
+
 #ifndef _WIN32
 TEST(FileCollectorTest, Symlinks) {
   // Root where the original files live.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D65297.211827.patch
Type: text/x-patch
Size: 2790 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190725/9301e9a6/attachment.bin>


More information about the llvm-commits mailing list