From 48ebaecb524bb1e7320596954b834cb01c3cd898 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Tue, 10 Nov 2020 16:55:09 +0100 Subject: [PATCH] ProjectExplorer: Set unique build directory ... after cloning a build configuration. It's very unlikely that the user intends to re-use the same build directory in the new build configuration. Fixes: QTCREATORBUG-24831 Change-Id: I39b7839225e973fea4e16b9b686fbbf9207cb5ae Reviewed-by: Eike Ziller --- src/libs/utils/stringutils.h | 16 ++++++++++++---- .../buildsettingspropertiespage.cpp | 15 ++++++++++++++- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/libs/utils/stringutils.h b/src/libs/utils/stringutils.h index fbafa7708c8..3214424728c 100644 --- a/src/libs/utils/stringutils.h +++ b/src/libs/utils/stringutils.h @@ -90,18 +90,26 @@ QTCREATOR_UTILS_EXPORT QString expandMacros(const QString &str, AbstractMacroExp QTCREATOR_UTILS_EXPORT int parseUsedPortFromNetstatOutput(const QByteArray &line); -template -T makeUniquelyNumbered(const T &preferred, const Container &reserved) +template +T makeUniquelyNumbered(const T &preferred, const std::function &isOk) { - if (!reserved.contains(preferred)) + if (isOk(preferred)) return preferred; int i = 2; T tryName = preferred + QString::number(i); - while (reserved.contains(tryName)) + while (!isOk(tryName)) tryName = preferred + QString::number(++i); return tryName; } +template +T makeUniquelyNumbered(const T &preferred, const Container &reserved) +{ + const std::function isOk + = [&reserved](const T &v) { return !reserved.contains(v); }; + return makeUniquelyNumbered(preferred, isOk); +} + QTCREATOR_UTILS_EXPORT QString formatElapsedTime(qint64 elapsed); /* This function is only necessary if you need to match the wildcard expression against a diff --git a/src/plugins/projectexplorer/buildsettingspropertiespage.cpp b/src/plugins/projectexplorer/buildsettingspropertiespage.cpp index efe73d5e499..54af00be6c5 100644 --- a/src/plugins/projectexplorer/buildsettingspropertiespage.cpp +++ b/src/plugins/projectexplorer/buildsettingspropertiespage.cpp @@ -31,7 +31,9 @@ #include "projectconfigurationmodel.h" #include "session.h" +#include #include +#include #include #include #include @@ -49,6 +51,7 @@ using namespace ProjectExplorer; using namespace ProjectExplorer::Internal; +using namespace Utils; /// // BuildSettingsWidget @@ -251,7 +254,7 @@ QString BuildSettingsWidget::uniqueName(const QString & name) continue; bcNames.append(bc->displayName()); } - result = Utils::makeUniquelyNumbered(result, bcNames); + result = makeUniquelyNumbered(result, bcNames); } return result; } @@ -297,6 +300,16 @@ void BuildSettingsWidget::cloneConfiguration() return; bc->setDisplayName(name); + const std::function isBuildDirOk = [this](const QString &candidate) { + const auto fp = FilePath::fromString(candidate); + if (fp.exists()) + return false; + return !anyOf(m_target->buildConfigurations(), [&fp](const BuildConfiguration *bc) { + return bc->buildDirectory() == fp; }); + }; + bc->setBuildDirectory(FilePath::fromString(makeUniquelyNumbered( + bc->buildDirectory().toString(), + isBuildDirOk))); m_target->addBuildConfiguration(bc); SessionManager::setActiveBuildConfiguration(m_target, bc, SetActive::Cascade); }