diff --git a/dist/changelog/changes-13.0.2.md b/dist/changelog/changes-13.0.2.md new file mode 100644 index 00000000000..3e1b67b3784 --- /dev/null +++ b/dist/changelog/changes-13.0.2.md @@ -0,0 +1,86 @@ +Qt Creator 13.0.2 +================= + +Qt Creator version 13.0.2 contains bug fixes. + +The most important changes are listed in this document. For a complete list of +changes, see the Git log for the Qt Creator sources that you can check out from +the public Git repository. For example: + + git clone git://code.qt.io/qt-creator/qt-creator.git + git log --cherry-pick --pretty=oneline v13.0.1..v13.0.2 + +General +------- + +* Fixed that the `-client` option could start a new Qt Creator instance instead + of using a running one (which affects for example version control operations) + ([QTCREATORBUG-30624](https://bugreports.qt.io/browse/QTCREATORBUG-30624)) + +Editing +------- + +* Fixed that closing files with the tool button didn't add an entry to the + navigation history + +### Widget Designer + +* Fixed that `Use Qt module name in #include-directive` used Qt 4 module names + ([QTCREATORBUG-30751](https://bugreports.qt.io/browse/QTCREATORBUG-30751)) + +Projects +-------- + +### Meson + +* Fixed a crash when selecting kits + ([QTCREATORBUG-30698](https://bugreports.qt.io/browse/QTCREATORBUG-30698)) + +Terminal +-------- + +* Fixed the handling of environment variables with an equal sign `=` in the + value + ([QTCREATORBUG-30844](https://bugreports.qt.io/browse/QTCREATORBUG-30844)) + +Version Control Systems +----------------------- + +### Git + +* Fixed a crash in `Instant Blame` when reloading externally modified files + ([QTCREATORBUG-30824](https://bugreports.qt.io/browse/QTCREATORBUG-30824)) + +Platforms +--------- + +### Windows + +* Fixed missing paths with `Add build library search path to PATH` for CMake + projects + ([QTCREATORBUG-30556](https://bugreports.qt.io/browse/QTCREATORBUG-30556), + [QTCREATORBUG-30827](https://bugreports.qt.io/browse/QTCREATORBUG-30827), + [QTCREATORBUG-30932](https://bugreports.qt.io/browse/QTCREATORBUG-30932)) + +### Android + +* Fixed a crash when re-connecting devices + ([QTCREATORBUG-30645](https://bugreports.qt.io/browse/QTCREATORBUG-30645), + [QTCREATORBUG-30770](https://bugreports.qt.io/browse/QTCREATORBUG-30770)) + +### Remote Linux + +* Fixed passing more than one argument to `rsync` + ([QTCREATORBUG-30795](https://bugreports.qt.io/browse/QTCREATORBUG-30795)) + +Credits for these changes go to: +-------------------------------- +Alessandro Portale +Christian Kandeler +Christian Stenger +Cristian Adam +David Schulz +Eike Ziller +Leena Miettinen +Marcus Tillmanns +Robert Löhning diff --git a/src/libs/utils/terminalinterface.cpp b/src/libs/utils/terminalinterface.cpp index 0cd7ceb1df8..6f7bb11f81e 100644 --- a/src/libs/utils/terminalinterface.cpp +++ b/src/libs/utils/terminalinterface.cpp @@ -334,22 +334,12 @@ void TerminalInterface::start() Environment finalEnv = m_setup.m_environment; - if (HostOsInfo::isWindowsHost()) { - if (!finalEnv.hasKey("PATH")) { - const QString path = qtcEnvironmentVariable("PATH"); - if (!path.isEmpty()) - finalEnv.set("PATH", path); - } - if (!finalEnv.hasKey("SystemRoot")) { - const QString systemRoot = qtcEnvironmentVariable("SystemRoot"); - if (!systemRoot.isEmpty()) - finalEnv.set("SystemRoot", systemRoot); - } - } else if (HostOsInfo::isMacHost()) { + if (HostOsInfo::isMacHost()) finalEnv.set("TERM", "xterm-256color"); - } if (finalEnv.hasChanges()) { + finalEnv = finalEnv.appliedToEnvironment(Environment::systemEnvironment()); + d->envListFile = std::make_unique(this); if (!d->envListFile->open()) { cleanupAfterStartFailure(msgCannotCreateTempFile(d->envListFile->errorString())); diff --git a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp index 59e893569e6..6f4050a3aa4 100644 --- a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp +++ b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp @@ -209,12 +209,9 @@ static bool isChildOf(const FilePath &path, const FilePaths &prefixes) static CMakeBuildTarget toBuildTarget(const TargetDetails &t, const FilePath &sourceDirectory, const FilePath &buildDirectory, - bool relativeLibs, - const QSet &sharedLibraryArtifacts) + bool relativeLibs) { const FilePath currentBuildDir = buildDirectory.resolvePath(t.buildDir); - const QSet sharedLibraryArtifactsPaths - = transform(sharedLibraryArtifacts, &FilePath::parentDir); CMakeBuildTarget ct; ct.title = t.name; @@ -323,18 +320,18 @@ static CMakeBuildTarget toBuildTarget(const TargetDetails &t, // "/usr/local/lib" since these are usually in the standard search // paths. There probably are more, but the naming schemes are arbitrary // so we'd need to ask the linker ("ld --verbose | grep SEARCH_DIR"). - if (buildDir.osType() != OsTypeWindows - && !isChildOf(tmp, - {"/lib", "/lib64", "/usr/lib", "/usr/lib64", "/usr/local/lib"})) + if (buildDir.osType() == OsTypeWindows + || !isChildOf(tmp, + {"/lib", + "/lib64", + "/usr/lib", + "/usr/lib64", + "/usr/local/lib"})) { librarySeachPaths.append(tmp); - if (buildDir.osType() == OsTypeWindows) { - if (sharedLibraryArtifactsPaths.contains(tmp)) - librarySeachPaths.append(tmp); - // Libraries often have their import libs in ../lib and the // actual dll files in ../bin on windows. Qt is one example of that. - if (tmp.fileName() == "lib") { + if (tmp.fileName() == "lib" && buildDir.osType() == OsTypeWindows) { const FilePath path = tmp.parentDir().pathAppended("bin"); if (path.isDir()) librarySeachPaths.append(path); @@ -355,19 +352,12 @@ static QList generateBuildTargets(const QFuture &cancelF const FilePath &buildDirectory, bool relativeLibs) { - QSet sharedLibraryArtifacts; - for (const TargetDetails &t : input.targetDetails) - if (t.type == "MODULE_LIBRARY" || t.type == "SHARED_LIBRARY") - for (const FilePath &p : t.artifacts) - sharedLibraryArtifacts.insert(buildDirectory.resolvePath(p)); - QList result; result.reserve(input.targetDetails.size()); for (const TargetDetails &t : input.targetDetails) { if (cancelFuture.isCanceled()) return {}; - result.append( - toBuildTarget(t, sourceDirectory, buildDirectory, relativeLibs, sharedLibraryArtifacts)); + result.append(toBuildTarget(t, sourceDirectory, buildDirectory, relativeLibs)); } return result; } diff --git a/src/plugins/copilot/copilotsettings.cpp b/src/plugins/copilot/copilotsettings.cpp index aeac499c631..af16b56db57 100644 --- a/src/plugins/copilot/copilotsettings.cpp +++ b/src/plugins/copilot/copilotsettings.cpp @@ -50,18 +50,22 @@ CopilotSettings::CopilotSettings() // Vim, Linux/macOS: FilePath::fromUserInput("~/.vim/pack/github/start/copilot.vim/dist/agent.js"), FilePath::fromUserInput("~/.vim/pack/github/start/copilot.vim/copilot/dist/agent.js"), + FilePath::fromUserInput("~/.vim/pack/github/start/copilot.vim/dist/language-server.js"), // Neovim, Linux/macOS: FilePath::fromUserInput("~/.config/nvim/pack/github/start/copilot.vim/dist/agent.js"), FilePath::fromUserInput("~/.config/nvim/pack/github/start/copilot.vim/copilot/dist/agent.js"), + FilePath::fromUserInput("~/.config/nvim/pack/github/start/copilot.vim/dist/language-server.js"), // Vim, Windows (PowerShell command): FilePath::fromUserInput("~/vimfiles/pack/github/start/copilot.vim/dist/agent.js"), FilePath::fromUserInput("~/vimfiles/pack/github/start/copilot.vim/copilot/dist/agent.js"), + FilePath::fromUserInput("~/vimfiles/pack/github/start/copilot.vim/dist/language-server.js"), // Neovim, Windows (PowerShell command): FilePath::fromUserInput("~/AppData/Local/nvim/pack/github/start/copilot.vim/dist/agent.js"), - FilePath::fromUserInput("~/AppData/Local/nvim/pack/github/start/copilot.vim/copilot/dist/agent.js") + FilePath::fromUserInput("~/AppData/Local/nvim/pack/github/start/copilot.vim/copilot/dist/agent.js"), + FilePath::fromUserInput("~/AppData/Local/nvim/pack/github/start/copilot.vim/dist/language-server.js") }; // clang-format on @@ -198,7 +202,7 @@ CopilotSettings::CopilotSettings() "file from the Copilot neovim plugin.", "Markdown text for the copilot instruction label") .arg("[README.md](https://github.com/github/copilot.vim)") - .arg("[agent.js](https://github.com/github/copilot.vim/tree/release/dist)")) + .arg("[language-server.js](https://github.com/github/copilot.vim/tree/release/dist)")) }; return Column { diff --git a/src/plugins/mcusupport/mcupackage.cpp b/src/plugins/mcusupport/mcupackage.cpp index 2ff913c680e..2ccc4bcc1a0 100644 --- a/src/plugins/mcusupport/mcupackage.cpp +++ b/src/plugins/mcusupport/mcupackage.cpp @@ -43,11 +43,11 @@ McuPackage::McuPackage(const SettingsHandler::Ptr &settingsHandler, const McuPackageVersionDetector *versionDetector, const bool addToSystemPath, const Utils::PathChooser::Kind &valueType, - const bool useNewestVersionKey) + const bool allowNewerVersionKey) : settingsHandler(settingsHandler) , m_label(label) , m_detectionPaths(detectionPaths) - , m_settingsKey(settingsHandler->getVersionedKey(settingsKey, QSettings::SystemScope, versions, useNewestVersionKey)) + , m_settingsKey(settingsKey) , m_versionDetector(versionDetector) , m_versions(versions) , m_cmakeVariableName(cmakeVarName) @@ -56,8 +56,18 @@ McuPackage::McuPackage(const SettingsHandler::Ptr &settingsHandler, , m_addToSystemPath(addToSystemPath) , m_valueType(valueType) { - m_defaultPath = settingsHandler->getPath(m_settingsKey, QSettings::SystemScope, defaultPath); - m_path = settingsHandler->getPath(m_settingsKey, QSettings::UserScope, m_defaultPath); + // The installer writes versioned keys as well as the plain key as found in the kits. + // Use the versioned key in case the plain key was removed by an uninstall operation + const Utils::Key versionedKey = settingsHandler->getVersionedKey(settingsKey, + QSettings::SystemScope, + versions, + allowNewerVersionKey); + m_defaultPath = settingsHandler->getPath(versionedKey, QSettings::SystemScope, defaultPath); + m_path = settingsHandler->getPath(m_settingsKey, QSettings::UserScope, ""); + // The user settings may have been written with a versioned key in older versions of QtCreator + if (m_path.isEmpty()) { + m_path = settingsHandler->getPath(versionedKey, QSettings::UserScope, m_defaultPath); + } if (m_path.isEmpty()) { m_path = FilePath::fromUserInput(qtcEnvironmentVariable(m_environmentVariableName)); } @@ -559,6 +569,10 @@ QVariant McuToolchainPackage::debuggerId() const switch (m_type) { case ToolchainType::ArmGcc: { sub = QString::fromLatin1("bin/arm-none-eabi-gdb-py"); + const FilePath command = (path() / sub).withExecutableSuffix(); + if (!command.exists()) { + sub = QString::fromLatin1("bin/arm-none-eabi-gdb"); + } displayName = Tr::tr("Arm GDB at %1"); engineType = Debugger::GdbEngineType; break; diff --git a/src/plugins/mcusupport/mcupackage.h b/src/plugins/mcusupport/mcupackage.h index a74c08bcf2d..7b9ef646506 100644 --- a/src/plugins/mcusupport/mcupackage.h +++ b/src/plugins/mcusupport/mcupackage.h @@ -41,7 +41,7 @@ public: const bool addToPath = false, const Utils::PathChooser::Kind &valueType = Utils::PathChooser::Kind::ExistingDirectory, - const bool useNewestVersionKey = false); + const bool allowNewerVersionKey = false); ~McuPackage() override = default; diff --git a/src/plugins/mcusupport/settingshandler.cpp b/src/plugins/mcusupport/settingshandler.cpp index 1ecec030b45..939ba125d1c 100644 --- a/src/plugins/mcusupport/settingshandler.cpp +++ b/src/plugins/mcusupport/settingshandler.cpp @@ -105,12 +105,24 @@ FilePath SettingsHandler::getPath(const Key &settingsKey, bool SettingsHandler::write(const Key &settingsKey, const FilePath &path, - const FilePath &defaultPath) const + const FilePath &maybeDefaultPath) const { const FilePath savedPath = packagePathFromSettings(settingsKey, *Core::ICore::settings(QSettings::UserScope), - defaultPath); + maybeDefaultPath); const Key key = Key(Constants::SETTINGS_GROUP) + '/' + Constants::SETTINGS_KEY_PACKAGE_PREFIX + settingsKey; + + FilePath defaultPath = maybeDefaultPath; + if (path == maybeDefaultPath) { + // If the installer has overwritten the non-versioned key with an older version than the + // newest versioned key, and the user wants to manually return to the newest installed + // version, the defaultPath will match the desired path, and the settings object will + // assume it can simply remove the key instead of writing a new value to it. + // To work around this, pretend like the default value is the value found from the global scope + defaultPath = packagePathFromSettings(settingsKey, + *Core::ICore::settings(QSettings::SystemScope), + maybeDefaultPath);; + } Core::ICore::settings()->setValueWithDefault(key, path.toUserOutput(), defaultPath.toUserOutput());