1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 11:13:28 +01:00

Process tilde in llvm::sys::path::native

Windows does not treat `~` as a reference to home directory, so the call
to `llvm::sys::path::native` on, say, `~/somedir` produces `~\somedir`,
which has different meaning than the original path. With this change
tilde is expanded on Windows to user profile directory. Such behavior
keeps original meaning of the path and is consistent with the algorithm
of `llvm::sys::path::home_directory`.

Differential Revision: https://reviews.llvm.org/D27527

llvm-svn: 296590
This commit is contained in:
Serge Pavlov 2017-03-01 09:38:15 +00:00
parent 0fd5f7641d
commit 650342e8ee
2 changed files with 35 additions and 0 deletions

View File

@ -556,8 +556,16 @@ void native(const Twine &path, SmallVectorImpl<char> &result) {
}
void native(SmallVectorImpl<char> &Path) {
if (Path.empty())
return;
#ifdef LLVM_ON_WIN32
std::replace(Path.begin(), Path.end(), '/', '\\');
if (Path[0] == '~' && (Path.size() == 1 || is_separator(Path[1]))) {
SmallString<128> PathHome;
home_directory(PathHome);
PathHome.append(Path.begin() + 1, Path.end());
Path = PathHome;
}
#else
for (auto PI = Path.begin(), PE = Path.end(); PI < PE; ++PI) {
if (*PI == '\\') {

View File

@ -968,6 +968,33 @@ TEST(Support, NormalizePath) {
EXPECT_PATH_IS(Path6, "a\\", "a/");
#undef EXPECT_PATH_IS
#if defined(LLVM_ON_WIN32)
SmallString<64> PathHome;
path::home_directory(PathHome);
const char *Path7a = "~/aaa";
SmallString<64> Path7(Path7a);
path::native(Path7);
EXPECT_TRUE(Path7.endswith("\\aaa"));
EXPECT_TRUE(Path7.startswith(PathHome));
EXPECT_EQ(Path7.size(), PathHome.size() + strlen(Path7a + 1));
const char *Path8a = "~";
SmallString<64> Path8(Path8a);
path::native(Path8);
EXPECT_EQ(Path8, PathHome);
const char *Path9a = "~aaa";
SmallString<64> Path9(Path9a);
path::native(Path9);
EXPECT_EQ(Path9, "~aaa");
const char *Path10a = "aaa/~/b";
SmallString<64> Path10(Path10a);
path::native(Path10);
EXPECT_EQ(Path10, "aaa\\~\\b");
#endif
}
TEST(Support, RemoveLeadingDotSlash) {