diff --git a/gui/checkthread.cpp b/gui/checkthread.cpp
index 671e068ae..2592567d4 100644
--- a/gui/checkthread.cpp
+++ b/gui/checkthread.cpp
@@ -16,6 +16,7 @@
* along with this program. If not, see .
*/
+#include
#include
#include
#include
@@ -74,13 +75,11 @@ void CheckThread::run()
return;
}
- const QString addonPath = getAddonPath();
-
QString file = mResult.getNextFile();
while (!file.isEmpty() && mState == Running) {
qDebug() << "Checking file" << file;
mCppcheck.check(file.toStdString());
- runAddonsAndTools(addonPath, nullptr, file);
+ runAddonsAndTools(nullptr, file);
emit fileChecked(file);
if (mState == Running)
@@ -92,7 +91,7 @@ void CheckThread::run()
file = QString::fromStdString(fileSettings.filename);
qDebug() << "Checking file" << file;
mCppcheck.check(fileSettings);
- runAddonsAndTools(addonPath, &fileSettings, QString::fromStdString(fileSettings.filename));
+ runAddonsAndTools(&fileSettings, QString::fromStdString(fileSettings.filename));
emit fileChecked(file);
if (mState == Running)
@@ -107,7 +106,7 @@ void CheckThread::run()
emit done();
}
-void CheckThread::runAddonsAndTools(const QString &addonPath, const ImportProject::FileSettings *fileSettings, const QString &fileName)
+void CheckThread::runAddonsAndTools(const ImportProject::FileSettings *fileSettings, const QString &fileName)
{
QString dumpFile;
@@ -263,13 +262,12 @@ void CheckThread::runAddonsAndTools(const QString &addonPath, const ImportProjec
parseClangErrors(addon, fileName, errout);
} else {
- QString a;
- if (QFileInfo(addonPath + '/' + addon + ".py").exists())
- a = addonPath + '/' + addon + ".py";
- else if (QFileInfo(addonPath + '/' + addon + '/' + addon + ".py").exists())
- a = addonPath + '/' + addon + '/' + addon + ".py";
- else
- continue;
+ QString a = CheckThread::getAddonFilePath(mDataDir, addon + ".py");
+ if (a.isEmpty()) {
+ a = CheckThread::getAddonFilePath(QApplication::applicationDirPath(), addon + ".py");
+ if (a.isEmpty())
+ continue;
+ }
if (dumpFile.isEmpty()) {
const std::string buildDir = mCppcheck.settings().buildDir;
@@ -321,21 +319,6 @@ void CheckThread::stop()
mCppcheck.terminate();
}
-QString CheckThread::getAddonPath() const
-{
- if (QFileInfo(mDataDir + "/threadsafety.py").exists())
- return mDataDir;
- else if (QDir(mDataDir + "/addons").exists())
- return mDataDir + "/addons";
- else if (QDir(mDataDir + "/../addons").exists())
- return mDataDir + "/../addons";
- else if (mDataDir.endsWith("/cfg")) {
- if (QDir(mDataDir.mid(0,mDataDir.size()-3) + "addons").exists())
- return mDataDir.mid(0,mDataDir.size()-3) + "addons";
- }
- return QString();
-}
-
void CheckThread::parseAddonErrors(QString err, QString tool)
{
Q_UNUSED(tool);
@@ -447,3 +430,16 @@ void CheckThread::parseClangErrors(const QString &tool, const QString &file0, QS
mResult.reportErr(errmsg);
}
}
+
+QString CheckThread::getAddonFilePath(const QString &dataDir, const QString &addonFile)
+{
+ if (dataDir.isEmpty())
+ return QString();
+ if (QFileInfo(dataDir + '/' + addonFile).exists())
+ return dataDir + '/' + addonFile;
+ if (QFileInfo(dataDir + "/addons/" + addonFile).exists())
+ return dataDir + "/addons/" + addonFile;
+ if (QFileInfo(dataDir + "/../addons/" + addonFile).exists())
+ return dataDir + "/../addons/" + addonFile;
+ return QString();
+}
diff --git a/gui/checkthread.h b/gui/checkthread.h
index 5605e4fa8..b01dac7c9 100644
--- a/gui/checkthread.h
+++ b/gui/checkthread.h
@@ -84,6 +84,7 @@ public:
void stop();
+ static QString getAddonFilePath(const QString &dataDir, const QString &addonFile);
signals:
@@ -122,9 +123,7 @@ protected:
CppCheck mCppcheck;
private:
- QString getAddonPath() const;
-
- void runAddonsAndTools(const QString &addonPath, const ImportProject::FileSettings *fileSettings, const QString &fileName);
+ void runAddonsAndTools(const ImportProject::FileSettings *fileSettings, const QString &fileName);
void parseAddonErrors(QString err, QString tool);
void parseClangErrors(const QString &tool, const QString &file0, QString err);
diff --git a/gui/projectfiledialog.cpp b/gui/projectfiledialog.cpp
index 3984ff2d7..b9fd277eb 100644
--- a/gui/projectfiledialog.cpp
+++ b/gui/projectfiledialog.cpp
@@ -28,6 +28,7 @@
#include
#include "common.h"
#include "projectfiledialog.h"
+#include "checkthread.h"
#include "projectfile.h"
#include "library.h"
#include "cppcheck.h"
@@ -160,6 +161,16 @@ void ProjectFileDialog::saveSettings() const
settings.setValue(SETTINGS_PROJECT_DIALOG_HEIGHT, size().height());
}
+static void updateAddonCheckBox(QCheckBox *cb, const ProjectFile *projectFile, const QString &dataDir, const QString &addon)
+{
+ cb->setChecked(projectFile->getAddons().contains(addon));
+ const QString appPath = QApplication::applicationDirPath();
+ if (CheckThread::getAddonFilePath(dataDir, addon + ".py").isEmpty() && CheckThread::getAddonFilePath(appPath, addon + ".py").isEmpty()) {
+ cb->setEnabled(false);
+ cb->setText(cb->text() + QObject::tr(" (Not found)"));
+ }
+}
+
void ProjectFileDialog::loadFromProjectFile(const ProjectFile *projectFile)
{
setRootPath(projectFile->getRootPath());
@@ -172,7 +183,13 @@ void ProjectFileDialog::loadFromProjectFile(const ProjectFile *projectFile)
setExcludedPaths(projectFile->getExcludedPaths());
setLibraries(projectFile->getLibraries());
setSuppressions(projectFile->getSuppressions());
- mUI.mAddonThreadSafety->setChecked(projectFile->getAddons().contains("threadsafety"));
+
+ QSettings settings;
+ const QString dataDir = settings.value("DATADIR", QString()).toString();
+ updateAddonCheckBox(mUI.mAddonThreadSafety, projectFile, dataDir, "threadsafety");
+ updateAddonCheckBox(mUI.mAddonY2038, projectFile, dataDir, "y2038");
+ updateAddonCheckBox(mUI.mAddonCert, projectFile, dataDir, "cert");
+
mUI.mAddonY2038->setChecked(projectFile->getAddons().contains("y2038"));
mUI.mAddonCert->setChecked(projectFile->getAddons().contains("cert"));
mUI.mToolClangAnalyzer->setChecked(projectFile->getClangAnalyzer());