Add a convenience createUniqueDirectory function.
authorRafael Espindola <rafael.espindola@gmail.com>
Thu, 27 Jun 2013 03:45:31 +0000 (03:45 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Thu, 27 Jun 2013 03:45:31 +0000 (03:45 +0000)
There are a few valid situation where we care about the structure inside a
directory, but not about the directory itself. A simple example is for unit
testing directory traversal.

PathV1 had a function like this, add one to V2 and port existing users of the
created temp file and delete it hack to using it.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@185059 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/FileSystem.h
lib/Support/Path.cpp
unittests/Support/FileOutputBufferTest.cpp
unittests/Support/Path.cpp

index b72192753c739968146ca0e9e20dd5e53c378e9a..ac46117f274d4ff6bdaf6f28ff8fc8ec98563887 100644 (file)
@@ -568,11 +568,16 @@ error_code status_known(const Twine &path, bool &result);
 ///          otherwise a platform specific error_code.
 error_code unique_file(const Twine &model, int &result_fd,
                        SmallVectorImpl<char> &result_path,
-                       bool makeAbsolute = true, unsigned mode = owner_read | owner_write);
+                       bool makeAbsolute = true,
+                       unsigned mode = owner_read | owner_write);
 
 /// @brief Simpler version for clients that don't want an open file.
 error_code unique_file(const Twine &Model, SmallVectorImpl<char> &ResultPath,
-                       bool MakeAbsolute = true, unsigned Mode = owner_read | owner_write);
+                       bool MakeAbsolute = true,
+                       unsigned Mode = owner_read | owner_write);
+
+error_code createUniqueDirectory(const Twine &Prefix,
+                                 SmallVectorImpl<char> &ResultPath);
 
 /// @brief Canonicalize path.
 ///
index 8b9e60a2d9ec17bbae7672442560d1f6112b3257..a631c760fd7c96dead52a5e55f14b5376bf6401c 100644 (file)
@@ -642,6 +642,17 @@ error_code unique_file(const Twine &Model, SmallVectorImpl<char> &ResultPath,
   return fs::remove(P);
 }
 
+error_code createUniqueDirectory(const Twine &Prefix,
+                                 SmallVectorImpl<char> &ResultPath) {
+  // FIXME: This is double inefficient. We compute a unique file name, created
+  // it, delete it and keep only the directory.
+  error_code EC = unique_file(Prefix + "-%%%%%%/dummy", ResultPath);
+  if (EC)
+    return EC;
+  path::remove_filename(ResultPath);
+  return error_code::success();
+}
+
 error_code make_absolute(SmallVectorImpl<char> &path) {
   StringRef p(path.data(), path.size());
 
index c7ca1ab6a612f2355f430f9a2cdecee939b89aa0..5e873193f28868fbcc8a41665354cd16111cf4d3 100644 (file)
@@ -30,12 +30,8 @@ TEST(FileOutputBuffer, Test) {
   // Create unique temporary directory for these tests
   SmallString<128> TestDirectory;
   {
-    int fd;
     ASSERT_NO_ERROR(
-      fs::unique_file("FileOutputBuffer-test-%%-%%-%%-%%/dir", fd,
-                      TestDirectory));
-    ::close(fd);
-    TestDirectory = path::parent_path(TestDirectory);
+        fs::createUniqueDirectory("FileOutputBuffer-test", TestDirectory));
   }
 
   // TEST 1: Verify commit case.
index d5591ea1bdc27e3073a3ec4f71996dcd74c8ab94..ce335ccc6b1c59d632a7a305ed395b535b2b1122 100644 (file)
@@ -147,13 +147,9 @@ protected:
   SmallString<128> TestDirectory;
 
   virtual void SetUp() {
-    int fd;
     ASSERT_NO_ERROR(
-      fs::unique_file("file-system-test-%%-%%-%%-%%/test-directory.anchor", fd,
-                      TestDirectory));
+        fs::createUniqueDirectory("file-system-test", TestDirectory));
     // We don't care about this specific file.
-    ::close(fd);
-    TestDirectory = path::parent_path(TestDirectory);
     errs() << "Test Directory: " << TestDirectory << '\n';
     errs().flush();
   }