mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-06 05:40:54 -06:00
Merge branch 'upstream-KWSys' into update-kwsys
# By KWSys Upstream * upstream-KWSys: KWSys 2020-05-18 (146f6b36)
This commit is contained in:
@@ -103,7 +103,7 @@ void Directory::Clear()
|
||||
|
||||
namespace KWSYS_NAMESPACE {
|
||||
|
||||
bool Directory::Load(const std::string& name)
|
||||
bool Directory::Load(const std::string& name, std::string* errorMessage)
|
||||
{
|
||||
this->Clear();
|
||||
# if (defined(_MSC_VER) && _MSC_VER < 1300) || defined(__BORLANDC__)
|
||||
@@ -146,7 +146,8 @@ bool Directory::Load(const std::string& name)
|
||||
return _findclose(srchHandle) != -1;
|
||||
}
|
||||
|
||||
unsigned long Directory::GetNumberOfFilesInDirectory(const std::string& name)
|
||||
unsigned long Directory::GetNumberOfFilesInDirectory(const std::string& name,
|
||||
std::string* errorMessage)
|
||||
{
|
||||
# if (defined(_MSC_VER) && _MSC_VER < 1300) || defined(__BORLANDC__)
|
||||
// Older Visual C++ and Embarcadero compilers.
|
||||
@@ -192,6 +193,8 @@ unsigned long Directory::GetNumberOfFilesInDirectory(const std::string& name)
|
||||
# include <sys/types.h>
|
||||
|
||||
# include <dirent.h>
|
||||
# include <errno.h>
|
||||
# include <string.h>
|
||||
|
||||
// PGI with glibc has trouble with dirent and large file support:
|
||||
// http://www.pgroup.com/userforum/viewtopic.php?
|
||||
@@ -209,29 +212,46 @@ unsigned long Directory::GetNumberOfFilesInDirectory(const std::string& name)
|
||||
|
||||
namespace KWSYS_NAMESPACE {
|
||||
|
||||
bool Directory::Load(const std::string& name)
|
||||
bool Directory::Load(const std::string& name, std::string* errorMessage)
|
||||
{
|
||||
this->Clear();
|
||||
|
||||
errno = 0;
|
||||
DIR* dir = opendir(name.c_str());
|
||||
|
||||
if (!dir) {
|
||||
if (errorMessage != nullptr) {
|
||||
*errorMessage = std::string(strerror(errno));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
errno = 0;
|
||||
for (kwsys_dirent* d = readdir(dir); d; d = readdir(dir)) {
|
||||
this->Internal->Files.emplace_back(d->d_name);
|
||||
}
|
||||
if (errno != 0) {
|
||||
if (errorMessage != nullptr) {
|
||||
*errorMessage = std::string(strerror(errno));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
this->Internal->Path = name;
|
||||
closedir(dir);
|
||||
return true;
|
||||
}
|
||||
|
||||
unsigned long Directory::GetNumberOfFilesInDirectory(const std::string& name)
|
||||
unsigned long Directory::GetNumberOfFilesInDirectory(const std::string& name,
|
||||
std::string* errorMessage)
|
||||
{
|
||||
errno = 0;
|
||||
DIR* dir = opendir(name.c_str());
|
||||
|
||||
if (!dir) {
|
||||
if (errorMessage != nullptr) {
|
||||
*errorMessage = std::string(strerror(errno));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -239,6 +259,13 @@ unsigned long Directory::GetNumberOfFilesInDirectory(const std::string& name)
|
||||
for (kwsys_dirent* d = readdir(dir); d; d = readdir(dir)) {
|
||||
count++;
|
||||
}
|
||||
if (errno != 0) {
|
||||
if (errorMessage != nullptr) {
|
||||
*errorMessage = std::string(strerror(errno));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
closedir(dir);
|
||||
return count;
|
||||
}
|
||||
|
||||
@@ -35,7 +35,7 @@ public:
|
||||
* in that directory. 0 is returned if the directory can not be
|
||||
* opened, 1 if it is opened.
|
||||
*/
|
||||
bool Load(const std::string&);
|
||||
bool Load(const std::string&, std::string* errorMessage = nullptr);
|
||||
|
||||
/**
|
||||
* Return the number of files in the current directory.
|
||||
@@ -46,7 +46,8 @@ public:
|
||||
* Return the number of files in the specified directory.
|
||||
* A higher performance static method.
|
||||
*/
|
||||
static unsigned long GetNumberOfFilesInDirectory(const std::string&);
|
||||
static unsigned long GetNumberOfFilesInDirectory(
|
||||
const std::string&, std::string* errorMessage = nullptr);
|
||||
|
||||
/**
|
||||
* Return the file at the given index, the indexing is 0 based
|
||||
|
||||
@@ -182,7 +182,15 @@ bool Glob::RecurseDirectory(std::string::size_type start,
|
||||
const std::string& dir, GlobMessages* messages)
|
||||
{
|
||||
kwsys::Directory d;
|
||||
if (!d.Load(dir)) {
|
||||
std::string errorMessage;
|
||||
if (!d.Load(dir, &errorMessage)) {
|
||||
if (messages) {
|
||||
if (!errorMessage.empty()) {
|
||||
messages->push_back(Message(Glob::warning,
|
||||
"Error listing directory '" + dir +
|
||||
"'! Reason: '" + errorMessage + "'"));
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
unsigned long cc;
|
||||
@@ -278,7 +286,9 @@ void Glob::ProcessDirectory(std::string::size_type start,
|
||||
// std::cout << "ProcessDirectory: " << dir << std::endl;
|
||||
bool last = (start == this->Internals->Expressions.size() - 1);
|
||||
if (last && this->Recurse) {
|
||||
this->RecurseDirectory(start, dir, messages);
|
||||
if (kwsys::SystemTools::FileIsDirectory(dir)) {
|
||||
this->RecurseDirectory(start, dir, messages);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -28,6 +28,7 @@ public:
|
||||
enum MessageType
|
||||
{
|
||||
error,
|
||||
warning,
|
||||
cyclicRecursion
|
||||
};
|
||||
|
||||
|
||||
@@ -57,7 +57,11 @@ int _doLongPathTest()
|
||||
|
||||
Directory testdir;
|
||||
// Set res to failure if the directory doesn't load
|
||||
res += !testdir.Load(testdirpath);
|
||||
std::string errorMessage = "";
|
||||
res += !testdir.Load(testdirpath, &errorMessage);
|
||||
if (errorMessage != "") {
|
||||
std::cerr << "Failed to list directory: " << errorMessage << std::endl;
|
||||
}
|
||||
// Increment res failure if the directory appears empty
|
||||
res += testdir.GetNumberOfFiles() == 0;
|
||||
// Increment res failures if the path has changed from
|
||||
@@ -73,6 +77,34 @@ int _doLongPathTest()
|
||||
return res;
|
||||
}
|
||||
|
||||
int _nonExistentDirectoryTest()
|
||||
{
|
||||
using namespace kwsys;
|
||||
int res = 0;
|
||||
std::string testdirpath(TEST_SYSTEMTOOLS_BINARY_DIR
|
||||
"/directory_testing/doesnt_exist/");
|
||||
std::string errorMessage;
|
||||
Directory testdir;
|
||||
|
||||
errorMessage = "foo";
|
||||
// Increment res failure if directory lists
|
||||
res += testdir.Load(testdirpath, &errorMessage);
|
||||
#if !defined(_WIN32) || defined(__CYGWIN__)
|
||||
// Increment res failure if errorMessage is unmodified
|
||||
res += (errorMessage == "foo");
|
||||
#endif
|
||||
|
||||
errorMessage = "foo";
|
||||
// Increment res failure if directory has files
|
||||
res += (testdir.GetNumberOfFilesInDirectory(testdirpath, &errorMessage) > 0);
|
||||
#if !defined(_WIN32) || defined(__CYGWIN__)
|
||||
// Increment res failure if errorMessage is unmodified
|
||||
res += (errorMessage == "foo");
|
||||
#endif
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
int _copyDirectoryTest()
|
||||
{
|
||||
using namespace kwsys;
|
||||
@@ -106,5 +138,6 @@ int _copyDirectoryTest()
|
||||
|
||||
int testDirectory(int, char* [])
|
||||
{
|
||||
return _doLongPathTest() + _copyDirectoryTest();
|
||||
return _doLongPathTest() + _nonExistentDirectoryTest() +
|
||||
_copyDirectoryTest();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user