# # # patch "src/monotone/Monotone.cpp" # from [a3f588aa9e112d4eddfa892a14d91fa23cec4ea1] # to [5887181e169a0306a9a1a4d2d05fcc5a72515898] # # patch "src/monotone/Monotone.h" # from [25860d5a6a916ffcefd83275f203bd3d49be55ac] # to [370ce5b4d643260e775d5c2c54cbd419c8a11885] # # patch "src/monotone/MonotoneDelegate.cpp" # from [97e18875b8b50bf0d64b6e5d6bedfba1c77a24e6] # to [36c972ed15f2ba8c7c21585b9a8ec0db32455098] # # patch "src/monotone/MonotoneDelegate.h" # from [907a718c030f96ed3c2951e5b5b1442b72b6891a] # to [466b3b5eedc5747f9fca4b02721042b8c2b78175] # ============================================================ --- src/monotone/Monotone.cpp a3f588aa9e112d4eddfa892a14d91fa23cec4ea1 +++ src/monotone/Monotone.cpp 5887181e169a0306a9a1a4d2d05fcc5a72515898 @@ -383,7 +383,7 @@ bool Monotone::executeCommand(const Byte } commandNumber = writeStdin(command, options); - SignalWaiter waiter(this, SIGNAL(commandFinished())); + SignalWaiter waiter(this, SIGNAL(commandFinished(int))); do { @@ -520,7 +520,7 @@ void Monotone::readAndParseStdout() { // remember the return value of the command completedCommands.insert(commandNumber, returnCode); - emit commandFinished(); + emit commandFinished(commandNumber); } } ============================================================ --- src/monotone/Monotone.h 25860d5a6a916ffcefd83275f203bd3d49be55ac +++ src/monotone/Monotone.h 370ce5b4d643260e775d5c2c54cbd419c8a11885 @@ -100,7 +100,7 @@ class Monotone : public QObject void processError(QProcess::ProcessError); signals: - void commandFinished(); + void commandFinished(int); }; #endif ============================================================ --- src/monotone/MonotoneDelegate.cpp 97e18875b8b50bf0d64b6e5d6bedfba1c77a24e6 +++ src/monotone/MonotoneDelegate.cpp 36c972ed15f2ba8c7c21585b9a8ec0db32455098 @@ -24,11 +24,18 @@ MonotoneDelegate::MonotoneDelegate(Autom #include "BasicIOParser.h" MonotoneDelegate::MonotoneDelegate(AutomateCommand * cmd) - : cmdModel(cmd), commandNumber(-1) + : cmdModel(cmd) { } -MonotoneDelegate::~MonotoneDelegate() {} +MonotoneDelegate::~MonotoneDelegate() +{ + int cnt = commandNumbers.size(); + if (cnt > 0) + { + W(QString("%1 pending commands").arg(cnt)); + } +} bool MonotoneDelegate::triggerCommand(const QStringList & cmd) { @@ -41,35 +48,40 @@ bool MonotoneDelegate::triggerCommand(co Q_ASSERT(obj); Monotone * mtn = MTN(obj); - connect( - mtn, SIGNAL(commandFinished()), - this, SLOT(commandFinished()) - ); - - APP->setOverrideCursor(Qt::WaitCursor); - - return mtn->triggerCommand(cmd, opts, commandNumber); + int cmdNum; + if (mtn->triggerCommand(cmd, opts, cmdNum)) + { + if (commandNumbers.size() == 0) + { + APP->setOverrideCursor(Qt::WaitCursor); + + connect( + mtn, SIGNAL(commandFinished(int)), + this, SLOT(commandFinished(int)) + ); + } + + commandNumbers.insert(cmdNum); + + return true; + } + + return false; } // FIXME: if a request is aborted, commandFinished is never signalled, // do we need to take care of that here? -void MonotoneDelegate::commandFinished() +void MonotoneDelegate::commandFinished(int cmdNum) { + if (!commandNumbers.contains(cmdNum)) return; + QObject * obj = dynamic_cast(cmdModel); Q_ASSERT(obj); Monotone * mtn = MTN(obj); - // check if this is the command which is interesting for us - if (!mtn->isCommandFinished(commandNumber)) return; - - disconnect( - mtn, SIGNAL(commandFinished()), - this, SLOT(commandFinished()) - ); - // FIXME: does any of our models ever need the raw data? - cmdModel->setAutomateData(mtn->getDecodedData(commandNumber)); - int returnCode = mtn->getReturnCode(commandNumber); + cmdModel->setAutomateData(mtn->getDecodedData(cmdNum)); + int returnCode = mtn->getReturnCode(cmdNum); if (returnCode == 0) { @@ -79,11 +91,21 @@ void MonotoneDelegate::commandFinished() { if (!cmdModel->handleError(returnCode)) { - qCritical("MonotoneDelegate::commandFinished: couldn't handle error %d", returnCode); + C(QString("Couldn't handle error %1").arg(returnCode)); } } - - APP->restoreOverrideCursor(); + + commandNumbers.remove(cmdNum); + + if (commandNumbers.size() == 0) + { + disconnect( + mtn, SIGNAL(commandFinished(int)), + this, SLOT(commandFinished(int)) + ); + + APP->restoreOverrideCursor(); + } } QString MonotoneDelegate::getBaseWorkspaceRevision(QObject * obj) ============================================================ --- src/monotone/MonotoneDelegate.h 907a718c030f96ed3c2951e5b5b1442b72b6891a +++ src/monotone/MonotoneDelegate.h 466b3b5eedc5747f9fca4b02721042b8c2b78175 @@ -25,6 +25,7 @@ #include "vocab.h" #include +#include class MonotoneDelegate : public QObject @@ -49,10 +50,10 @@ private: private: AutomateCommand * cmdModel; - int commandNumber; + QSet commandNumbers; private slots: - void commandFinished(); + void commandFinished(int); }; #endif