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
This commit is contained in:
parent
cf8d34040e
commit
3fc7dc5e70
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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@
|
||||
|
|
Loading…
Reference in New Issue