From e3fc0c49dd8ca4ef89221cb1104109b66214fd0f Mon Sep 17 00:00:00 2001 From: Levi Neely <141506390+lneely@users.noreply.github.com> Date: Sat, 1 Aug 2026 20:20:01 +0200 Subject: [PATCH] fix(gui): stop trimming lines before splitting by tab MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The previous fix stopped trimming the whole output but still called .trimmed() on each individual line, which stripped trailing tabs from empty-session lines like "testsession2\t\t\t\t\t". Now we split by tab directly without any trimming — empty fields stay as empty strings and the parts count stays at 6. --- gui/ollie9pclient.cpp | 44 ++++++++++++++++++++----------------------- 1 file changed, 20 insertions(+), 24 deletions(-) diff --git a/gui/ollie9pclient.cpp b/gui/ollie9pclient.cpp index 9bc6fe7..9ead609 100644 --- a/gui/ollie9pclient.cpp +++ b/gui/ollie9pclient.cpp @@ -87,23 +87,21 @@ void Ollie9pClient::setActiveSessionId(const QString &id) void Ollie9pClient::refreshSessions() { QByteArray out = run9p({"read", "session/idx"}); - // Don't trim the whole output — trailing tabs are significant fields + // Don't trim — trailing tabs are significant fields QString raw = QString::fromUtf8(out); m_sessions.clear(); if (!raw.isEmpty()) { for (const QString &line : raw.split('\n', Qt::SkipEmptyParts)) { - QString trimmed = line.trimmed(); - if (trimmed.isEmpty()) continue; - QStringList parts = trimmed.split('\t'); - if (parts.size() >= 2) { - QVariantMap session; - session["id"] = parts[0]; - session["state"] = parts[1]; - session["model"] = parts.size() > 2 ? parts[2] : ""; - session["agent"] = parts.size() > 3 ? parts[3] : ""; - m_sessions.append(session); - } + QStringList parts = line.split('\t'); + // Skip lines where the first field (session name) is empty + if (parts.isEmpty() || parts[0].isEmpty()) continue; + QVariantMap session; + session["id"] = parts[0]; + session["state"] = parts.size() > 1 ? parts[1] : ""; + session["model"] = parts.size() > 2 ? parts[2] : ""; + session["agent"] = parts.size() > 3 ? parts[3] : ""; + m_sessions.append(session); } } emit sessionsChanged(); @@ -541,23 +539,21 @@ void Ollie9pClient::onEventReadyRead() { // eventwait returned the full session index — use it directly QByteArray data = m_eventProc->readAllStandardOutput(); - // Don't trim the whole output — trailing tabs are significant fields + // Don't trim — trailing tabs are significant fields QString raw = QString::fromUtf8(data); m_sessions.clear(); if (!raw.isEmpty()) { for (const QString &line : raw.split('\n', Qt::SkipEmptyParts)) { - QString trimmed = line.trimmed(); - if (trimmed.isEmpty()) continue; - QStringList parts = trimmed.split('\t'); - if (parts.size() >= 2) { - QVariantMap session; - session["id"] = parts[0]; - session["state"] = parts[1]; - session["model"] = parts.size() > 2 ? parts[2] : ""; - session["agent"] = parts.size() > 3 ? parts[3] : ""; - m_sessions.append(session); - } + QStringList parts = line.split('\t'); + // Skip lines where the first field (session name) is empty + if (parts.isEmpty() || parts[0].isEmpty()) continue; + QVariantMap session; + session["id"] = parts[0]; + session["state"] = parts.size() > 1 ? parts[1] : ""; + session["model"] = parts.size() > 2 ? parts[2] : ""; + session["agent"] = parts.size() > 3 ? parts[3] : ""; + m_sessions.append(session); } } emit sessionsChanged();