From: Rafael Espindola Date: Thu, 27 Jun 2013 03:45:31 +0000 (+0000) Subject: Add a convenience createUniqueDirectory function. X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=08ddd12e444880b4d570ac42a42414a227022190;p=oota-llvm.git Add a convenience createUniqueDirectory function. 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 --- diff --git a/include/llvm/Support/FileSystem.h b/include/llvm/Support/FileSystem.h index b72192753c7..ac46117f274 100644 --- a/include/llvm/Support/FileSystem.h +++ b/include/llvm/Support/FileSystem.h @@ -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 &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 &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 &ResultPath); /// @brief Canonicalize path. /// diff --git a/lib/Support/Path.cpp b/lib/Support/Path.cpp index 8b9e60a2d9e..a631c760fd7 100644 --- a/lib/Support/Path.cpp +++ b/lib/Support/Path.cpp @@ -642,6 +642,17 @@ error_code unique_file(const Twine &Model, SmallVectorImpl &ResultPath, return fs::remove(P); } +error_code createUniqueDirectory(const Twine &Prefix, + SmallVectorImpl &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 &path) { StringRef p(path.data(), path.size()); diff --git a/unittests/Support/FileOutputBufferTest.cpp b/unittests/Support/FileOutputBufferTest.cpp index c7ca1ab6a61..5e873193f28 100644 --- a/unittests/Support/FileOutputBufferTest.cpp +++ b/unittests/Support/FileOutputBufferTest.cpp @@ -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. diff --git a/unittests/Support/Path.cpp b/unittests/Support/Path.cpp index d5591ea1bdc..ce335ccc6b1 100644 --- a/unittests/Support/Path.cpp +++ b/unittests/Support/Path.cpp @@ -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(); }