File indexing completed on 2024-05-19 04:48:24

0001 #include "processmanager.h"
0002 #include <QProcess>
0003 #include <QDir>
0004 #include <QDebug>
0005 
0006 #include "cmakeproject.h"
0007 
0008 #include "processes/configureprocess.h"
0009 #include "cmakeprojectmanager.h"
0010 #include "cmakeprojectmanager.h"
0011 #include "projectpreferences.h"
0012 #include "projectmanager.h"
0013 #include "cmakeprojecttarget.h"
0014 
0015 #include <MauiKit3/FileBrowsing/fmstatic.h>
0016 
0017 ProcessManager::ProcessManager(CMakeProject *project) : QObject(project)
0018 ,m_project(project)
0019 ,m_configureProcess(new ConfigureProcess(project->manager ()))
0020 ,m_buildProcess(new QProcess(this))
0021 ,m_deployProcess(new QProcess())
0022 {
0023 
0024       m_deployProcess->setReadChannel(QProcess::StandardOutput);
0025       m_deployProcess->setProcessChannelMode (QProcess:: ForwardedChannels);
0026   // Configure Process
0027   connect(m_configureProcess, &QProcess::readyReadStandardOutput,[this]()
0028   {
0029       //        qWarning() << "Configure output" << m_configureProcess->readAllStandardOutput();
0030       emit this->outputLine(m_configureProcess->readAllStandardOutput());
0031     });
0032 
0033   connect(m_configureProcess, &QProcess::readyReadStandardError, [this](){
0034       emit this->outputLine(m_buildProcess->readAllStandardError());
0035   });
0036 
0037   connect(m_configureProcess, &QProcess::started,[this]()
0038   {
0039       qWarning() << "Configure step started" ;
0040       m_infoLabel = "Configuring project...";
0041       emit this->infoLabelChanged(m_infoLabel);
0042 
0043       m_configureStatus = Status::Running;
0044       emit this->configureStatusChanged(m_configureStatus);
0045 
0046       m_processRunning = true;
0047       emit this->processRunningChanged(m_processRunning);
0048     });
0049 
0050   connect(m_configureProcess, &QProcess::errorOccurred,[this](QProcess::ProcessError error)
0051   {
0052     qWarning() << "Building error << " << error;
0053     m_configureStatus = Status::Error;
0054     emit this->configureStatusChanged (m_configureStatus);
0055 
0056     emit this->outputLine(m_configureProcess->errorString());
0057   });
0058 
0059   connect(m_configureProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), [this](int exitCode, QProcess::ExitStatus status)
0060   {
0061       qWarning() << "Configure step finished" << exitCode;
0062 
0063       if(status == QProcess::CrashExit)
0064         {
0065           m_infoLabel = QString("Error Configuring project:  %1").arg(m_configureProcess->errorString ());
0066 
0067           m_configureStatus = Status::Error;
0068 
0069           m_processRunning = false;
0070 
0071         }else
0072         {
0073           m_infoLabel = QString("Configuring finished with %1").arg(QString::number(exitCode));
0074 
0075           m_configureStatus = exitCode == 0 ? Status::Finished : Status::Error;
0076 
0077           m_processRunning = false;
0078         }
0079 
0080       emit this->configureStatusChanged(m_configureStatus);
0081       emit this->processRunningChanged(m_processRunning);
0082       emit this->infoLabelChanged(m_infoLabel);
0083 
0084     });
0085 
0086   // Build Process
0087   connect(m_buildProcess, &QProcess::readyReadStandardOutput,[this]()
0088   {
0089       //        qWarning() << "Build output" << m_buildProcess->readAllStandardOutput();
0090       emit this->outputLine(m_buildProcess->readAllStandardOutput());
0091     });
0092 
0093 
0094 
0095   connect(m_buildProcess, &QProcess::readyReadStandardError, [this](){
0096       emit this->outputLine(m_buildProcess->readAllStandardError());
0097   });
0098 
0099   connect(m_buildProcess, &QProcess::started,[this]()
0100   {
0101       qWarning() << "Build step started" ;
0102       m_infoLabel = "Building project...";
0103       emit this->infoLabelChanged(m_infoLabel);
0104 
0105       m_buildStatus = Status::Running;
0106       emit this->buildStatusChanged(m_buildStatus);
0107 
0108       m_processRunning = true;
0109       emit this->processRunningChanged(m_processRunning);
0110     });
0111 
0112   connect(m_buildProcess, &QProcess::errorOccurred,[this](QProcess::ProcessError error)
0113   {
0114     qWarning() << "Building error << " << error;
0115     m_buildStatus = Status::Error;
0116     emit this->buildStatusChanged (m_buildStatus);
0117 
0118     emit this->outputLine(m_buildProcess->errorString());
0119   });
0120 
0121   connect(m_buildProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), [this](int exitCode, QProcess::ExitStatus status)
0122   {
0123       if(status == QProcess::CrashExit)
0124         {
0125           m_infoLabel = QString("Error Bulding project:  %1").arg(m_buildProcess->errorString ());
0126 
0127           m_buildStatus = Status::Error;
0128 
0129           m_processRunning = false;
0130 
0131         }else
0132         {
0133           m_infoLabel = QString("Building finished with %1").arg(QString::number(exitCode));
0134 
0135           m_buildStatus = exitCode == 0 ? Status::Finished : Status::Error;
0136 
0137           m_processRunning = false;
0138         }
0139 
0140       emit this->buildStatusChanged (m_configureStatus);
0141       emit this->processRunningChanged(m_processRunning);
0142       emit this->infoLabelChanged(m_infoLabel);
0143 
0144     });
0145 
0146   // Run Process
0147   connect(m_deployProcess, &QProcess::readyReadStandardOutput,[this]()
0148   {
0149       //        qWarning() << "Run output" << m_deployProcess->readAllStandardOutput();
0150       emit this->outputLine(m_deployProcess->readAll());
0151 
0152     });
0153 
0154   connect(m_deployProcess, &QProcess::readyReadStandardError, [this](){
0155       emit this->outputLine(m_deployProcess->readAllStandardError());
0156   });
0157 
0158   connect(m_deployProcess, &QProcess::started,[this]()
0159   {
0160       qWarning() << "Running step started" ;
0161 
0162       m_infoLabel = "Running binary...";
0163       emit this->infoLabelChanged(m_infoLabel);
0164 
0165       m_deployStatus = Status::Running;
0166       emit this->deployStatusChanged(m_deployStatus);
0167 
0168       m_processRunning = true;
0169       emit this->processRunningChanged(m_processRunning);
0170     });
0171 
0172   connect(m_deployProcess, &QProcess::errorOccurred,[this](QProcess::ProcessError error)
0173   {
0174     qWarning() << "Running binary error << " << error;
0175     m_deployStatus = Status::Error;
0176     emit this->deployStatusChanged (m_deployStatus);
0177 
0178     emit this->outputLine(m_deployProcess->errorString());
0179   });
0180 
0181 
0182   connect(m_deployProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), [this](int exitCode, QProcess::ExitStatus status)
0183   {
0184       qWarning() << "Running step finished" << exitCode;
0185       if(status == QProcess::CrashExit)
0186         {
0187           m_infoLabel = QString("Error Deploying project:  %1").arg(m_deployProcess->errorString ());
0188 
0189           m_deployStatus = Status::Error;
0190 
0191           m_processRunning = false;
0192 
0193         }else
0194         {
0195           m_infoLabel = QString("Deploying finished with %1").arg(QString::number(exitCode));
0196 
0197           m_deployStatus = exitCode == 0 ? Status::Finished : Status::Error;
0198 
0199           m_processRunning = false;
0200         }
0201 
0202       emit this->deployStatusChanged (m_deployStatus);
0203       emit this->processRunningChanged(m_processRunning);
0204       emit this->infoLabelChanged(m_infoLabel);
0205     });
0206 }
0207 
0208 ProcessManager::~ProcessManager()
0209 {
0210   stopDeploy ();
0211   m_deployProcess->deleteLater ();
0212 }
0213 
0214 bool ProcessManager::processRunning() const
0215 {
0216   return m_processRunning;
0217 }
0218 
0219 ProcessManager::Status ProcessManager::configureStatus() const
0220 {
0221   return m_configureStatus;
0222 }
0223 
0224 ProcessManager::Status ProcessManager::buildStatus() const
0225 {
0226   return m_buildStatus;
0227 }
0228 
0229 ProcessManager::Status ProcessManager::deployStatus() const
0230 {
0231   return m_deployStatus;
0232 }
0233 
0234 bool ProcessManager::enabled() const
0235 {
0236   return m_enabled;
0237 }
0238 
0239 QString ProcessManager::infoLabel() const
0240 {
0241   return m_infoLabel;
0242 }
0243 
0244 void ProcessManager::build()
0245 {
0246   QMetaObject::Connection * const connection = new QMetaObject::Connection;
0247   *connection = connect(m_configureProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, [this, connection](int exitCode, QProcess::ExitStatus exitStatus)
0248   {
0249       qDebug() << "Configure step finished";
0250 
0251       if(exitStatus == QProcess::NormalExit)
0252         {
0253           qDebug() << "Configure step sucessfull, now build will start";
0254 
0255           buildStep();
0256         }else
0257         {
0258           qWarning() << "Configure step failed " << exitCode << exitStatus;
0259           qWarning() << "Build step can not continue.";
0260         }
0261 
0262       QObject::disconnect(*connection);
0263       delete connection;
0264     },  Qt::ConnectionType::UniqueConnection);
0265 
0266   configure();
0267 }
0268 
0269 void ProcessManager::configure()
0270 {
0271   configureStep();
0272 }
0273 
0274 void ProcessManager::deploy()
0275 {
0276   QMetaObject::Connection * const connection = new QMetaObject::Connection;
0277   *connection = connect(m_buildProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, [this, connection](int exitCode, QProcess::ExitStatus exitStatus)
0278   {
0279       qDebug() << "Build step finished";
0280 
0281       if(exitStatus == QProcess::NormalExit)
0282         {
0283           qDebug() << "Build step sucessfull, now run will start";
0284           deployStep();
0285         }else
0286         {
0287           qWarning() << "Build step failed " << exitCode << exitStatus;
0288           qWarning() << "Run step can not continue.";
0289         }
0290 
0291       QObject::disconnect(*connection);
0292       delete connection;
0293 
0294     }, Qt::ConnectionType::UniqueConnection);
0295 
0296   build();
0297 }
0298 
0299 void ProcessManager::stopBuild()
0300 {
0301   m_buildProcess->terminate();
0302   m_buildProcess->waitForFinished ();
0303 }
0304 
0305 void ProcessManager::stopConfigure()
0306 {
0307   m_configureProcess->terminate();
0308   m_configureProcess->waitForFinished ();
0309 }
0310 
0311 void ProcessManager::stopDeploy()
0312 {
0313   m_deployProcess->terminate();
0314   m_deployProcess->waitForFinished ();
0315 }
0316 
0317 void ProcessManager::buildStep()
0318 {
0319   m_buildProcess->setWorkingDirectory(m_project->manager ()->root ()->preferences ()->buildDir ().toLocalFile());
0320   m_buildProcess->start("make", QStringList());
0321 }
0322 
0323 void ProcessManager::configureStep()
0324 {
0325   m_configureProcess->prepare ();
0326 
0327   this->m_enabled = true;
0328   emit this->enabledChanged(m_enabled);
0329 
0330   m_configureProcess->start ();
0331 }
0332 
0333 void ProcessManager::deployStep()
0334 {
0335  qDebug() << "Execute:" <<  m_project->target ()->artifacts ().first ().toString ();
0336   m_deployProcess->start(m_project->target ()->artifacts ().first ().toString (), QStringList());
0337 }