/// @result True if a home directory is set, false otherwise.
bool home_directory(SmallVectorImpl<char> &result);
-/// Get the user's cache directory.
-///
-/// Expect the resulting path to be a directory shared with other
-/// applications/services used by the user. Params \p Path1 to \p Path3 can be
-/// used to append additional directory names to the resulting path. Recommended
-/// pattern is <user_cache_directory>/<vendor>/<application>.
-///
-/// @param Result Holds the resulting path.
-/// @param Path1 Additional path to be appended to the user's cache directory
-/// path. "" can be used to append nothing.
-/// @param Path2 Second additional path to be appended.
-/// @param Path3 Third additional path to be appended.
-/// @result True if a cache directory path is set, false otherwise.
-bool user_cache_directory(SmallVectorImpl<char> &Result, const Twine &Path1,
- const Twine &Path2 = "", const Twine &Path3 = "");
-
/// Has root name?
///
/// root_name != ""
}
}
-namespace path {
-
-bool user_cache_directory(SmallVectorImpl<char> &Result, const Twine &Path1,
- const Twine &Path2, const Twine &Path3) {
- if (getUserCacheDir(Result)) {
- append(Result, Path1, Path2, Path3);
- return true;
- }
- return false;
-}
-
-} // end namespace path
} // end namsspace sys
} // end namespace llvm
return false;
}
-static bool getUserCacheDir(SmallVectorImpl<char> &Result) {
- // First try using XDG_CACHE_HOME env variable,
- // as specified in XDG Base Directory Specification at
- // http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
- if (const char *XdgCacheDir = std::getenv("XDG_CACHE_HOME")) {
- Result.clear();
- Result.append(XdgCacheDir, XdgCacheDir + strlen(XdgCacheDir));
- return true;
- }
-
- // Try Darwin configuration query
- if (getDarwinConfDir(false, Result))
- return true;
-
- // Use "$HOME/.cache" if $HOME is available
- if (home_directory(Result)) {
- append(Result, ".cache");
- return true;
- }
-
- return false;
-}
-
static const char *getEnvTempDir() {
// Check whether the temporary directory is specified by an environment
// variable.
return ok;
}
-bool getUserCacheDir(SmallVectorImpl<char> &Result) {
- return getKnownFolderPath(FOLDERID_LocalAppData, Result);
-}
-
bool home_directory(SmallVectorImpl<char> &result) {
return getKnownFolderPath(FOLDERID_Profile, result);
}
}
#endif
-TEST(Support, UserCacheDirectory) {
- SmallString<13> CacheDir;
- SmallString<20> CacheDir2;
- auto Status = path::user_cache_directory(CacheDir, "");
- EXPECT_TRUE(Status ^ CacheDir.empty());
-
- if (Status) {
- EXPECT_TRUE(path::user_cache_directory(CacheDir2, "")); // should succeed
- EXPECT_EQ(CacheDir, CacheDir2); // and return same paths
-
- EXPECT_TRUE(path::user_cache_directory(CacheDir, "A", "B", "file.c"));
- auto It = path::rbegin(CacheDir);
- EXPECT_EQ("file.c", *It);
- EXPECT_EQ("B", *++It);
- EXPECT_EQ("A", *++It);
- auto ParentDir = *++It;
-
- // Test Unicode: "<user_cache_dir>/(pi)r^2/aleth.0"
- EXPECT_TRUE(path::user_cache_directory(CacheDir2, "\xCF\x80r\xC2\xB2",
- "\xE2\x84\xB5.0"));
- auto It2 = path::rbegin(CacheDir2);
- EXPECT_EQ("\xE2\x84\xB5.0", *It2);
- EXPECT_EQ("\xCF\x80r\xC2\xB2", *++It2);
- auto ParentDir2 = *++It2;
-
- EXPECT_EQ(ParentDir, ParentDir2);
- }
-}
-
TEST(Support, TempDirectory) {
SmallString<32> TempDir;
path::system_temp_directory(false, TempDir);