Rollback of commit d5527469ca629f806a7576783289cc0613bf418b.

*** Reason for rollback ***

Breaks Bazel-Install-Trigger on CI.

*** Original change description ***

Bazel client, Windows: impl. ForEachDirectoryEntry

Implement ForEachDirectoryEntry on Windows using
FindFirstFileW / FindNextFileW.

Supports long paths and traversing junctions.

See https://github.com/bazelbuild/bazel/issues/2107
See https://github.com/bazelbuild/bazel/issues/2181

--
PiperOrigin-RevId: 145282158
MOS_MIGRATED_REVID=145282158
diff --git a/src/main/cpp/util/file_posix.cc b/src/main/cpp/util/file_posix.cc
index c45eb39..a1d806a 100644
--- a/src/main/cpp/util/file_posix.cc
+++ b/src/main/cpp/util/file_posix.cc
@@ -364,6 +364,7 @@
 bool ChangeDirectory(const string& path) {
   return chdir(path.c_str()) == 0;
 }
+#endif  // not __CYGWIN__
 
 void ForEachDirectoryEntry(const string &path,
                            DirectoryEntryConsumer *consume) {
@@ -397,6 +398,5 @@
 
   closedir(dir);
 }
-#endif  // not __CYGWIN__
 
 }  // namespace blaze_util
diff --git a/src/main/cpp/util/file_windows.cc b/src/main/cpp/util/file_windows.cc
index bea092d..b1faddd 100644
--- a/src/main/cpp/util/file_windows.cc
+++ b/src/main/cpp/util/file_windows.cc
@@ -993,37 +993,14 @@
   return true;
 }
 
+#ifdef COMPILER_MSVC
 void ForEachDirectoryEntry(const string &path,
                            DirectoryEntryConsumer *consume) {
-  wstring wpath;
-  if (path.empty() || IsDevNull(path)) {
-    return;
-  }
-  if (!AsWindowsPath(path, &wpath)) {
-    pdie(blaze_exit_code::LOCAL_ENVIRONMENTAL_ERROR,
-         "ForEachDirectoryEntry(%s): AsWindowsPath failed", path.c_str());
-  }
-
-  static const wstring kDot(L".");
-  static const wstring kDotDot(L"..");
-
-  wpath = L"\\\\?\\" + wpath + L"\\";
-  WIN32_FIND_DATAW metadata;
-  windows_util::AutoHandle handle(
-      FindFirstFileW((wpath + L"*").c_str(), &metadata));
-  if (handle.handle == INVALID_HANDLE_VALUE) {
-    return;  // directory does not exist or is empty
-  }
-
-  do {
-    if (kDot != metadata.cFileName && kDotDot != metadata.cFileName) {
-      wstring wname = wpath + metadata.cFileName;
-      string name(WstringToCstring(/* omit prefix */ 4 + wname.c_str()).get());
-      bool is_dir = (metadata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0;
-      consume->Consume(name, is_dir);
-    }
-  } while (FindNextFileW(handle.handle, &metadata));
+  // TODO(bazel-team): implement this.
+  pdie(255, "blaze_util::ForEachDirectoryEntry is not implemented on Windows");
 }
+#else   // not COMPILER_MSVC
+#endif  // COMPILER_MSVC
 
 string NormalizeWindowsPath(string path) {
   if (path.empty()) {
diff --git a/src/test/cpp/util/file_test.cc b/src/test/cpp/util/file_test.cc
index 093841e..83bf3a9 100644
--- a/src/test/cpp/util/file_test.cc
+++ b/src/test/cpp/util/file_test.cc
@@ -14,8 +14,6 @@
 #include <stdio.h>
 #include <string.h>
 
-#include <algorithm>
-#include <map>
 #include <memory>  // unique_ptr
 #include <thread>  // NOLINT (to silence Google-internal linter)
 
@@ -25,9 +23,7 @@
 
 namespace blaze_util {
 
-using std::map;
 using std::string;
-using std::vector;
 
 TEST(FileTest, TestSingleThreadedPipe) {
   std::unique_ptr<IPipe> pipe(CreatePipe());
@@ -148,54 +144,4 @@
   ASSERT_FALSE(mtime.get()->GetIfInDistantFuture(file, &actual));
 }
 
-class CollectingDirectoryEntryConsumer : public DirectoryEntryConsumer {
- public:
-  void Consume(const std::string& name, bool is_directory) override {
-    // use just base name for easy comparison and no hassle with path separators
-    // for Windows' sake (test runs on every platform)
-    entries[Basename(name)] = is_directory;
-  }
-
-  map<string, bool> entries;
-};
-
-TEST(FileTest, ForEachDirectoryEntryTest) {
-  string rootdir(JoinPath(getenv("TEST_TMPDIR"), "foo"));
-  string file1(JoinPath(rootdir, "file1.txt"));
-  string file2(JoinPath(rootdir, "file2.txt"));
-  string subdir(JoinPath(rootdir, "dir1"));
-  string file3(JoinPath(subdir, "file3.txt"));
-
-  ASSERT_TRUE(MakeDirectories(subdir, 0700));
-  ASSERT_TRUE(WriteFile("hello", 5, file1));
-  ASSERT_TRUE(WriteFile("hello", 5, file2));
-  ASSERT_TRUE(WriteFile("hello", 5, file3));
-
-  map<string, bool> expected;
-  expected["file1.txt"] = false;
-  expected["file2.txt"] = false;
-  expected["dir1"] = true;
-
-  CollectingDirectoryEntryConsumer consumer;
-  ForEachDirectoryEntry(rootdir, &consumer);
-  ASSERT_EQ(consumer.entries, expected);
-
-  vector<string> actual2;
-  GetAllFilesUnder(rootdir, &actual2);
-  std::sort(actual2.begin(), actual2.end());
-
-  vector<string> expected2;
-  vector<string> unixstyle_actual;
-  // normalize path separators for Windows' sake (test runs on every platform)
-  for (auto i : actual2) {
-    std::replace(i.begin(), i.end(), '\\', '/');
-    unixstyle_actual.push_back(i);
-  }
-  for (auto i : {file3, file1, file2}) {
-    std::replace(i.begin(), i.end(), '\\', '/');
-    expected2.push_back(i);
-  }
-  ASSERT_EQ(unixstyle_actual, expected2);
-}
-
 }  // namespace blaze_util