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
This commit is contained in:
Rafael Espindola 2013-06-27 03:45:31 +00:00
parent e2b9912a78
commit 08ddd12e44
4 changed files with 20 additions and 12 deletions

View File

@ -568,11 +568,16 @@ error_code status_known(const Twine &path, bool &result);
/// otherwise a platform specific error_code. /// otherwise a platform specific error_code.
error_code unique_file(const Twine &model, int &result_fd, error_code unique_file(const Twine &model, int &result_fd,
SmallVectorImpl<char> &result_path, 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. /// @brief Simpler version for clients that don't want an open file.
error_code unique_file(const Twine &Model, SmallVectorImpl<char> &ResultPath, 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. /// @brief Canonicalize path.
/// ///

View File

@ -642,6 +642,17 @@ error_code unique_file(const Twine &Model, SmallVectorImpl<char> &ResultPath,
return fs::remove(P); 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) { error_code make_absolute(SmallVectorImpl<char> &path) {
StringRef p(path.data(), path.size()); StringRef p(path.data(), path.size());

View File

@ -30,12 +30,8 @@ TEST(FileOutputBuffer, Test) {
// Create unique temporary directory for these tests // Create unique temporary directory for these tests
SmallString<128> TestDirectory; SmallString<128> TestDirectory;
{ {
int fd;
ASSERT_NO_ERROR( ASSERT_NO_ERROR(
fs::unique_file("FileOutputBuffer-test-%%-%%-%%-%%/dir", fd, fs::createUniqueDirectory("FileOutputBuffer-test", TestDirectory));
TestDirectory));
::close(fd);
TestDirectory = path::parent_path(TestDirectory);
} }
// TEST 1: Verify commit case. // TEST 1: Verify commit case.

View File

@ -147,13 +147,9 @@ protected:
SmallString<128> TestDirectory; SmallString<128> TestDirectory;
virtual void SetUp() { virtual void SetUp() {
int fd;
ASSERT_NO_ERROR( ASSERT_NO_ERROR(
fs::unique_file("file-system-test-%%-%%-%%-%%/test-directory.anchor", fd, fs::createUniqueDirectory("file-system-test", TestDirectory));
TestDirectory));
// We don't care about this specific file. // We don't care about this specific file.
::close(fd);
TestDirectory = path::parent_path(TestDirectory);
errs() << "Test Directory: " << TestDirectory << '\n'; errs() << "Test Directory: " << TestDirectory << '\n';
errs().flush(); errs().flush();
} }