[llvm] r311382 - [Support, Windows] Handle long paths with unix separators
Pirama Arumuga Nainar via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 21 13:49:44 PDT 2017
Author: pirama
Date: Mon Aug 21 13:49:44 2017
New Revision: 311382
URL: http://llvm.org/viewvc/llvm-project?rev=311382&view=rev
Log:
[Support, Windows] Handle long paths with unix separators
Summary:
The function widenPath() for Windows also normalizes long path names by
iterating over the path's components and calling append(). The
assumption during the iteration that separators are not returned by the
iterator doesn't hold because the iterators do return a separator when
the path has a drive name. Handle this case by ignoring separators
during iteration.
Reviewers: rnk
Subscribers: danalbert, srhines
Differential Revision: https://reviews.llvm.org/D36752
Modified:
llvm/trunk/lib/Support/Windows/Path.inc
llvm/trunk/unittests/Support/Path.cpp
Modified: llvm/trunk/lib/Support/Windows/Path.inc
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Windows/Path.inc?rev=311382&r1=311381&r2=311382&view=diff
==============================================================================
--- llvm/trunk/lib/Support/Windows/Path.inc (original)
+++ llvm/trunk/lib/Support/Windows/Path.inc Mon Aug 21 13:49:44 2017
@@ -94,13 +94,16 @@ std::error_code widenPath(const Twine &P
return EC;
FullPath.append(CurPath);
}
- // Traverse the requested path, canonicalizing . and .. as we go (because
- // the \\?\ prefix is documented to treat them as real components).
- // The iterators don't report separators and append() always attaches
- // preferred_separator so we don't need to call native() on the result.
+ // Traverse the requested path, canonicalizing . and .. (because the \\?\
+ // prefix is documented to treat them as real components). Ignore
+ // separators, which can be returned from the iterator if the path has a
+ // drive name. We don't need to call native() on the result since append()
+ // always attaches preferred_separator.
for (llvm::sys::path::const_iterator I = llvm::sys::path::begin(Path8Str),
E = llvm::sys::path::end(Path8Str);
I != E; ++I) {
+ if (I->size() == 1 && is_separator((*I)[0]))
+ continue;
if (I->size() == 1 && *I == ".")
continue;
if (I->size() == 2 && *I == "..")
Modified: llvm/trunk/unittests/Support/Path.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/Path.cpp?rev=311382&r1=311381&r2=311382&view=diff
==============================================================================
--- llvm/trunk/unittests/Support/Path.cpp (original)
+++ llvm/trunk/unittests/Support/Path.cpp Mon Aug 21 13:49:44 2017
@@ -699,6 +699,21 @@ TEST_F(FileSystemTest, CreateDir) {
ThisDir = path::parent_path(ThisDir);
}
+ // Also verify that paths with Unix separators are handled correctly.
+ std::string LongPathWithUnixSeparators(TestDirectory.str());
+ // Add at least one subdirectory to TestDirectory, and replace slashes with
+ // backslashes
+ do {
+ LongPathWithUnixSeparators.append("/DirNameWith19Charss");
+ } while (LongPathWithUnixSeparators.size() < 260);
+ std::replace(LongPathWithUnixSeparators.begin(),
+ LongPathWithUnixSeparators.end(),
+ '\\', '/');
+ ASSERT_NO_ERROR(fs::create_directories(Twine(LongPathWithUnixSeparators)));
+ // cleanup
+ ASSERT_NO_ERROR(fs::remove_directories(Twine(TestDirectory) +
+ "/DirNameWith19Charss"));
+
// Similarly for a relative pathname. Need to set the current directory to
// TestDirectory so that the one we create ends up in the right place.
char PreviousDir[260];
More information about the llvm-commits
mailing list