qmake: let QMakeVfs::readFile() report ENOFILE explicitly

when the QFile object is already constructed, querying whether the file
exists is actually cheap, so do it right away instead of later on
demand. that makes the calling code a bit cleaner.

fwiw, that we need to explicitly query the file's existence at all is a
result of QFile's completely useless error "codes" (which merely say
which function failed, as if the caller would not know).

Change-Id: Ifec39d05b1713d8128046f679287e510f10e45dc
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
(cherry picked from qtcreator/5ba32e3484ead2e35cc7732dcd59a97e7459dbfd)
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
This commit is contained in:
Oswald Buddenhagen 2016-10-28 20:10:40 +02:00
parent fe5f2a235c
commit e2de837198
4 changed files with 21 additions and 17 deletions

View File

@ -254,8 +254,9 @@ bool QMakeParser::read(ProFile *pro, ParseFlags flags)
{
QString content;
QString errStr;
if (!m_vfs->readFile(pro->fileName(), &content, &errStr)) {
if (m_handler && ((flags & ParseReportMissing) || m_vfs->exists(pro->fileName())))
QMakeVfs::ReadResult result = m_vfs->readFile(pro->fileName(), &content, &errStr);
if (result != QMakeVfs::ReadOk) {
if (m_handler && ((flags & ParseReportMissing) || result != QMakeVfs::ReadNotFound))
m_handler->message(QMakeParserHandler::ParserIoError,
fL1S("Cannot read %1: %2").arg(pro->fileName(), errStr));
return false;

View File

@ -100,7 +100,7 @@ bool QMakeVfs::writeFile(const QString &fn, QIODevice::OpenMode mode, bool exe,
#endif
}
bool QMakeVfs::readFile(const QString &fn, QString *contents, QString *errStr)
QMakeVfs::ReadResult QMakeVfs::readFile(const QString &fn, QString *contents, QString *errStr)
{
#ifndef PROEVALUATOR_FULL
# ifdef PROEVALUATOR_THREAD_SAFE
@ -110,25 +110,26 @@ bool QMakeVfs::readFile(const QString &fn, QString *contents, QString *errStr)
if (it != m_files.constEnd()) {
if (it->constData() == m_magicMissing.constData()) {
*errStr = fL1S("No such file or directory");
return false;
return ReadNotFound;
}
if (it->constData() != m_magicExisting.constData()) {
*contents = *it;
return true;
return ReadOk;
}
}
#endif
QFile file(fn);
if (!file.open(QIODevice::ReadOnly)) {
if (!file.exists()) {
#ifndef PROEVALUATOR_FULL
if (!IoUtils::exists(fn)) {
m_files[fn] = m_magicMissing;
*errStr = fL1S("No such file or directory");
} else
#endif
*errStr = file.errorString();
return false;
*errStr = fL1S("No such file or directory");
return ReadNotFound;
}
*errStr = file.errorString();
return ReadOtherError;
}
#ifndef PROEVALUATOR_FULL
m_files[fn] = m_magicExisting;
@ -138,10 +139,10 @@ bool QMakeVfs::readFile(const QString &fn, QString *contents, QString *errStr)
if (bcont.startsWith("\xef\xbb\xbf")) {
// UTF-8 BOM will cause subtle errors
*errStr = fL1S("Unexpected UTF-8 BOM");
return false;
return ReadOtherError;
}
*contents = QString::fromLocal8Bit(bcont);
return true;
return ReadOk;
}
bool QMakeVfs::exists(const QString &fn)

View File

@ -45,10 +45,16 @@ QT_BEGIN_NAMESPACE
class QMAKE_EXPORT QMakeVfs
{
public:
enum ReadResult {
ReadOk,
ReadNotFound,
ReadOtherError
};
QMakeVfs();
bool writeFile(const QString &fn, QIODevice::OpenMode mode, bool exe, const QString &contents, QString *errStr);
bool readFile(const QString &fn, QString *contents, QString *errStr);
ReadResult readFile(const QString &fn, QString *contents, QString *errStr);
bool exists(const QString &fn);
#ifndef PROEVALUATOR_FULL

View File

@ -2375,11 +2375,7 @@ void tst_qmakelib::addTestFunctions(const QString &qindir)
QTest::newRow("include(): fail")
<< "include(include/nope.pri): OK = 1"
<< "OK = UNDEF"
#ifdef Q_OS_WIN
<< "Cannot read " + m_indir + "/include/nope.pri: The system cannot find the file specified."
#else
<< "Cannot read " + m_indir + "/include/nope.pri: No such file or directory"
#endif
<< true;
QTest::newRow("include(): silent fail")