Skip to content
Snippets Groups Projects
Commit ef4d992b authored by Brad King's avatar Brad King
Browse files

Merge branch 'upstream-KWSys' into update-kwsys

# By KWSys Upstream
* upstream-KWSys:
  KWSys 2020-05-18 (146f6b36)
parents 6c4bfb6e 8fd4c19e
No related branches found
No related tags found
No related merge requests found
......@@ -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();
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment