# # # patch "src/monotone/MonotoneThread.cpp" # from [dd7c84f16493f3d7795ab2d1ed49e69a5b5f7818] # to [407f4b1892b30fcb4df4ea1b973fae7ab472caae] # # patch "src/monotone/MonotoneThread.h" # from [d6f3fa543d00b5ccf5677df4c8ceb759fdf30af3] # to [ffbb03ad32a7f67796baebb2453a8e66a330ac72] # # patch "src/monotone/MonotoneUtil.cpp" # from [b76e6c387a72f818d04d141c0de633da210026d5] # to [fd7e84d72293df5df40475b78e1d48c66c4db067] # ============================================================ --- src/monotone/MonotoneThread.cpp dd7c84f16493f3d7795ab2d1ed49e69a5b5f7818 +++ src/monotone/MonotoneThread.cpp 407f4b1892b30fcb4df4ea1b973fae7ab472caae @@ -153,6 +153,16 @@ bool MonotoneTask::outOfBandMessagesMatc return false; } +QString MonotoneTask::getLast(MessageType type) +{ + for (int i = oobMessages.size() - 1; i >= 0; i--) + { + if (oobMessages.at(i).first == type) + return oobMessages.at(i).second; + } + return QString(); +} + const int MonotoneThread::StdioBufferSize = 50 * 1024 * 1024; MonotoneThread::MonotoneThread( @@ -359,7 +369,7 @@ void MonotoneThread::run() { QByteArray errout = process->readAllStandardError(); QProcess::ProcessError error = process->error(); - + cleanup(process); emit aborted(threadNumber, error, QString::fromUtf8(errout)); return; ============================================================ --- src/monotone/MonotoneThread.h d6f3fa543d00b5ccf5677df4c8ceb759fdf30af3 +++ src/monotone/MonotoneThread.h ffbb03ad32a7f67796baebb2453a8e66a330ac72 @@ -64,6 +64,9 @@ public: //! returns true if one or more out-of-band messages match the given regex bool outOfBandMessagesMatch(MessageType, const QRegExp &); + //! returns the last out-of-band message of the given type + QString getLast(MessageType); + //! returns the command input stdio-encoded QByteArray getEncodedInput() const; ============================================================ --- src/monotone/MonotoneUtil.cpp b76e6c387a72f818d04d141c0de633da210026d5 +++ src/monotone/MonotoneUtil.cpp fd7e84d72293df5df40475b78e1d48c66c4db067 @@ -128,13 +128,14 @@ QString MonotoneUtil::getOption(const Wo return QString(); } - QString data = task->getDecodedOutput(); if (task->getReturnCode() > 0) { - C(QString("Couldn't retrieve option %1: %2").arg(opt).arg(data)); + C(QString("Couldn't retrieve option %1: %2") + .arg(opt).arg(task->getLast(MonotoneTask::Error))); return QString(); } + QString data = task->getDecodedOutput(); // remove the trailing newline data.chop(1); @@ -193,13 +194,14 @@ QStringList MonotoneUtil::resolveSelecto return QStringList(); } - QString data = task->getDecodedOutput(); if (task->getReturnCode() > 0) { - C(QString("Couldn't resolve selector %1: %2").arg(selector).arg(data)); + C(QString("Couldn't resolve selector %1: %2") + .arg(selector).arg(task->getLast(MonotoneTask::Error))); return QStringList(); } + QString data = task->getDecodedOutput(); QStringList revList = data.split('\n', QString::SkipEmptyParts); return revList; } @@ -214,19 +216,15 @@ RevisionCerts MonotoneUtil::getRevisionC return RevisionCerts(); } - QString data = task->getDecodedOutput(); if (task->getReturnCode() > 0) { - C(QString("Couldn't query revision certs for %1: %2").arg(revision).arg(data)); + C(QString("Couldn't query revision certs for %1: %2") + .arg(revision).arg(task->getLast(MonotoneTask::Error))); return RevisionCerts(); } - BasicIOParser parser(data); - if (!parser.parse()) - { - C("Could not parse basic_io."); - return RevisionCerts(); - } + BasicIOParser parser(task->getDecodedOutput()); + I(parser.parse()); RevisionCerts certs; StanzaList stanzas = parser.getStanzas(); @@ -263,19 +261,15 @@ FileEntryList MonotoneUtil::getRevisionM return FileEntryList(); } - QString data = task->getDecodedOutput(); if (task->getReturnCode() > 0) { - C(QString("Couldn't query manifest entries for %1: %2").arg(revision).arg(data)); + C(QString("Couldn't query manifest entries for %1: %2") + .arg(revision).arg(task->getLast(MonotoneTask::Error))); return FileEntryList(); } - BasicIOParser parser(data); - if (!parser.parse()) - { - C("Could not parse basic_io."); - return FileEntryList(); - } + BasicIOParser parser(task->getDecodedOutput()); + I(parser.parse()); // FIXME: this should go into a separate function / class FileEntryList entries; @@ -330,22 +324,17 @@ QMap MonotoneUtil::get return QMap(); } - QMap keys; - - QString data = task->getDecodedOutput(); if (task->getReturnCode() > 0) { - C(QString("Couldn't query keys: %1").arg(data)); - return keys; + C(QString("Couldn't query keys: %1") + .arg(task->getLast(MonotoneTask::Error))); + return QMap(); } - BasicIOParser parser(data); - if (!parser.parse()) - { - C("Could not parse basic_io."); - return keys; - } + BasicIOParser parser(task->getDecodedOutput()); + I(parser.parse()); + QMap keys; StanzaList stanzas = parser.getStanzas(); foreach (const Stanza & st, stanzas) { @@ -388,13 +377,14 @@ QString MonotoneUtil::getFileId(const Da return QString(); } - QString data = task->getDecodedOutput(); if (task->getReturnCode() > 0) { - C(QString("Couldn't identify path: %1").arg(data)); + C(QString("Couldn't identify path: %1") + .arg(task->getLast(MonotoneTask::Error))); return QString(); } + QString data = task->getDecodedOutput(); data.chop(1); return data; } @@ -409,13 +399,14 @@ QStringList MonotoneUtil::getRoots(const return QStringList(); } - QString data = task->getDecodedOutput(); if (task->getReturnCode() > 0) { - C(QString("Couldn't query roots: %1").arg(data)); + C(QString("Couldn't query roots: %1") + .arg(task->getLast(MonotoneTask::Error))); return QStringList(); } + QString data = task->getDecodedOutput(); return data.split('\n', QString::SkipEmptyParts); } @@ -433,13 +424,14 @@ QStringList MonotoneUtil::getCommonAnces return QStringList(); } - QString data = task->getDecodedOutput(); if (task->getReturnCode() > 0) { - C(QString("Couldn't query common ancestors: %1").arg(data)); + C(QString("Couldn't query common ancestors: %1") + .arg(task->getLast(MonotoneTask::Error))); return QStringList(); } + QString data = task->getDecodedOutput(); return data.split('\n', QString::SkipEmptyParts); } @@ -455,17 +447,17 @@ QStringList MonotoneUtil::getPreviousCon return QStringList(); } - QStringList revs; - - QString data = task->getDecodedOutput(); if (task->getReturnCode() > 0) { - C(QString("Couldn't query content marks for '%1' (%2)").arg(file).arg(startRev)); - return revs; + C(QString("Couldn't query content marks for '%1' (%2)") + .arg(file).arg(task->getLast(MonotoneTask::Error))); + return QStringList(); } - BasicIOParser parser(data); + BasicIOParser parser(task->getDecodedOutput()); I(parser.parse()); + + QStringList revs; foreach (const Stanza & st, parser.getStanzas()) { I(st.size() == 1); @@ -474,7 +466,6 @@ QStringList MonotoneUtil::getPreviousCon return revs; } - QStringList MonotoneUtil::topsortRevisions(const DatabaseFile & db, const QStringList & revs) { QStringList args; @@ -488,14 +479,15 @@ QStringList MonotoneUtil::topsortRevisio return QStringList(); } - QString data = task->getDecodedOutput(); if (task->getReturnCode() > 0) { - C(QString("Couldn't toposort revisions: %1").arg(data)); + C(QString("Couldn't toposort revisions: %1") + .arg(task->getLast(MonotoneTask::Error))); // return the list unchanged return revs; } + QString data = task->getDecodedOutput(); return data.split("\n", QString::SkipEmptyParts); } @@ -510,14 +502,14 @@ bool MonotoneUtil::getAttribute(const Wo return false; } - QString data = task->getDecodedOutput(); if (task->getReturnCode() > 0) { - C(QString("Couldn't run get_attributes: %1").arg(data)); + C(QString("Couldn't run get_attributes: %1") + .arg(task->getLast(MonotoneTask::Error))); return false; } - BasicIOParser parser(data); + BasicIOParser parser(task->getDecodedOutput()); I(parser.parse()); StanzaList stanzas = parser.getStanzas(); @@ -568,14 +560,14 @@ QMap MonotoneUtil::get QMap entries; - QString data = task->getDecodedOutput(); if (task->getReturnCode() > 0) { - C(QString("Couldn't run get_db_variables: %1").arg(data)); + C(QString("Couldn't run get_db_variables: %1") + .arg(task->getLast(MonotoneTask::Error))); return entries; } - BasicIOParser parser(data); + BasicIOParser parser(task->getDecodedOutput()); I(parser.parse()); StanzaList stanzas = parser.getStanzas();