From 7b17140dfce29c18f79b4200cd5d8a58022d66fe Mon Sep 17 00:00:00 2001
From: David Cole <david.cole@kitware.com>
Date: Wed, 20 Aug 2008 13:24:16 -0400
Subject: [PATCH] ENH: Add RecurseThroughSymlinks data member to kwsys::Glob.
 Allows recursive globs to skip symlinks when necessary. Default to true for
 backwards compatible behavior. Used from the ctest coverage handler to avoid
 recursing through the '/Applications' directory on the Mac looking for *.da
 files... Should fix the hangs reported recently by Mac CMake dashboard
 submitters.

---
 Glob.cxx    | 10 +++++++++-
 Glob.hxx.in |  8 ++++++++
 2 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/Glob.cxx b/Glob.cxx
index 0518132..bdda50e 100644
--- a/Glob.cxx
+++ b/Glob.cxx
@@ -63,6 +63,10 @@ Glob::Glob()
   this->Internals = new GlobInternals;
   this->Recurse = false;
   this->Relative = "";
+
+  this->RecurseThroughSymlinks = true;
+    // RecurseThroughSymlinks is true by default for backwards compatibility,
+    // not because it's a good idea...
 }
 
 //----------------------------------------------------------------------------
@@ -262,7 +266,11 @@ void Glob::RecurseDirectory(kwsys_stl::string::size_type start,
       }
     if ( kwsys::SystemTools::FileIsDirectory(realname.c_str()) )
       {
-      this->RecurseDirectory(start+1, realname, dir_only);
+      if (!kwsys::SystemTools::FileIsSymlink(realname.c_str()) ||
+        this->RecurseThroughSymlinks)
+        {
+        this->RecurseDirectory(start+1, realname, dir_only);
+        }
       }
     }
 }
diff --git a/Glob.hxx.in b/Glob.hxx.in
index 9ede865..f01f004 100644
--- a/Glob.hxx.in
+++ b/Glob.hxx.in
@@ -57,6 +57,13 @@ public:
   void SetRecurse(bool i) { this->Recurse = i; }
   bool GetRecurse() { return this->Recurse; }
 
+  //! Set recurse through symlinks to true if recursion should traverse the
+  // linked-to directories
+  void RecurseThroughSymlinksOn() { this->SetRecurseThroughSymlinks(true); }
+  void RecurseThroughSymlinksOff() { this->SetRecurseThroughSymlinks(false); }
+  void SetRecurseThroughSymlinks(bool i) { this->RecurseThroughSymlinks = i; }
+  bool GetRecurseThroughSymlinks() { return this->RecurseThroughSymlinks; }
+
   //! Set relative to true to only show relative path to files.
   void SetRelative(const char* dir);
   const char* GetRelative();
@@ -90,6 +97,7 @@ protected:
   GlobInternals* Internals;
   bool Recurse;
   kwsys_stl::string Relative;
+  bool RecurseThroughSymlinks;
 
 private:
   Glob(const Glob&);  // Not implemented.
-- 
GitLab