From 17ee4990d1efc2a3ff242ae8ebc6ce1ad6d1caff Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Wed, 11 May 2016 15:57:25 +0200 Subject: [PATCH 01/16] QmlProfiler: Allow for a maximum depth in flame graph view It gets unwieldy and eventually it produces a stack overflow if you have insane recursion. Change-Id: I8ae6bf018572d9b240aec01d5d3319544799e9bb Reviewed-by: Christian Kandeler Reviewed-by: Ulf Hermann --- .../qmlprofilerextension/FlameGraphView.qml | 1 + .../qmlprofilerextension/flamegraph.cpp | 32 +++++++++++-------- src/plugins/qmlprofilerextension/flamegraph.h | 20 +++++++++++- 3 files changed, 39 insertions(+), 14 deletions(-) diff --git a/src/plugins/qmlprofilerextension/FlameGraphView.qml b/src/plugins/qmlprofilerextension/FlameGraphView.qml index e834d1fad27..01e86001375 100644 --- a/src/plugins/qmlprofilerextension/FlameGraphView.qml +++ b/src/plugins/qmlprofilerextension/FlameGraphView.qml @@ -61,6 +61,7 @@ ScrollView { model: flameGraphModel sizeRole: FlameGraphModel.Duration sizeThreshold: 0.002 + maximumDepth: 25 y: flickable.height > height ? flickable.height - height : 0 delegate: Item { diff --git a/src/plugins/qmlprofilerextension/flamegraph.cpp b/src/plugins/qmlprofilerextension/flamegraph.cpp index 1b7ba97826f..17d7bbee918 100644 --- a/src/plugins/qmlprofilerextension/flamegraph.cpp +++ b/src/plugins/qmlprofilerextension/flamegraph.cpp @@ -126,7 +126,8 @@ QObject *FlameGraph::appendChild(QObject *parentObject, QQuickItem *parentItem, } -int FlameGraph::buildNode(const QModelIndex &parentIndex, QObject *parentObject, int depth) +int FlameGraph::buildNode(const QModelIndex &parentIndex, QObject *parentObject, int depth, + int maximumDepth) { qreal position = 0; qreal skipped = 0; @@ -135,18 +136,23 @@ int FlameGraph::buildNode(const QModelIndex &parentIndex, QObject *parentObject, QQmlContext *context = qmlContext(this); int rowCount = m_model->rowCount(parentIndex); int childrenDepth = depth; - for (int row = 0; row < rowCount; ++row) { - QModelIndex childIndex = m_model->index(row, 0, parentIndex); - qreal size = m_model->data(childIndex, m_sizeRole).toReal(); - if (size / m_model->data(QModelIndex(), m_sizeRole).toReal() < m_sizeThreshold) { - skipped += size; - continue; - } + if (depth == maximumDepth - 1) { + skipped = parentSize; + } else { + for (int row = 0; row < rowCount; ++row) { + QModelIndex childIndex = m_model->index(row, 0, parentIndex); + qreal size = m_model->data(childIndex, m_sizeRole).toReal(); + if (size / m_model->data(QModelIndex(), m_sizeRole).toReal() < m_sizeThreshold) { + skipped += size; + continue; + } - QObject *childObject = appendChild(parentObject, parentItem, context, childIndex, - position / parentSize, size / parentSize); - position += size; - childrenDepth = qMax(childrenDepth, buildNode(childIndex, childObject, depth + 1)); + QObject *childObject = appendChild(parentObject, parentItem, context, childIndex, + position / parentSize, size / parentSize); + position += size; + childrenDepth = qMax(childrenDepth, buildNode(childIndex, childObject, depth + 1, + maximumDepth)); + } } if (skipped > 0) { @@ -169,7 +175,7 @@ void FlameGraph::rebuild() return; } - m_depth = buildNode(QModelIndex(), this, 0); + m_depth = buildNode(QModelIndex(), this, 0, m_maximumDepth); emit depthChanged(m_depth); } diff --git a/src/plugins/qmlprofilerextension/flamegraph.h b/src/plugins/qmlprofilerextension/flamegraph.h index 832752c3b8e..d61cb1075cb 100644 --- a/src/plugins/qmlprofilerextension/flamegraph.h +++ b/src/plugins/qmlprofilerextension/flamegraph.h @@ -109,6 +109,8 @@ class FlameGraph : public QQuickItem Q_PROPERTY(int sizeRole READ sizeRole WRITE setSizeRole NOTIFY sizeRoleChanged) Q_PROPERTY(qreal sizeThreshold READ sizeThreshold WRITE setSizeThreshold NOTIFY sizeThresholdChanged) + Q_PROPERTY(int maximumDepth READ maximumDepth WRITE setMaximumDepth + NOTIFY maximumDepthChanged) Q_PROPERTY(int depth READ depth NOTIFY depthChanged) public: @@ -128,6 +130,19 @@ public: int depth() const; + int maximumDepth() const + { + return m_maximumDepth; + } + + void setMaximumDepth(int maximumDepth) + { + if (maximumDepth != m_maximumDepth) { + m_maximumDepth = maximumDepth; + emit maximumDepthChanged(); + } + } + static FlameGraphAttached *qmlAttachedProperties(QObject *object); signals: @@ -136,6 +151,7 @@ signals: void sizeRoleChanged(int role); void sizeThresholdChanged(qreal threshold); void depthChanged(int depth); + void maximumDepthChanged(); private slots: void rebuild(); @@ -146,8 +162,10 @@ private: int m_sizeRole = 0; int m_depth = 0; qreal m_sizeThreshold = 0; + int m_maximumDepth = std::numeric_limits::max(); - int buildNode(const QModelIndex &parentIndex, QObject *parentObject, int depth); + int buildNode(const QModelIndex &parentIndex, QObject *parentObject, int depth, + int maximumDepth); QObject *appendChild(QObject *parentObject, QQuickItem *parentItem, QQmlContext *context, const QModelIndex &childIndex, qreal position, qreal size); }; From 8271277d3019bb2648dec7d5df4b2f4c582ef1b3 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 27 May 2016 13:27:15 +0200 Subject: [PATCH 02/16] Update qbs submodule. To HEAD of 1.5 branch. Change-Id: I9452fd110330713ea58593cc4c4f6673533b2d41 Reviewed-by: Eike Ziller --- src/shared/qbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared/qbs b/src/shared/qbs index e936ead98d5..1cfa5ed52c2 160000 --- a/src/shared/qbs +++ b/src/shared/qbs @@ -1 +1 @@ -Subproject commit e936ead98d58e3b54e0b3b3f89b93be2caa5206e +Subproject commit 1cfa5ed52c2cdfaf0a0a6b12a1f41bce0a9a67e1 From 74b6d2e70851514c02c570216801a832c099c268 Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 27 May 2016 13:57:21 +0200 Subject: [PATCH 03/16] Debugger: Clean up GdbEngine member data on finish Restarting with cached outdated information is problematic. Change-Id: I396da2fef96a161c1ab150134b8e65a758a16d58 Task-number: QTCREATORBUG-16355 Reviewed-by: Christian Stenger --- src/plugins/debugger/debuggerengine.cpp | 1 + src/plugins/debugger/debuggerengine.h | 1 + src/plugins/debugger/gdb/gdbengine.cpp | 8 ++++++++ src/plugins/debugger/gdb/gdbengine.h | 1 + 4 files changed, 11 insertions(+) diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp index c8a979f0c21..186d594a75f 100644 --- a/src/plugins/debugger/debuggerengine.cpp +++ b/src/plugins/debugger/debuggerengine.cpp @@ -1280,6 +1280,7 @@ void DebuggerEngine::setState(DebuggerState state, bool forced) bp.notifyBreakpointReleased(); DebuggerToolTipManager::deregisterEngine(this); d->m_memoryAgent.handleDebuggerFinished(); + prepareForRestart(); } showMessage(msg, LogDebug); diff --git a/src/plugins/debugger/debuggerengine.h b/src/plugins/debugger/debuggerengine.h index 86f7a567212..34061dcd967 100644 --- a/src/plugins/debugger/debuggerengine.h +++ b/src/plugins/debugger/debuggerengine.h @@ -201,6 +201,7 @@ public: virtual void selectWatchData(const QByteArray &iname); virtual void startDebugger(DebuggerRunControl *runControl); + virtual void prepareForRestart() {} virtual void watchPoint(const QPoint &); diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index d950f41b245..fe375eafdda 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -4300,6 +4300,14 @@ void GdbEngine::notifyInferiorSetupFailed() DebuggerEngine::notifyInferiorSetupFailed(); } +void GdbEngine::prepareForRestart() +{ + m_rerunPending = false; + m_commandsDoneCallback = 0; + m_commandForToken.clear(); + m_flagsForToken.clear(); +} + void GdbEngine::handleInferiorPrepared() { const DebuggerRunParameters &rp = runParameters(); diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h index ad4ead27116..66fa15f38a5 100644 --- a/src/plugins/debugger/gdb/gdbengine.h +++ b/src/plugins/debugger/gdb/gdbengine.h @@ -72,6 +72,7 @@ private: ////////// General Interface ////////// virtual void handleGdbStartFailed(); void notifyInferiorSetupFailed() override; + void prepareForRestart() override; bool hasCapability(unsigned) const override; void detachDebugger() override; From d89fc0bfeaecc367d88ac26e57e255a7ae1fb5fe Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Thu, 26 May 2016 15:27:41 +0200 Subject: [PATCH 04/16] QbsProjectManager: Logging improvements. - Make messages with level "warning" or "error" appear in the Issues pane. - Do not suppress messages of level "info". People add "console.info()" calls into their projects for debugging and they expect to see the output in Creator. Task-number: QTCREATORBUG-15983 Change-Id: I6c84bc1ef08dbf85d7e88af864b18f64fcedfe1a Reviewed-by: Jake Petroules --- src/plugins/qbsprojectmanager/qbslogsink.cpp | 4 ++++ src/plugins/qbsprojectmanager/qbsprojectmanager.cpp | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/plugins/qbsprojectmanager/qbslogsink.cpp b/src/plugins/qbsprojectmanager/qbslogsink.cpp index 30c1f3780c1..2b28dd1c207 100644 --- a/src/plugins/qbsprojectmanager/qbslogsink.cpp +++ b/src/plugins/qbsprojectmanager/qbslogsink.cpp @@ -79,6 +79,10 @@ void QbsLogSink::doPrintMessage(qbs::LoggerLevel level, const QString &message, { QMutexLocker l(&m_mutex); + if (level <= qbs::LoggerWarning) { + doPrintWarning(qbs::ErrorInfo(message)); + return; + } m_messages.append(qbs::logLevelTag(level) + message); } QMetaObject::invokeMethod(this, "sendMessages", Qt::QueuedConnection); diff --git a/src/plugins/qbsprojectmanager/qbsprojectmanager.cpp b/src/plugins/qbsprojectmanager/qbsprojectmanager.cpp index b0805f65a08..34eb9c693c3 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectmanager.cpp +++ b/src/plugins/qbsprojectmanager/qbsprojectmanager.cpp @@ -78,7 +78,7 @@ QbsManager::QbsManager() : this, &QbsManager::updateAllProfiles); m_logSink = new QbsLogSink(this); - int level = qbs::LoggerWarning; + int level = qbs::LoggerInfo; const QString levelEnv = QString::fromLocal8Bit(qgetenv("QBS_LOG_LEVEL")); if (!levelEnv.isEmpty()) { bool ok = false; From b4e11b191becd0f5e2c405d9cd65ecb098d3faec Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 27 May 2016 13:59:39 +0200 Subject: [PATCH 05/16] QbsProjectManager: Prevent transient build dirs from becoming permanent. If "dry run" is enabled for the project resolving step, then the rule execution step needs it too. Task-number: QTCREATORBUG-16343 Change-Id: I6db7ad68b447299d2b4848f128a262e6097786d4 Reviewed-by: Jake Petroules --- src/plugins/qbsprojectmanager/qbsprojectparser.cpp | 4 +++- src/plugins/qbsprojectmanager/qbsprojectparser.h | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/plugins/qbsprojectmanager/qbsprojectparser.cpp b/src/plugins/qbsprojectmanager/qbsprojectparser.cpp index af53e1bce80..22fc1112d98 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectparser.cpp +++ b/src/plugins/qbsprojectmanager/qbsprojectparser.cpp @@ -93,7 +93,8 @@ void QbsProjectParser::parse(const QVariantMap &config, const Environment &env, // Some people don't like it when files are created as a side effect of opening a project, // so do not store the build graph if the build directory does not exist yet. - params.setDryRun(!QFileInfo::exists(dir)); + m_dryRun = !QFileInfo::exists(dir); + params.setDryRun(m_dryRun); params.setBuildRoot(dir); params.setProjectFilePath(m_projectFilePath); @@ -151,6 +152,7 @@ void QbsProjectParser::handleQbsParsingDone(bool success) void QbsProjectParser::startRuleExecution() { qbs::BuildOptions options; + options.setDryRun(m_dryRun); options.setExecuteRulesOnly(true); m_ruleExecutionJob = m_project.buildAllProducts( options, qbs::Project::ProductSelectionWithNonDefault, this); diff --git a/src/plugins/qbsprojectmanager/qbsprojectparser.h b/src/plugins/qbsprojectmanager/qbsprojectparser.h index c00450e5741..be008a4ef0b 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectparser.h +++ b/src/plugins/qbsprojectmanager/qbsprojectparser.h @@ -75,6 +75,7 @@ private: qbs::BuildJob *m_ruleExecutionJob; qbs::ErrorInfo m_error; qbs::Project m_project; + bool m_dryRun; QFutureInterface *m_fi; int m_currentProgressBase; From c1e7cf84e40a9c54577e614d626a4f5774708fec Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Thu, 26 May 2016 18:51:15 +0200 Subject: [PATCH 06/16] Squish: Do not use shell in getOutputFromCmdline Change-Id: I731b119169063912cd3b528a1a6a58727002ae67 Reviewed-by: Christian Stenger --- tests/system/shared/hook_utils.py | 8 ++++---- tests/system/shared/project_explorer.py | 2 +- tests/system/shared/qtcreator.py | 2 +- tests/system/shared/utils.py | 6 +++--- tests/system/shared/workarounds.py | 10 ++++++---- .../system/suite_general/tst_default_settings/test.py | 4 ++-- tests/system/suite_tools/tst_external_sort/test.py | 6 +++--- 7 files changed, 20 insertions(+), 18 deletions(-) diff --git a/tests/system/shared/hook_utils.py b/tests/system/shared/hook_utils.py index 89b1d6b230a..16314fe50fc 100644 --- a/tests/system/shared/hook_utils.py +++ b/tests/system/shared/hook_utils.py @@ -179,10 +179,10 @@ def __getMkspecFromQMakeConf__(qmakeConf): return os.path.basename(mkspec) def __getMkspecFromQmake__(qmakeCall): - if getOutputFromCmdline("%s -query QT_VERSION" % qmakeCall).strip().startswith("5."): - return getOutputFromCmdline("%s -query QMAKE_XSPEC" % qmakeCall).strip() + if getOutputFromCmdline([qmakeCall, "-query", "QT_VERSION"]).strip().startswith("5."): + return getOutputFromCmdline([qmakeCall, "-query", "QMAKE_XSPEC"]).strip() else: - QmakeConfPath = getOutputFromCmdline("%s -query QMAKE_MKSPECS" % qmakeCall).strip() + QmakeConfPath = getOutputFromCmdline([qmakeCall, "-query", "QMAKE_MKSPECS"]).strip() for tmpPath in QmakeConfPath.split(os.pathsep): tmpPath = tmpPath + os.sep + "default" + os.sep +"qmake.conf" result = __getMkspecFromQMakeConf__(tmpPath) @@ -326,7 +326,7 @@ def __isWinFirewallRunning__(): if not platform.system() in ('Microsoft' 'Windows'): __isWinFirewallRunning__.fireWallState = False return False - result = getOutputFromCmdline("netsh firewall show state") + result = getOutputFromCmdline(["netsh", "firewall", "show", "state"]) for line in result.splitlines(): if "Operational mode" in line: __isWinFirewallRunning__.fireWallState = not "Disable" in line diff --git a/tests/system/shared/project_explorer.py b/tests/system/shared/project_explorer.py index c98421788fb..5103d72269a 100644 --- a/tests/system/shared/project_explorer.py +++ b/tests/system/shared/project_explorer.py @@ -277,7 +277,7 @@ def getQtInformationByQMakeCall(qtDir, which): else: test.fatal("You're trying to fetch an unknown information (%s)" % which) return None - return getOutputFromCmdline("%s -query %s" % (qmake, query)).strip() + return getOutputFromCmdline([qmake, "-query", query]).strip() def invokeContextMenuOnProject(projectName, menuItem): try: diff --git a/tests/system/shared/qtcreator.py b/tests/system/shared/qtcreator.py index c9d2ee27826..265fa10107b 100644 --- a/tests/system/shared/qtcreator.py +++ b/tests/system/shared/qtcreator.py @@ -118,7 +118,7 @@ def waitForCleanShutdown(timeOut=10): if not shutdownDone and datetime.utcnow() > endtime: break if platform.system() == 'Linux' and JIRA.isBugStillOpen(15749): - pgrepOutput = getOutputFromCmdline('pgrep -f qtcreator_process_stub') + pgrepOutput = getOutputFromCmdline(["pgrep", "-f", "qtcreator_process_stub"]) pids = pgrepOutput.splitlines() if len(pids): print("Killing %d qtcreator_process_stub instances" % len(pids)) diff --git a/tests/system/shared/utils.py b/tests/system/shared/utils.py index 85cfb2f096d..1429cb6c0f4 100644 --- a/tests/system/shared/utils.py +++ b/tests/system/shared/utils.py @@ -139,7 +139,7 @@ def which(program): command = "where" else: command = "which" - foundPath = getOutputFromCmdline(command + " " + program) + foundPath = getOutputFromCmdline([command, program]) if foundPath: return foundPath.splitlines()[0] else: @@ -216,9 +216,9 @@ def logApplicationOutput(): return None # get the output from a given cmdline call -def getOutputFromCmdline(cmdline): +def getOutputFromCmdline(cmdline, environment=None): try: - return subprocess.check_output(cmdline, shell=True) # TODO: do not use shell=True + return subprocess.check_output(cmdline, env=environment) except subprocess.CalledProcessError as e: test.warning("Command '%s' returned %d" % (e.cmd, e.returncode)) return e.output diff --git a/tests/system/shared/workarounds.py b/tests/system/shared/workarounds.py index ae9cc9609a1..d0a7ab0145d 100644 --- a/tests/system/shared/workarounds.py +++ b/tests/system/shared/workarounds.py @@ -224,16 +224,18 @@ class JIRA: def __tryExternalTools__(self, proxy=None): global JIRA_URL if proxy: - cmdAndArgs = { 'curl':'-k --proxy %s' % proxy, - 'wget':'-qO-'} + cmdAndArgs = { 'curl':['-k', '--proxy', proxy], + 'wget':['-qO-']} else: - cmdAndArgs = { 'curl':'-k', 'wget':'-qO-' } + cmdAndArgs = { 'curl':['-k'], 'wget':['-qO-']} for call in cmdAndArgs: prog = which(call) if prog: if call == 'wget' and proxy and os.getenv("https_proxy", None) == None: test.warning("Missing environment variable https_proxy for using wget with proxy!") - return getOutputFromCmdline('"%s" %s %s/%s-%d' % (prog, cmdAndArgs[call], JIRA_URL, self._bugType, self._number)) + cmdline = [prog] + cmdAndArgs[call] + cmdline += ['%s/%s-%d' % (JIRA_URL, self._bugType, self._number)] + return getOutputFromCmdline(cmdline) return None # this function crops multiple whitespaces from fetched and searches for expected diff --git a/tests/system/suite_general/tst_default_settings/test.py b/tests/system/suite_general/tst_default_settings/test.py index b7bc5f41daf..1568c6e114a 100644 --- a/tests/system/suite_general/tst_default_settings/test.py +++ b/tests/system/suite_general/tst_default_settings/test.py @@ -165,7 +165,7 @@ def __getExpectedCompilers__(): if platform.system() in ('Linux', 'Darwin'): compilers.extend(["g++-4.0", "g++-4.2", "clang++"]) if platform.system() == 'Darwin': - xcodeClang = getOutputFromCmdline("xcrun --find clang++").strip("\n") + xcodeClang = getOutputFromCmdline(["xcrun", "--find", "clang++"]).strip("\n") if xcodeClang and os.path.exists(xcodeClang) and xcodeClang not in expected: expected.append(xcodeClang) for compiler in compilers: @@ -217,7 +217,7 @@ def __getExpectedDebuggers__(): result.extend(filter(lambda s: not ("lldb-platform" in s or "lldb-gdbserver" in s), findAllFilesInPATH("lldb-*"))) if platform.system() == 'Darwin': - xcodeLLDB = getOutputFromCmdline("xcrun --find lldb").strip("\n") + xcodeLLDB = getOutputFromCmdline(["xcrun", "--find", "lldb"]).strip("\n") if xcodeLLDB and os.path.exists(xcodeLLDB) and xcodeLLDB not in result: result.append(xcodeLLDB) return result diff --git a/tests/system/suite_tools/tst_external_sort/test.py b/tests/system/suite_tools/tst_external_sort/test.py index 68d36841eab..95d8d93126e 100644 --- a/tests/system/suite_tools/tst_external_sort/test.py +++ b/tests/system/suite_tools/tst_external_sort/test.py @@ -31,10 +31,10 @@ def main(): return invokeMenuItem("File", "Open File or Project...") unsortedFile = os.path.join(os.getcwd(), "testdata", "unsorted.txt") - locale = "" + locale = None if not platform.system() in ('Windows', 'Microsoft'): - locale = "LC_ALL=C " - sorted = getOutputFromCmdline("%ssort %s" % (locale, unsortedFile)).replace("\r", "") + locale = {"LC_ALL":"C"} + sorted = getOutputFromCmdline(["sort", unsortedFile], locale).replace("\r", "") selectFromFileDialog(unsortedFile) editor = waitForObject("{type='TextEditor::TextEditorWidget' unnamed='1' " "visible='1' window=':Qt Creator_Core::Internal::MainWindow'}", 3000) From 7e9aa9c9081f4da36344933101ded8328fa87200 Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Mon, 30 May 2016 11:52:37 +0200 Subject: [PATCH 07/16] Squish: Silence warnings in tst_default_settings Change-Id: I668cc7b1fcb569b50d2178fe792f566721c9d4d4 Reviewed-by: Christian Stenger --- tests/system/shared/utils.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/system/shared/utils.py b/tests/system/shared/utils.py index 1429cb6c0f4..bdd64fcdcd8 100644 --- a/tests/system/shared/utils.py +++ b/tests/system/shared/utils.py @@ -139,7 +139,7 @@ def which(program): command = "where" else: command = "which" - foundPath = getOutputFromCmdline([command, program]) + foundPath = getOutputFromCmdline([command, program], acceptedError=1) if foundPath: return foundPath.splitlines()[0] else: @@ -216,11 +216,12 @@ def logApplicationOutput(): return None # get the output from a given cmdline call -def getOutputFromCmdline(cmdline, environment=None): +def getOutputFromCmdline(cmdline, environment=None, acceptedError=0): try: return subprocess.check_output(cmdline, env=environment) except subprocess.CalledProcessError as e: - test.warning("Command '%s' returned %d" % (e.cmd, e.returncode)) + if e.returncode != acceptedError: + test.warning("Command '%s' returned %d" % (e.cmd, e.returncode)) return e.output def selectFromFileDialog(fileName, waitForFile=False): From 6531ff567267d56c14426bcf4272f98cdc6f3d0f Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Sat, 28 May 2016 23:09:14 +0300 Subject: [PATCH 08/16] CMake: Unindent a lambda Change-Id: I71af11e3fba9a47c24b06bb19617ab212ee5b8a1 Reviewed-by: Tobias Hunger --- .../cmakeprojectmanager/builddirmanager.cpp | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/builddirmanager.cpp b/src/plugins/cmakeprojectmanager/builddirmanager.cpp index 6238856bfb0..432e28cfba0 100644 --- a/src/plugins/cmakeprojectmanager/builddirmanager.cpp +++ b/src/plugins/cmakeprojectmanager/builddirmanager.cpp @@ -64,29 +64,29 @@ namespace Internal { static QStringList toArguments(const CMakeConfig &config, const ProjectExplorer::Kit *k) { return Utils::transform(config, [k](const CMakeConfigItem &i) -> QString { - QString a = QString::fromLatin1("-D"); - a.append(QString::fromUtf8(i.key)); - switch (i.type) { - case CMakeConfigItem::FILEPATH: - a.append(QLatin1String(":FILEPATH=")); - break; - case CMakeConfigItem::PATH: - a.append(QLatin1String(":PATH=")); - break; - case CMakeConfigItem::BOOL: - a.append(QLatin1String(":BOOL=")); - break; - case CMakeConfigItem::STRING: - a.append(QLatin1String(":STRING=")); - break; - case CMakeConfigItem::INTERNAL: - a.append(QLatin1String(":INTERNAL=")); - break; - } - a.append(i.expandedValue(k)); + QString a = QString::fromLatin1("-D"); + a.append(QString::fromUtf8(i.key)); + switch (i.type) { + case CMakeConfigItem::FILEPATH: + a.append(QLatin1String(":FILEPATH=")); + break; + case CMakeConfigItem::PATH: + a.append(QLatin1String(":PATH=")); + break; + case CMakeConfigItem::BOOL: + a.append(QLatin1String(":BOOL=")); + break; + case CMakeConfigItem::STRING: + a.append(QLatin1String(":STRING=")); + break; + case CMakeConfigItem::INTERNAL: + a.append(QLatin1String(":INTERNAL=")); + break; + } + a.append(i.expandedValue(k)); - return a; - }); + return a; + }); } // -------------------------------------------------------------------- From 0043c721c254607009b88732ec0d13f2af1f1191 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Sat, 28 May 2016 23:10:27 +0300 Subject: [PATCH 09/16] CMake: Pass STATIC types on cmake execution Change-Id: Ie3401d009044a46af7fac314d1f29975543a44b0 Reviewed-by: Tobias Hunger --- src/plugins/cmakeprojectmanager/builddirmanager.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/plugins/cmakeprojectmanager/builddirmanager.cpp b/src/plugins/cmakeprojectmanager/builddirmanager.cpp index 432e28cfba0..f1a46dab4a9 100644 --- a/src/plugins/cmakeprojectmanager/builddirmanager.cpp +++ b/src/plugins/cmakeprojectmanager/builddirmanager.cpp @@ -82,6 +82,9 @@ static QStringList toArguments(const CMakeConfig &config, const ProjectExplorer: case CMakeConfigItem::INTERNAL: a.append(QLatin1String(":INTERNAL=")); break; + case CMakeConfigItem::STATIC: + a.append(QLatin1String(":STATIC=")); + break; } a.append(i.expandedValue(k)); From 8405a16179e8a3d95841dce0cfbd0b8480dfd48b Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Mon, 30 May 2016 12:03:27 +0000 Subject: [PATCH 10/16] Revert "CMake: Pass STATIC types on cmake execution" I have missed that this change was headed for 4.0 instead of master. It breaks the build there. This reverts commit 0043c721c254607009b88732ec0d13f2af1f1191. Change-Id: Ia359798c2636b2b4699de9cc73484ec12a757601 Reviewed-by: Orgad Shaneh --- src/plugins/cmakeprojectmanager/builddirmanager.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/builddirmanager.cpp b/src/plugins/cmakeprojectmanager/builddirmanager.cpp index f1a46dab4a9..432e28cfba0 100644 --- a/src/plugins/cmakeprojectmanager/builddirmanager.cpp +++ b/src/plugins/cmakeprojectmanager/builddirmanager.cpp @@ -82,9 +82,6 @@ static QStringList toArguments(const CMakeConfig &config, const ProjectExplorer: case CMakeConfigItem::INTERNAL: a.append(QLatin1String(":INTERNAL=")); break; - case CMakeConfigItem::STATIC: - a.append(QLatin1String(":STATIC=")); - break; } a.append(i.expandedValue(k)); From 0e331a2e2946385d2a86fcf2d13027a8e4003484 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Mon, 30 May 2016 07:22:38 +0200 Subject: [PATCH 11/16] Squish: Adapt to changes in Quick Application template The template has slightly changed in 6b506b34ec68315021dc80d6e0f595580586c98d. Change-Id: Id58e67beacaac046c6dd235b715f360dc7ef4c09 Reviewed-by: Robert Loehning --- .../testdata/events_qt5.tsv | 22 +++++++++---------- .../suite_debugger/tst_simple_debug/test.py | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/tests/system/suite_debugger/tst_simple_analyze/testdata/events_qt5.tsv b/tests/system/suite_debugger/tst_simple_analyze/testdata/events_qt5.tsv index 3cc221462a9..b7422391d58 100644 --- a/tests/system/suite_debugger/tst_simple_analyze/testdata/events_qt5.tsv +++ b/tests/system/suite_debugger/tst_simple_analyze/testdata/events_qt5.tsv @@ -1,15 +1,15 @@ "0" "1" "6" "11" "" "" "1" "Main Program" "main.qml:4" "Create" "2" "QtQuick.Window/Window" -"main.qml:12" "Signal" "2" "onTriggered: { runCount += 1; var i; for (i = 1; i < 2500; ++i) { var j = i * i; console.log(j); } }" -"main.qml:12" "JavaScript" "2" "onTriggered" -"main.qml:30" "Create" "2" "QtQuick/Text" +"main.qml:15" "Signal" "2" "onTriggered: { runCount += 1; var i; for (i = 1; i < 2500; ++i) { var j = i * i; console.log(j); } }" +"main.qml:15" "JavaScript" "2" "onTriggered" +"main.qml:33" "Create" "2" "QtQuick/Text" "main.qml:1" "Compile" "1" "main.qml" -"main.qml:7" "Create" "2" "QtQuick/Timer" -"main.qml:32" "Binding" "1" "anchors.centerIn: parent" -"main.qml:23" "Create" "2" "QtQuick/MouseArea" -"main.qml:11" "Binding" "3" "running: runCount < 2" -"main.qml:32" "JavaScript" "1" "expression for centerIn" -"main.qml:24" "Binding" "1" "anchors.fill: parent" -"main.qml:11" "JavaScript" "3" "expression for running" -"main.qml:24" "JavaScript" "1" "expression for fill" +"main.qml:10" "Create" "2" "QtQuick/Timer" +"main.qml:35" "Binding" "1" "anchors.centerIn: parent" +"main.qml:26" "Create" "2" "QtQuick/MouseArea" +"main.qml:14" "Binding" "3" "running: runCount < 2" +"main.qml:35" "JavaScript" "1" "expression for centerIn" +"main.qml:27" "Binding" "1" "anchors.fill: parent" +"main.qml:14" "JavaScript" "3" "expression for running" +"main.qml:27" "JavaScript" "1" "expression for fill" diff --git a/tests/system/suite_debugger/tst_simple_debug/test.py b/tests/system/suite_debugger/tst_simple_debug/test.py index 205ef99cfca..43f1e720992 100644 --- a/tests/system/suite_debugger/tst_simple_debug/test.py +++ b/tests/system/suite_debugger/tst_simple_debug/test.py @@ -51,7 +51,7 @@ def main(): result = setBreakpointsForCurrentProject(filesAndLines) if result: expectedBreakpointsOrder = [{os.path.join(workingDir, projectName, "main.cpp"):8}, - {os.path.join(workingDir, projectName, "main.qml"):10}] + {os.path.join(workingDir, projectName, "main.qml"):13}] # Only use 4.7.4 to work around QTBUG-25187 availableConfigs = iterateBuildConfigs(len(checkedTargets), "Debug") progressBarWait() From 299d93e77be421f1fa6fbb3f06701113013b4e11 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Mon, 30 May 2016 12:31:13 +0200 Subject: [PATCH 12/16] QbsProjectManager: Fix crash on project unloading. We can't just blindly delete the qbs jobs after cancelling them, as that is not a synchronous operation. Task-number: QTCREATORBUG-16273 Change-Id: I29787da857e70404a1be1b4bc54921f5a8ce448b Reviewed-by: Orgad Shaneh --- .../qbsprojectmanager/qbsprojectparser.cpp | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/plugins/qbsprojectmanager/qbsprojectparser.cpp b/src/plugins/qbsprojectmanager/qbsprojectparser.cpp index 22fc1112d98..d477062341e 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectparser.cpp +++ b/src/plugins/qbsprojectmanager/qbsprojectparser.cpp @@ -59,18 +59,18 @@ QbsProjectParser::QbsProjectParser(QbsProject *project, QFutureInterface * QbsProjectParser::~QbsProjectParser() { - if (m_qbsSetupProjectJob) { - m_qbsSetupProjectJob->disconnect(this); - m_qbsSetupProjectJob->cancel(); - m_qbsSetupProjectJob->deleteLater(); - m_qbsSetupProjectJob = 0; - } - if (m_ruleExecutionJob) { - m_ruleExecutionJob->disconnect(this); - m_ruleExecutionJob->cancel(); - m_ruleExecutionJob->deleteLater(); - m_ruleExecutionJob = 0; - } + const auto deleteJob = [this](qbs::AbstractJob *job) { + if (!job) + return; + if (job->state() == qbs::AbstractJob::StateFinished) { + job->deleteLater(); + return; + } + connect(job, &qbs::AbstractJob::finished, job, &qbs::AbstractJob::deleteLater); + job->cancel(); + }; + deleteJob(m_qbsSetupProjectJob); + deleteJob(m_ruleExecutionJob); m_fi = 0; // we do not own m_fi, do not delete } From 3a6ee2c305db90a7a713e830b89187270b3175ec Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 30 May 2016 13:50:20 +0200 Subject: [PATCH 13/16] Debugger: Move console stub procedure creation ... to a place where it can potentially be re-started. Change-Id: Icc7ba4512533cdef659507442eec069e073f84b1 Reviewed-by: Eike Ziller --- src/plugins/debugger/lldb/lldbengine.cpp | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/plugins/debugger/lldb/lldbengine.cpp b/src/plugins/debugger/lldb/lldbengine.cpp index 283b2c87d8d..38d89a57924 100644 --- a/src/plugins/debugger/lldb/lldbengine.cpp +++ b/src/plugins/debugger/lldb/lldbengine.cpp @@ -87,19 +87,6 @@ LldbEngine::LldbEngine(const DebuggerRunParameters &startParameters) m_lastAgentId = 0; setObjectName(QLatin1String("LldbEngine")); - if (startParameters.useTerminal) { - #ifdef Q_OS_WIN - // Windows up to xp needs a workaround for attaching to freshly started processes. see proc_stub_win - if (QSysInfo::WindowsVersion >= QSysInfo::WV_VISTA) - m_stubProc.setMode(ConsoleProcess::Suspend); - else - m_stubProc.setMode(ConsoleProcess::Debug); - #else - m_stubProc.setMode(ConsoleProcess::Debug); - m_stubProc.setSettings(ICore::settings()); - #endif - } - connect(action(AutoDerefPointers), &SavedAction::valueChanged, this, &LldbEngine::updateLocals); connect(action(CreateFullBacktrace), &QAction::triggered, @@ -193,6 +180,17 @@ bool LldbEngine::prepareCommand() void LldbEngine::setupEngine() { if (runParameters().useTerminal) { + #ifdef Q_OS_WIN + // Windows up to xp needs a workaround for attaching to freshly started processes. see proc_stub_win + if (QSysInfo::WindowsVersion >= QSysInfo::WV_VISTA) + m_stubProc.setMode(ConsoleProcess::Suspend); + else + m_stubProc.setMode(ConsoleProcess::Debug); + #else + m_stubProc.setMode(ConsoleProcess::Debug); + m_stubProc.setSettings(ICore::settings()); + #endif + QTC_ASSERT(state() == EngineSetupRequested, qDebug() << state()); showMessage(_("TRYING TO START ADAPTER")); From 8ddce2fbd406baaf949dd97e3c05b240169a3949 Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 30 May 2016 15:33:29 +0200 Subject: [PATCH 14/16] Debugger: Disable Run in Terminal with LLDB globally This forcefully ignores the Run in Terminal setting, i.e. debugger starts up properly, but without the console. It a stop-gap measure deemed less harmful than the 4.0 'start up gets stuck' behavior. Change-Id: I015147c4db23bf91ea09001ce923fbab97eeae77 Reviewed-by: Eike Ziller --- src/plugins/debugger/lldb/lldbengine.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/plugins/debugger/lldb/lldbengine.cpp b/src/plugins/debugger/lldb/lldbengine.cpp index 38d89a57924..f4dfe9938e8 100644 --- a/src/plugins/debugger/lldb/lldbengine.cpp +++ b/src/plugins/debugger/lldb/lldbengine.cpp @@ -179,7 +179,15 @@ bool LldbEngine::prepareCommand() void LldbEngine::setupEngine() { + // FIXME: We can't handle terminals yet. if (runParameters().useTerminal) { + qWarning("Run in Terminal is not supported yet with the LLDB backend"); + showMessage(tr("Run in Terminal is not supported yet with the LLDB backend"), AppError); + runParameters().useTerminal = false; + } + + if (runParameters().useTerminal) { + QTC_CHECK(false); // See above. #ifdef Q_OS_WIN // Windows up to xp needs a workaround for attaching to freshly started processes. see proc_stub_win if (QSysInfo::WindowsVersion >= QSysInfo::WV_VISTA) From 7eca0803d94f4a14107432cd10886e92fbceffa7 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Tue, 31 May 2016 09:31:58 +0300 Subject: [PATCH 15/16] Update qbs submodule. To HEAD of 1.5 branch. Change-Id: If6cfb3db0150ae6d49391996a6f2a279990e130b Reviewed-by: Christian Kandeler --- src/shared/qbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared/qbs b/src/shared/qbs index 1cfa5ed52c2..9d28325c404 160000 --- a/src/shared/qbs +++ b/src/shared/qbs @@ -1 +1 @@ -Subproject commit 1cfa5ed52c2cdfaf0a0a6b12a1f41bce0a9a67e1 +Subproject commit 9d28325c404a87757c61b7dba10f54b43c28cd11 From 7d51d3849abeb3adaaeed9988694a38d7008a848 Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Mon, 30 May 2016 17:59:11 +0200 Subject: [PATCH 16/16] Squish: Silence more warnings Change-Id: I6259382a2359a795654a6d6536112c090ede130f Reviewed-by: Christian Stenger --- tests/system/shared/qtcreator.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/system/shared/qtcreator.py b/tests/system/shared/qtcreator.py index 265fa10107b..b33d5f6170d 100644 --- a/tests/system/shared/qtcreator.py +++ b/tests/system/shared/qtcreator.py @@ -118,7 +118,8 @@ def waitForCleanShutdown(timeOut=10): if not shutdownDone and datetime.utcnow() > endtime: break if platform.system() == 'Linux' and JIRA.isBugStillOpen(15749): - pgrepOutput = getOutputFromCmdline(["pgrep", "-f", "qtcreator_process_stub"]) + pgrepOutput = getOutputFromCmdline(["pgrep", "-f", "qtcreator_process_stub"], + acceptedError=1) pids = pgrepOutput.splitlines() if len(pids): print("Killing %d qtcreator_process_stub instances" % len(pids))