Răsfoiți Sursa

KWSys: SystemTools: CopyFileIfDifferent: Fix endless recursion

Backport KWSys commit `ea77593a1` (SystemTools: CopyFileIfDifferent: Fix
endless recursion, 2020-02-13) for the CMake 3.17 branch.

Fixes: #20347
Brad King 6 ani în urmă
părinte
comite
ce59cabc70
2 a modificat fișierele cu 18 adăugiri și 6 ștergeri
  1. 9 6
      Source/kwsys/SystemTools.cxx
  2. 9 0
      Source/kwsys/testSystemTools.cxx

+ 9 - 6
Source/kwsys/SystemTools.cxx

@@ -2186,12 +2186,15 @@ bool SystemTools::CopyFileIfDifferent(const std::string& source,
   // FilesDiffer does not handle file to directory compare
   if (SystemTools::FileIsDirectory(destination)) {
     const std::string new_destination = FileInDir(source, destination);
-    return SystemTools::CopyFileIfDifferent(source, new_destination);
-  }
-  // source and destination are files so do a copy if they
-  // are different
-  if (SystemTools::FilesDiffer(source, destination)) {
-    return SystemTools::CopyFileAlways(source, destination);
+    if (!SystemTools::ComparePath(new_destination, destination)) {
+      return SystemTools::CopyFileIfDifferent(source, new_destination);
+    }
+  } else {
+    // source and destination are files so do a copy if they
+    // are different
+    if (SystemTools::FilesDiffer(source, destination)) {
+      return SystemTools::CopyFileAlways(source, destination);
+    }
   }
   // at this point the files must be the same so return true
   return true;

+ 9 - 0
Source/kwsys/testSystemTools.cxx

@@ -1074,6 +1074,15 @@ static bool CheckCopyFileIfDifferent()
     }
   }
 
+  if (!kwsys::SystemTools::MakeDirectory("dir_a") ||
+      !kwsys::SystemTools::MakeDirectory("dir_b")) {
+    return false;
+  }
+
+  if (!kwsys::SystemTools::CopyFileIfDifferent("dir_a/", "dir_b")) {
+    ret = false;
+  }
+
   return ret;
 }