From c3e2fd9ed73730b4b55cc69a07c713c50924c506 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Tue, 19 Apr 2011 11:07:34 +0200 Subject: [PATCH] Fix "File name case mismatch" error when debugging QML apps (Win) Work around QTBUG-17529 by normalizing the capitalization of the working directory (which we do already for launching apps without debugging). Task-number: QTCREATORBUG-4592 Reviewed-by: Friedemann Kleint --- src/libs/utils/winutils.cpp | 13 +++++++++++++ src/libs/utils/winutils.h | 3 +++ src/plugins/debugger/debuggerrunner.cpp | 7 +++++++ src/plugins/projectexplorer/applicationlauncher_win.cpp | 5 +---- .../qmlprojectmanager/qmlprojectrunconfiguration.cpp | 15 ++++----------- 5 files changed, 28 insertions(+), 15 deletions(-) diff --git a/src/libs/utils/winutils.cpp b/src/libs/utils/winutils.cpp index 7ed6909f2f..f19bdfefbe 100644 --- a/src/libs/utils/winutils.cpp +++ b/src/libs/utils/winutils.cpp @@ -163,6 +163,19 @@ QTCREATOR_UTILS_EXPORT QString getLongPathName(const QString &name) return rc; } +// makes sure that capitalization of directories is canonical. +// This mimics the logic in QDeclarative_isFileCaseCorrect +QTCREATOR_UTILS_EXPORT QString normalizePathName(const QString &name) +{ + QString canonicalName = getShortPathName(name); + if (canonicalName.isEmpty()) + return name; + canonicalName = getLongPathName(canonicalName); + if (canonicalName.isEmpty()) + return name; + return canonicalName; +} + QTCREATOR_UTILS_EXPORT unsigned long winQPidToPid(const Q_PID qpid) { const PROCESS_INFORMATION *processInfo = reinterpret_cast(qpid); diff --git a/src/libs/utils/winutils.h b/src/libs/utils/winutils.h index 92ca1f1578..caf9f9476a 100644 --- a/src/libs/utils/winutils.h +++ b/src/libs/utils/winutils.h @@ -59,6 +59,9 @@ QTCREATOR_UTILS_EXPORT QString getShortPathName(const QString &name); // Returns long name QTCREATOR_UTILS_EXPORT QString getLongPathName(const QString &name); +// Returns long name with canonical capitalization. +QTCREATOR_UTILS_EXPORT QString normalizePathName(const QString &name); + QTCREATOR_UTILS_EXPORT unsigned long winQPidToPid(const Q_PID qpid); QTCREATOR_UTILS_EXPORT bool winIs64BitSystem(); diff --git a/src/plugins/debugger/debuggerrunner.cpp b/src/plugins/debugger/debuggerrunner.cpp index 752ef20711..93fd15cb6b 100644 --- a/src/plugins/debugger/debuggerrunner.cpp +++ b/src/plugins/debugger/debuggerrunner.cpp @@ -46,6 +46,7 @@ #ifdef Q_OS_WIN # include "peutils.h" +# include #endif #include @@ -675,6 +676,12 @@ static DebuggerStartParameters localStartParameters(RunConfiguration *runConfigu sp.startMode = StartInternal; sp.environment = rc->environment(); sp.workingDirectory = rc->workingDirectory(); + +#if defined(Q_OS_WIN) + // Work around QTBUG-17529 (QtDeclarative fails with 'File name case mismatch' ...) + sp.workingDirectory = Utils::normalizePathName(sp.workingDirectory); +#endif + sp.executable = rc->executable(); sp.processArgs = rc->commandLineArguments(); sp.toolChainAbi = rc->abi(); diff --git a/src/plugins/projectexplorer/applicationlauncher_win.cpp b/src/plugins/projectexplorer/applicationlauncher_win.cpp index 5ecf5f5e5e..8a726c92a5 100644 --- a/src/plugins/projectexplorer/applicationlauncher_win.cpp +++ b/src/plugins/projectexplorer/applicationlauncher_win.cpp @@ -71,10 +71,7 @@ ApplicationLauncher::~ApplicationLauncher() void ApplicationLauncher::setWorkingDirectory(const QString &dir) { // Work around QTBUG-17529 (QtDeclarative fails with 'File name case mismatch' ...) - QString fixedPath = dir; - const QString longPath = Utils::getLongPathName(dir); - if (!longPath.isEmpty()) - fixedPath = longPath; + const QString fixedPath = Utils::normalizePathName(dir); d->m_winGuiProcess.setWorkingDirectory(fixedPath); d->m_consoleProcess.setWorkingDirectory(fixedPath); diff --git a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp index 627ce5d331..d53e8f7cbb 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp @@ -45,7 +45,7 @@ #include #include -#ifdef Q_OS_WIN32 +#ifdef Q_OS_WIN #include #endif @@ -180,20 +180,13 @@ void QmlProjectRunConfiguration::setQtVersionId(int id) } /* QtDeclarative checks explicitly that the capitalization for any URL / path - is exactly like the capitalization on disk. This method is uses the same - native Windows API's to get the exact canonical path. */ + is exactly like the capitalization on disk.*/ QString QmlProjectRunConfiguration::canonicalCapsPath(const QString &fileName) { QString canonicalPath = QFileInfo(fileName).canonicalFilePath(); -#if defined(Q_OS_WIN32) - // don't know whether the shortpath step is really needed, - // but we do this in QtDeclarative too. - QString path = Utils::getShortPathName(canonicalPath); - if (!path.isEmpty()) - path = Utils::getLongPathName(canonicalPath); - if (!path.isEmpty()) - canonicalPath = path; +#if defined(Q_OS_WIN) + canonicalPath = Utils::normalizePathName(canonicalPath); #endif return canonicalPath; -- 2.11.0