Commit 8ff18ed7 authored by Brad King's avatar Brad King Committed by Kitware Robot
Browse files

Merge topic 'Directory-error-handling'

97f880e6 Directory: add extra tests involving errorMessage
f33ef4e3 Glob: issue warnings on Directory errors
9a3f9799

 Directory: implement error reporting
Acked-by: Kitware Robot's avatarKitware Robot <kwrobot@kitware.com>
Merge-request: !187
parents d4da6980 97f880e6
......@@ -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,13 @@ 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 (!errorMessage.empty()) {
messages->push_back(Message(Glob::warning,
"Error listing directory '" + dir +
"'! Reason: '" + errorMessage + "'"));
}
return true;
}
unsigned long cc;
......
......@@ -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();
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment