diff --git a/src/plugins/projectexplorer/customwizard/customwizard.cpp b/src/plugins/projectexplorer/customwizard/customwizard.cpp index c52bd20eabf..fbbe9e7b9e9 100644 --- a/src/plugins/projectexplorer/customwizard/customwizard.cpp +++ b/src/plugins/projectexplorer/customwizard/customwizard.cpp @@ -40,6 +40,7 @@ #include #include +#include #include #include @@ -358,7 +359,6 @@ CustomWizard *CustomWizard::createWizard(const CustomProjectWizard::CustomWizard QList CustomWizard::createWizards() { - QList rc; QString errorMessage; QString verboseLog; const QString templateDirName = Core::ICore::resourcePath() + @@ -371,29 +371,32 @@ QList CustomWizard::createWizards() const QDir templateDir(templateDirName); if (CustomWizardPrivate::verbose) - verboseLog = QString::fromLatin1("### CustomWizard: Checking \"%1\"\n").arg(templateDirName); + verboseLog += QString::fromLatin1("### CustomWizard: Checking \"%1\"\n").arg(templateDirName); if (!templateDir.exists()) { if (CustomWizardPrivate::verbose) qWarning("Custom project template path %s does not exist.", qPrintable(templateDir.absolutePath())); - return rc; + return QList(); } const QDir userTemplateDir(userTemplateDirName); if (CustomWizardPrivate::verbose) - verboseLog = QString::fromLatin1("### CustomWizard: Checking \"%1\"\n").arg(userTemplateDirName); + verboseLog += QString::fromLatin1("### CustomWizard: Checking \"%1\"\n").arg(userTemplateDirName); const QDir::Filters filters = QDir::Dirs|QDir::Readable|QDir::NoDotAndDotDot; const QDir::SortFlags sortflags = QDir::Name|QDir::IgnoreCase; - QList dirs = templateDir.entryInfoList(filters, sortflags); + QList dirs; if (userTemplateDir.exists()) { if (CustomWizardPrivate::verbose) - verboseLog = QString::fromLatin1("### CustomWizard: userTemplateDir \"%1\" found, adding\n").arg(userTemplateDirName); + verboseLog += QString::fromLatin1("### CustomWizard: userTemplateDir \"%1\" found, adding\n").arg(userTemplateDirName); dirs += userTemplateDir.entryInfoList(filters, sortflags); } + dirs += templateDir.entryInfoList(filters, sortflags); const QString configFile = QLatin1String(configFileC); // Check and parse config file in each directory. + QList toCreate; + while (!dirs.isEmpty()) { const QFileInfo dirFi = dirs.takeFirst(); const QDir dir(dirFi.absoluteFilePath()); @@ -403,11 +406,13 @@ QList CustomWizard::createWizards() CustomWizardParametersPtr parameters(new CustomWizardParameters); switch (parameters->parse(dir.absoluteFilePath(configFile), &errorMessage)) { case CustomWizardParameters::ParseOk: - parameters->directory = dir.absolutePath(); - if (CustomWizard *w = createWizard(parameters)) - rc.push_back(w); - else - qWarning("Custom wizard factory function failed for %s", qPrintable(parameters->id.toString())); + if (!Utils::contains(toCreate, [parameters](CustomWizardParametersPtr p) { return parameters->id == p->id; })) { + parameters->directory = dir.absolutePath(); + toCreate.append(parameters); + } else { + verboseLog += QString::fromLatin1("Customwizard: Ignoring wizard in %1 due to duplicate Id %2.\n") + .arg(dir.absolutePath()).arg(parameters->id.toString()); + } break; case CustomWizardParameters::ParseDisabled: if (CustomWizardPrivate::verbose) @@ -429,6 +434,18 @@ QList CustomWizard::createWizards() } } } + + QList rc; + foreach (CustomWizardParametersPtr p, toCreate) { + if (CustomWizard *w = createWizard(p)) { + rc.push_back(w); + } else { + qWarning("Custom wizard factory function failed for %s from %s.", + qPrintable(p->id.toString()), qPrintable(p->directory)); + } + } + + if (CustomWizardPrivate::verbose) { // Print to output pane for Windows. qWarning("%s", qPrintable(verboseLog)); Core::MessageManager::write(verboseLog, Core::MessageManager::ModeSwitch);