diff options
author | Kai Koehne <kai.koehne@nokia.com> | 2011-04-19 11:07:34 +0200 |
---|---|---|
committer | con <qtc-committer@nokia.com> | 2011-04-20 15:21:41 +0200 |
commit | c3e2fd9ed73730b4b55cc69a07c713c50924c506 (patch) | |
tree | 98fe61a572ab348f0a5c45aaee79ed798e3b9469 | |
parent | 3f6e418b6845142bfc8c1533df14ade513770945 (diff) |
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
-rw-r--r-- | src/libs/utils/winutils.cpp | 13 | ||||
-rw-r--r-- | src/libs/utils/winutils.h | 3 | ||||
-rw-r--r-- | src/plugins/debugger/debuggerrunner.cpp | 7 | ||||
-rw-r--r-- | src/plugins/projectexplorer/applicationlauncher_win.cpp | 5 | ||||
-rw-r--r-- | src/plugins/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 7ed6909f2f1..f19bdfefbe4 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<const PROCESS_INFORMATION*>(qpid); diff --git a/src/libs/utils/winutils.h b/src/libs/utils/winutils.h index 92ca1f15783..caf9f9476a5 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 752ef207110..93fd15cb6b6 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 <utils/winutils.h> #endif #include <projectexplorer/abi.h> @@ -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 5ecf5f5e5ed..8a726c92a5a 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 627ce5d331e..d53e8f7cbb4 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp @@ -45,7 +45,7 @@ #include <qt4projectmanager/qtoutputformatter.h> #include <qt4projectmanager/qt4projectmanagerconstants.h> -#ifdef Q_OS_WIN32 +#ifdef Q_OS_WIN #include <utils/winutils.h> #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; |