diff --git a/src/libs/utils/fileutils.cpp b/src/libs/utils/fileutils.cpp index d5dc5b7a0b5..c3f323aecec 100644 --- a/src/libs/utils/fileutils.cpp +++ b/src/libs/utils/fileutils.cpp @@ -236,6 +236,25 @@ QString FileUtils::fileSystemFriendlyName(const QString &name) return result; } +int FileUtils::indexOfQmakeUnfriendly(const QString &name, int startpos) +{ + static QRegExp checkRegExp(QLatin1String("[^a-zA-Z0-9_.-]")); + return checkRegExp.indexIn(name, startpos); +} + +QString FileUtils::qmakeFriendlyName(const QString &name) +{ + QString result = name; + + // Remove characters that might trip up a build system (especially qmake): + int pos = indexOfQmakeUnfriendly(result); + while (pos >= 0) { + result[pos] = QLatin1Char('_'); + pos = indexOfQmakeUnfriendly(result, pos); + } + return fileSystemFriendlyName(result); +} + bool FileUtils::makeWritable(const FileName &path) { const QString fileName = path.toString(); diff --git a/src/libs/utils/fileutils.h b/src/libs/utils/fileutils.h index 96c1d46991d..64ba6581cf8 100644 --- a/src/libs/utils/fileutils.h +++ b/src/libs/utils/fileutils.h @@ -97,6 +97,8 @@ public: static FileName resolveSymlinks(const FileName &path); static QString shortNativePath(const FileName &path); static QString fileSystemFriendlyName(const QString &name); + static int indexOfQmakeUnfriendly(const QString &name, int startpos = 0); + static QString qmakeFriendlyName(const QString &name); static bool makeWritable(const FileName &path); static QString normalizePathName(const QString &name); }; diff --git a/src/libs/utils/projectnamevalidatinglineedit.cpp b/src/libs/utils/projectnamevalidatinglineedit.cpp index 8a1136a8c12..3d54c4b5744 100644 --- a/src/libs/utils/projectnamevalidatinglineedit.cpp +++ b/src/libs/utils/projectnamevalidatinglineedit.cpp @@ -30,6 +30,8 @@ #include "projectnamevalidatinglineedit.h" #include "filenamevalidatinglineedit.h" +#include "fileutils.h" + namespace Utils { ProjectNameValidatingLineEdit::ProjectNameValidatingLineEdit(QWidget *parent) @@ -43,8 +45,12 @@ bool ProjectNameValidatingLineEdit::validateProjectName(const QString &name, QSt if (!FileNameValidatingLineEdit::validateFileName(name, false, errorMessage)) return false; - // We don't want dots in the directory name for some legacy Windows - // reason. Since we are cross-platform, we generally disallow it. + int pos = FileUtils::indexOfQmakeUnfriendly(name); + if (pos >= 0) { + if (errorMessage) + *errorMessage = tr("Invalid character '%1' found!").arg(name.at(pos)); + return false; + } if (name.contains(QLatin1Char('.'))) { if (errorMessage) *errorMessage = tr("Invalid character '.'."); diff --git a/src/plugins/projectexplorer/kit.cpp b/src/plugins/projectexplorer/kit.cpp index 1e25cbdfee1..e9b14673aeb 100644 --- a/src/plugins/projectexplorer/kit.cpp +++ b/src/plugins/projectexplorer/kit.cpp @@ -307,14 +307,14 @@ QStringList Kit::candidateNameList(const QString &base) const QString Kit::fileSystemFriendlyName() const { - QString name = Utils::FileUtils::fileSystemFriendlyName(displayName()); + QString name = Utils::FileUtils::qmakeFriendlyName(displayName()); foreach (Kit *i, KitManager::kits()) { if (i == this) continue; - if (name == Utils::FileUtils::fileSystemFriendlyName(i->displayName())) { + if (name == Utils::FileUtils::qmakeFriendlyName(i->displayName())) { // append part of the kit id: That should be unique enough;-) // Leading { will be turned into _ which should be fine. - name = Utils::FileUtils::fileSystemFriendlyName(name + QLatin1Char('_') + (id().toString().left(7))); + name = Utils::FileUtils::qmakeFriendlyName(name + QLatin1Char('_') + (id().toString().left(7))); break; } } diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectconfigwidget.cpp b/src/plugins/qmakeprojectmanager/qmakeprojectconfigwidget.cpp index 8f28bc8f55b..aaaba787788 100644 --- a/src/plugins/qmakeprojectmanager/qmakeprojectconfigwidget.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeprojectconfigwidget.cpp @@ -51,7 +51,7 @@ QmakeProjectConfigWidget::QmakeProjectConfigWidget(QmakeBuildConfiguration *bc) m_defaultShadowBuildDir = QmakeProject::shadowBuildDirectory(bc->target()->project()->projectFilePath(), bc->target()->kit(), - Utils::FileUtils::fileSystemFriendlyName(bc->displayName())); + Utils::FileUtils::qmakeFriendlyName(bc->displayName())); QVBoxLayout *vbox = new QVBoxLayout(this); vbox->setMargin(0);