[PATCH] D27527: Process tilde in llvm::sys::path::native.
Serge Pavlov via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Dec 7 08:51:58 PST 2016
sepavloff created this revision.
sepavloff added a subscriber: llvm-commits.
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`.
https://reviews.llvm.org/D27527
Files:
lib/Support/Path.cpp
unittests/Support/Path.cpp
Index: unittests/Support/Path.cpp
===================================================================
--- unittests/Support/Path.cpp
+++ unittests/Support/Path.cpp
@@ -940,6 +940,33 @@
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_TRUE(Path8.equals(PathHome));
+
+ const char *Path9a = "~aaa";
+ SmallString<64> Path9(Path9a);
+ path::native(Path9);
+ EXPECT_TRUE(Path9.equals("~aaa"));
+
+ const char *Path10a = "aaa/~/b";
+ SmallString<64> Path10(Path10a);
+ path::native(Path10);
+ EXPECT_TRUE(Path10.equals("aaa\\~\\b"));
+#endif
}
TEST(Support, RemoveLeadingDotSlash) {
Index: lib/Support/Path.cpp
===================================================================
--- lib/Support/Path.cpp
+++ lib/Support/Path.cpp
@@ -556,8 +556,16 @@
}
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 == '\\') {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D27527.80604.patch
Type: text/x-patch
Size: 1679 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161207/fc5ff199/attachment.bin>
More information about the llvm-commits
mailing list