aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/cpp/util
diff options
context:
space:
mode:
authorGravatar Laszlo Csomor <laszlocsomor@google.com>2017-01-10 16:06:42 +0000
committerGravatar Marcel Hlopko <hlopko@google.com>2017-01-10 19:42:02 +0000
commit93faf597b35c0638a66dbb32da4db5aa831caecf (patch)
tree0f10a5a8add3f436e044f3335670a3f95322573e /src/main/cpp/util
parent2f23599dda8f580234fc5a97675561cc86127444 (diff)
Bazel client, Windows: implement IsDirectory
See https://github.com/bazelbuild/bazel/issues/2107 -- PiperOrigin-RevId: 144084379 MOS_MIGRATED_REVID=144084379
Diffstat (limited to 'src/main/cpp/util')
-rw-r--r--src/main/cpp/util/file_posix.cc2
-rw-r--r--src/main/cpp/util/file_windows.cc26
2 files changed, 21 insertions, 7 deletions
diff --git a/src/main/cpp/util/file_posix.cc b/src/main/cpp/util/file_posix.cc
index f4890a0294..466bae499d 100644
--- a/src/main/cpp/util/file_posix.cc
+++ b/src/main/cpp/util/file_posix.cc
@@ -248,12 +248,12 @@ bool CanAccess(const string& path, bool read, bool write, bool exec) {
return access(path.c_str(), mode) == 0;
}
+#ifndef __CYGWIN__
bool IsDirectory(const string& path) {
struct stat buf;
return stat(path.c_str(), &buf) == 0 && S_ISDIR(buf.st_mode);
}
-#ifndef __CYGWIN__
bool IsRootDirectory(const string &path) {
return path.size() == 1 && path[0] == '/';
}
diff --git a/src/main/cpp/util/file_windows.cc b/src/main/cpp/util/file_windows.cc
index 2b4a105f05..3a5b5ac8e4 100644
--- a/src/main/cpp/util/file_windows.cc
+++ b/src/main/cpp/util/file_windows.cc
@@ -38,6 +38,11 @@ using std::wstring;
// The result may have a UNC prefix.
static unique_ptr<WCHAR[]> GetCwdW();
+// Returns true if `path` refers to a directory or (non-dangling) junction.
+// `path` must be a normalized Windows path, with UNC prefix (and absolute) if
+// necessary.
+static bool IsDirectoryW(const wstring& path);
+
// Like `AsWindowsPath` but the result is absolute and has UNC prefix if needed.
static bool AsWindowsPathWithUncPrefix(const string& path, wstring* wpath);
@@ -551,14 +556,23 @@ bool CanAccess(const string& path, bool read, bool write, bool exec) {
#else // not COMPILER_MSVC
#endif // COMPILER_MSVC
-#ifdef COMPILER_MSVC
+static bool IsDirectoryW(const wstring& path) {
+ DWORD attrs = ::GetFileAttributesW(path.c_str());
+ return (attrs != INVALID_FILE_ATTRIBUTES) &&
+ (attrs & FILE_ATTRIBUTE_DIRECTORY) &&
+ JunctionResolver().Resolve(path.c_str(), nullptr);
+}
+
bool IsDirectory(const string& path) {
- // TODO(bazel-team): implement this.
- pdie(255, "blaze_util::IsDirectory is not implemented on Windows");
- return false;
+ if (path.empty()) {
+ return false;
+ }
+ wstring wpath;
+ if (!AsWindowsPathWithUncPrefix(path, &wpath)) {
+ return false;
+ }
+ return IsDirectoryW(wpath);
}
-#else // not COMPILER_MSVC
-#endif // COMPILER_MSVC
bool IsRootDirectory(const string& path) {
return IsRootOrAbsolute(path, true);