瀏覽代碼

ENH: Preserve permissions when copying files

Andy Cedilnik 22 年之前
父節點
當前提交
09421a261c
共有 3 個文件被更改,包括 18 次插入1 次删除
  1. 3 0
      Source/cmConfigureFileCommand.cxx
  2. 13 1
      Source/cmSystemTools.cxx
  3. 2 0
      Source/cmSystemTools.h

+ 3 - 0
Source/cmConfigureFileCommand.cxx

@@ -74,6 +74,8 @@ void cmConfigureFileCommand::ConfigureFile()
 {
   m_Makefile->AddCMakeDependFile(m_InputFile.c_str());
   cmSystemTools::ConvertToUnixSlashes(m_OuputFile);
+  mode_t perm = 0;
+  cmSystemTools::GetPermissions(m_InputFile.c_str(), perm);
   std::string::size_type pos = m_OuputFile.rfind('/');
   if(pos != std::string::npos)
     {
@@ -142,6 +144,7 @@ void cmConfigureFileCommand::ConfigureFile()
     cmSystemTools::CopyFileIfDifferent(tempOutputFile.c_str(),
       m_OuputFile.c_str());
     cmSystemTools::RemoveFile(tempOutputFile.c_str());
+    cmSystemTools::SetPermissions(m_OuputFile.c_str(), perm);
     }
 }
 

+ 13 - 1
Source/cmSystemTools.cxx

@@ -810,7 +810,19 @@ bool cmSystemTools::DoesFileExistWithExtensions(
 
 bool cmSystemTools::cmCopyFile(const char* source, const char* destination)
 {
-  return Superclass::CopyFileAlways(source, destination);
+  mode_t perm = 0;
+  return cmSystemTools::GetPermissions(source, perm) && 
+    Superclass::CopyFileAlways(source, destination) &&
+    cmSystemTools::SetPermissions(destination, perm);
+}
+
+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);
 }
 
 void cmSystemTools::Glob(const char *directory, const char *regexp,

+ 2 - 0
Source/cmSystemTools.h

@@ -150,6 +150,8 @@ public:
   
   ///! Copy a file.
   static bool cmCopyFile(const char* source, const char* destination);
+  static bool CopyFileIfDifferent(const char* source, 
+    const char* destination);
 
   /**
    * Run an executable command and put the stdout in output.