Ver Fonte

ENH: Move permissions code to kwsys so that copyfile can use it. Fixes Bug #1133 - cmake -E copy file dir sets the wrong permissions on the destination directory

Andy Cedilnik há 21 anos atrás
pai
commit
3fc7dc5e70

+ 2 - 41
Source/cmSystemTools.cxx

@@ -858,19 +858,13 @@ bool cmSystemTools::DoesFileExistWithExtensions(
 
 bool cmSystemTools::cmCopyFile(const char* source, const char* destination)
 {
-  mode_t perm = 0;
-  return cmSystemTools::GetPermissions(source, perm) && 
-    Superclass::CopyFileAlways(source, destination) &&
-    cmSystemTools::SetPermissions(destination, perm);
+  return Superclass::CopyFileAlways(source, destination);
 }
 
 bool cmSystemTools::CopyFileIfDifferent(const char* source, 
   const char* destination)
 {
-  mode_t perm = 0;
-  return cmSystemTools::GetPermissions(source, perm) && 
-    Superclass::CopyFileIfDifferent(source, destination) &&
-    cmSystemTools::SetPermissions(destination, perm);
+  return Superclass::CopyFileIfDifferent(source, destination);
 }
 
 void cmSystemTools::Glob(const char *directory, const char *regexp,
@@ -1283,36 +1277,3 @@ bool cmSystemTools::PutEnv(const char* value)
   return ret == 0;
 }
 
-bool cmSystemTools::GetPermissions(const char* file, mode_t& mode)
-{
-  if ( !file )
-    {
-    return false;
-    }
-
-  struct stat st;
-  if ( stat(file, &st) < 0 )
-    {
-    return false;
-    }
-  mode = st.st_mode;
-  return true;
-}
-
-bool cmSystemTools::SetPermissions(const char* file, mode_t mode)
-{
-  if ( !file )
-    {
-    return false;
-    }
-  if ( !cmSystemTools::FileExists(file) )
-    {
-    return false;
-    }
-  if ( chmod(file, mode) < 0 )
-    {
-    return false;
-    }
-
-  return true;
-}

+ 0 - 5
Source/cmSystemTools.h

@@ -20,7 +20,6 @@
 #include "cmStandardIncludes.h"
 
 #include <cmsys/SystemTools.hxx>
-#include <sys/types.h>
 
 /** \class cmSystemTools
  * \brief A collection of useful functions for CMake.
@@ -278,10 +277,6 @@ public:
       of the form var=value */
   static bool PutEnv(const char* value);
 
-  ///! Get permissions of the file
-  static bool GetPermissions(const char* file, mode_t& mode);
-  static bool SetPermissions(const char* file, mode_t mode);
-
 private:
   static bool s_ForceUnixPaths;
   static bool s_RunCommandHideConsole;

+ 45 - 0
Source/kwsys/SystemTools.cxx

@@ -930,6 +930,10 @@ bool SystemTools::CopyFileAlways(const char* source, const char* destination)
     {
     return true;
     }
+
+  mode_t perm = 0;
+  bool perms = SystemTools::GetPermissions(source, perm);
+
   const int bufferSize = 4096;
   char buffer[bufferSize];
 
@@ -1022,6 +1026,13 @@ bool SystemTools::CopyFileAlways(const char* source, const char* destination)
     {
     return false;
     }
+  if ( perms )
+    {
+    if ( !SystemTools::SetPermissions(destination, perm) )
+      {
+      return false;
+      }
+    }
   return true;
 }
 
@@ -1886,6 +1897,40 @@ int SystemTools::GetTerminalWidth()
 #endif
   return width;
 }
+
+bool SystemTools::GetPermissions(const char* file, mode_t& mode)
+{
+  if ( !file )
+    {
+    return false;
+    }
+
+  struct stat st;
+  if ( stat(file, &st) < 0 )
+    {
+    return false;
+    }
+  mode = st.st_mode;
+  return true;
+}
+
+bool SystemTools::SetPermissions(const char* file, mode_t mode)
+{
+  if ( !file )
+    {
+    return false;
+    }
+  if ( !SystemTools::FileExists(file) )
+    {
+    return false;
+    }
+  if ( chmod(file, mode) < 0 )
+    {
+    return false;
+    }
+
+  return true;
+}
 } // namespace KWSYS_NAMESPACE
 
 #if defined(_MSC_VER) && defined(_DEBUG)

+ 9 - 0
Source/kwsys/SystemTools.hxx.in

@@ -20,6 +20,8 @@
 
 #include <@KWSYS_NAMESPACE@/Configure.h>
 
+#include <sys/types.h>
+
 /* Define these macros temporarily to keep the code readable.  */
 #if !defined (KWSYS_NAMESPACE) && !@KWSYS_NAMESPACE@_NAME_IS_KWSYS
 # define kwsys_stl @KWSYS_NAMESPACE@_stl
@@ -284,6 +286,12 @@ public:
    */
   static int GetTerminalWidth();
   
+  /**
+   * Get and set permissions of the file.
+   */
+  static bool GetPermissions(const char* file, mode_t& mode);
+  static bool SetPermissions(const char* file, mode_t mode);
+
 protected:
   // these two functions can be called from ConvertToOutputPath
   /**
@@ -299,6 +307,7 @@ protected:
    * if there are spaces in the string it is double quoted.
    */
   static kwsys_stl::string ConvertToWindowsOutputPath(const char*);
+
 };
 
 } // namespace @KWSYS_NAMESPACE@