From 7ce75bcc63b7de0db1854905bda8b900e3dc2ae5 Mon Sep 17 00:00:00 2001 From: kostas Date: Sun, 24 May 2015 17:44:01 +0000 Subject: [PATCH] Fuel now uses the http port that Fossil reports when starting the web ui. FossilOrigin-Name: 5c9a7defad9f6c77db2447df1d904e24001ec40e --- manifest | 18 +++++++------- manifest.uuid | 2 +- src/Fossil.cpp | 59 ++++++++++++++++++++++++++++++++++++++++++++-- src/Fossil.h | 8 +++++-- src/MainWindow.cpp | 12 ++-------- src/MainWindow.h | 1 - 6 files changed, 75 insertions(+), 25 deletions(-) diff --git a/manifest b/manifest index 78d6130..5c12c3b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fossil\sui\sport\sis\snow\soptional\n -D 2015-05-24T17:08:46.715 +C Fuel\snow\suses\sthe\shttp\sport\sthat\sFossil\sreports\swhen\sstarting\sthe\sweb\sui.\n +D 2015-05-24T17:44:01.161 F .travis.yml 77966888a81c4ceee1fcc79bce842c9667ad8a35 F debian/changelog eb4304dfcb6bb66850ec740838090eb50ce1249b F debian/compat b6abd567fa79cbe0196d093a067271361dc6ca8b @@ -196,12 +196,12 @@ F src/FileActionDialog.cpp fcaebf9986f789b3440d5390b3458ad5f86fe0c8 F src/FileActionDialog.h 15db1650b3a13d70bc338371e4c033c66e3b79ce F src/FileTableView.cpp 5ddf8c391c9a3ac449ec61fb1db837b577afeec2 F src/FileTableView.h 03e56d87c2d46411b9762b87f4d301619aaf18df -F src/Fossil.cpp 62b898eeaa8c664619a3c8ed01295ef287771f75 -F src/Fossil.h 651d2a1c052abe2804f9eff366bf2561dc54f7eb +F src/Fossil.cpp 0d4c50327a61c48506d2d45e28cd6f71f1697ea2 +F src/Fossil.h 31765ef57e20a860914372d56c024033b30aa765 F src/LoggedProcess.cpp 2a1e5c94bc1e57c8984563e66c210e43a14dc60c F src/LoggedProcess.h 85df7c635c807a5a0e8c4763f17a0752aaff7261 -F src/MainWindow.cpp 537c458f5b7ad78ee3b9ad2e8479cac2f6dd8ec3 -F src/MainWindow.h cfc19137172a9200cff2b68676cbb26c2611a7d8 +F src/MainWindow.cpp c25a7a4898b9fe80154d2cb7abb81bcafcd50dd6 +F src/MainWindow.h d398df5f8b27d7f1ccae6a7f1fd5ef2c2236002b F src/RevisionDialog.cpp 51065c65a07c118dd1a7363da4a55a135d1c6c9c F src/RevisionDialog.h b718c3009342eaabad39c8a11a253a4e4fef7a73 F src/SearchBox.cpp d4209c575baa9933e1ce5ed376e785b289a145ba @@ -224,7 +224,7 @@ F ui/FileActionDialog.ui 89bb4dc2d0b8adcd41adcb11ec65f2028a09a12d F ui/MainWindow.ui 22dc5cebf86223754dc8e0b14707b4cb81c95cc6 F ui/RevisionDialog.ui 27c3b98c665fec014a50cbf3352c0627f75e68cd F ui/SettingsDialog.ui 5aafd8784268ea7cd828330d4673500b8f38d6db -P 46641dde6cd75e57b23d7df78b9e06e3c1e38993 -R 3ce93b5fd6cc01079b013a2f74f1f2a5 +P 7ffecfc49aeb4ccb8b2972ac5c6eddd265d3b578 +R c614f64a06cb8d44d405228318daf9d9 U kostas -Z 288d5f9c12ff4d2d05a8c8b09dbdb7e7 +Z d1c35d582fe773add2faa8e714e12402 diff --git a/manifest.uuid b/manifest.uuid index 52e9f77..40633ee 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7ffecfc49aeb4ccb8b2972ac5c6eddd265d3b578 \ No newline at end of file +5c9a7defad9f6c77db2447df1d904e24001ec40e \ No newline at end of file diff --git a/src/Fossil.cpp b/src/Fossil.cpp index 5a23acc..148502e 100644 --- a/src/Fossil.cpp +++ b/src/Fossil.cpp @@ -1,7 +1,6 @@ #include "Fossil.h" #include #include -#include #include #include #include @@ -14,6 +13,9 @@ static const unsigned char UTF8_BOM[] = { 0xEF, 0xBB, 0xBF }; // 19: [5c46757d4b9765] on 2012-04-22 04:41:15 static const QRegExp REGEX_STASH("\\s*(\\d+):\\s+\\[(.*)\\] on (\\d+)-(\\d+)-(\\d+) (\\d+):(\\d+):(\\d+)", Qt::CaseInsensitive); +// Listening for HTTP requests on TCP port 8081 +static const QRegExp REGEX_PORT(".*TCP port ([0-9]+)\\n", Qt::CaseSensitive); + /////////////////////////////////////////////////////////////////////////////// RepoStatus Fossil::getRepoStatus() { @@ -1006,7 +1008,7 @@ bool Fossil::startUI(const QString &httpPort) if(!httpPort.isEmpty()) params << "-P" << httpPort; - fossilUI.start(params); + fossilUI.start(getFossilPath(), params); if(!fossilUI.waitForStarted() || fossilUI.state()!=QProcess::Running) { @@ -1014,6 +1016,50 @@ bool Fossil::startUI(const QString &httpPort) return false; } +#ifdef Q_OS_WIN + QTextCodec *codec = QTextCodec::codecForName("UTF-8"); +#else + QTextCodec *codec = QTextCodec::codecForLocale(); +#endif + + Q_ASSERT(codec); + QTextDecoder *decoder = codec->makeDecoder(); + Q_ASSERT(decoder); + + fossilUIPort.clear(); + + // Wait for fossil to report the http port + QString buffer; + while(true) + { + QProcess::ProcessState state = fossilUI.state(); + qint64 bytes_avail = fossilUI.logBytesAvailable(); + + if(state!=QProcess::Running && bytes_avail<1) + break; + + QByteArray input; + fossilUI.getLogAndClear(input); + + buffer += decoder->toUnicode(input); + + // Normalize line endings + buffer = buffer.replace("\r\n", "\n"); + buffer = buffer.replace("\r", "\n"); + + int index = REGEX_PORT.indexIn(buffer); + if(index==-1) + { + QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents); + continue; + } + + // Extract port + fossilUIPort = REGEX_PORT.cap(1).trimmed(); + + // Done parsing + break; + } return true; } @@ -1029,4 +1075,13 @@ void Fossil::stopUI() #endif } fossilUI.close(); + fossilUIPort.clear(); +} + +//------------------------------------------------------------------------------ +QString Fossil::getUIHttpAddress() const +{ + if(fossilUIPort.isEmpty()) + return QString(); + return "http://127.0.0.1:"+fossilUIPort; } diff --git a/src/Fossil.h b/src/Fossil.h index 52be947..1925f3d 100644 --- a/src/Fossil.h +++ b/src/Fossil.h @@ -5,7 +5,7 @@ class QStringList; #include #include #include -#include +#include "LoggedProcess.h" #include "Utils.h" typedef QMap stashmap_t; @@ -125,6 +125,9 @@ public: const QString &getCurrentRevision() const { return currentRevision; } const QStringList &getCurrentTags() const { return currentTags; } + const QString &getUIHttpPort() const { return fossilUIPort; } + QString getUIHttpAddress() const; + private: void log(const QString &text, bool isHTML=false) { @@ -142,7 +145,8 @@ private: QString projectName; QString currentRevision; QStringList currentTags; - QProcess fossilUI; + LoggedProcess fossilUI; + QString fossilUIPort; }; diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 5b60317..02b50b0 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -1083,7 +1083,7 @@ void MainWindow::fossilBrowse(const QString &fossilUrl) bool use_internal = settings.GetValue(FUEL_SETTING_WEB_BROWSER).toInt() == 1; - QUrl url = QUrl(getFossilHttpAddress()+fossilUrl); + QUrl url = QUrl(fossil().getUIHttpAddress()+fossilUrl); if(use_internal) { @@ -1254,8 +1254,7 @@ void MainWindow::on_actionDiff_triggered() //------------------------------------------------------------------------------ bool MainWindow::startUI() { - QString port = settings.GetValue(FUEL_SETTING_HTTP_PORT).toString(); - bool started = fossil().startUI(port); + bool started = fossil().startUI(""); ui->actionFossilUI->setChecked(started); return started; } @@ -1724,13 +1723,6 @@ void MainWindow::on_actionViewAsFolders_triggered() updateFileView(); } -//------------------------------------------------------------------------------ -QString MainWindow::getFossilHttpAddress() -{ - QString port = settings.GetValue(FUEL_SETTING_HTTP_PORT).toString(); - return "http://127.0.0.1:"+port; -} - //------------------------------------------------------------------------------ void MainWindow::onWorkspaceTreeViewSelectionChanged(const QItemSelection &/*selected*/, const QItemSelection &/*deselected*/) { diff --git a/src/MainWindow.h b/src/MainWindow.h index dc63ae3..0517589 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -48,7 +48,6 @@ private: void rebuildRecent(); bool openWorkspace(const QString &path); void loadFossilSettings(); - QString getFossilHttpAddress(); void updateWorkspaceView(); void updateFileView(); void selectRootDir();