File indexing completed on 2024-04-14 05:34:15

0001 /*
0002     SPDX-FileCopyrightText: 2011 Vishesh Yadav <vishesh3y@gmail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "servewrapper.h"
0008 #include "hgwrapper.h"
0009 
0010 #include <QTextCodec>
0011 
0012 HgServeWrapper *HgServeWrapper::m_instance = nullptr;
0013 
0014 HgServeWrapper::HgServeWrapper(QObject *parent) :
0015     QObject(parent)
0016 {
0017 }
0018 
0019 HgServeWrapper::~HgServeWrapper()
0020 {
0021     QMutableHashIterator<QString, ServerProcessType*> it(m_serverList);
0022     while (it.hasNext()) {
0023         it.next();
0024         ///terminate server if not terminated already
0025         if (it.value()->process.state() != QProcess::NotRunning) {
0026             it.value()->process.terminate();
0027         }
0028         it.value()->deleteLater();
0029         it.remove();
0030     }
0031 }
0032 
0033 HgServeWrapper *HgServeWrapper::instance()
0034 {
0035     if (m_instance == nullptr) {
0036         m_instance = new HgServeWrapper;
0037     }
0038     return m_instance;
0039 }
0040 
0041 void HgServeWrapper::startServer(const QString &repoLocation, int portNumber)
0042 {
0043     ServerProcessType *server = m_serverList.value(repoLocation, nullptr);
0044     if (server != nullptr) {
0045         m_serverList.remove(repoLocation);
0046         server->deleteLater();
0047     }
0048     server = new ServerProcessType;
0049     m_serverList.insert(repoLocation, server);
0050     server->port = portNumber;
0051     server->process.setWorkingDirectory(HgWrapper::instance()->getBaseDir());
0052 
0053     connect(&server->process, &QProcess::started,
0054             this, &HgServeWrapper::started);
0055     connect(&server->process, &QProcess::finished,
0056             this, &HgServeWrapper::slotFinished);
0057     connect(server, &ServerProcessType::readyReadLine,
0058             this, &HgServeWrapper::readyReadLine);
0059 
0060     QStringList args;
0061     args << QLatin1String("-oL");
0062     args << QLatin1String("hg");
0063     args << QLatin1String("serve");
0064     args << QLatin1String("--port");
0065     args << QString::number(portNumber);
0066     server->process.start(QLatin1String("stdbuf"), args);
0067     Q_EMIT readyReadLine(repoLocation,
0068             i18n("## Starting Server ##"));
0069     Q_EMIT readyReadLine(repoLocation,
0070             QStringLiteral("% hg serve --port %1").arg(portNumber));
0071 }
0072 
0073 void HgServeWrapper::stopServer(const QString &repoLocation)
0074 {
0075     ServerProcessType *server = m_serverList.value(repoLocation, nullptr);
0076     if (server == nullptr) {
0077         return;
0078     }
0079     server->process.terminate();
0080 }
0081 
0082 bool HgServeWrapper::running(const QString &repoLocation)
0083 {
0084     ServerProcessType *server = m_serverList.value(repoLocation, nullptr);
0085     if (server == nullptr) {
0086         return false;
0087     }
0088     return ( server->process.state() == QProcess::Running || 
0089              server->process.state() == QProcess::Starting);
0090 }
0091 
0092 void HgServeWrapper::slotFinished(int exitCode, QProcess::ExitStatus status)
0093 {
0094     if (exitCode == 0 && status == QProcess::NormalExit) {
0095         Q_EMIT finished();
0096     }
0097     else {
0098         Q_EMIT error();
0099     }
0100 }
0101 
0102 QString HgServeWrapper::errorMessage(const QString &repoLocation)
0103 {
0104     ServerProcessType *server = m_serverList.value(repoLocation, nullptr);
0105     if (server == nullptr) {
0106         return QString();
0107     }
0108     return QTextCodec::codecForLocale()->toUnicode(server->process.readAllStandardError());
0109 }
0110 
0111 bool HgServeWrapper::normalExit(const QString &repoLocation)
0112 {
0113     ServerProcessType *server = m_serverList.value(repoLocation, nullptr);
0114     if (server == nullptr) {
0115         return true;
0116     }
0117 
0118     return (server->process.exitStatus() == QProcess::NormalExit &&
0119             server->process.exitCode() == 0);
0120 }
0121 
0122 void HgServeWrapper::cleanUnused()
0123 {
0124     QMutableHashIterator<QString, ServerProcessType*> it(m_serverList);
0125     while (it.hasNext()) {
0126         it.next();
0127         if (it.value()->process.state() == QProcess::NotRunning) {
0128             it.value()->deleteLater();
0129             it.remove();
0130         }
0131     }
0132 }
0133 
0134 
0135 
0136 #include "moc_servewrapper.cpp"