command-class as abstraction for executing git-commands.
This commit is contained in:
		
							
								
								
									
										73
									
								
								process/command.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								process/command.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,73 @@ | ||||
| #include "command.h" | ||||
|  | ||||
| #include <QProcess> | ||||
| #include <QDebug> | ||||
| #include <QRegularExpression> | ||||
|  | ||||
| Command::Command(QString const &command, int start_timeout, int finish_timeout) | ||||
|     : m_command(command.trimmed()) | ||||
|     , m_commandResult("") | ||||
|     , m_waitForStartTimeout(start_timeout) | ||||
|     , m_waitForFinishTimeout(finish_timeout) { | ||||
| } | ||||
|  | ||||
| QString Command::getCommandResult() const { | ||||
|     return m_commandResult; | ||||
| } | ||||
|  | ||||
| void Command::readyReadStandardOutput() { | ||||
|     QProcess *p = (QProcess *)sender(); | ||||
|     m_commandResult += p->readAllStandardOutput(); | ||||
|     // qCritical() << m_commandResult; | ||||
| } | ||||
|  | ||||
| void Command::readyReadStandardError() { | ||||
|     QProcess *p = (QProcess *)sender(); | ||||
|     QByteArray buf = p->readAllStandardError(); | ||||
|     qCritical() << buf; | ||||
| } | ||||
|  | ||||
| void Command::finished(int /*exitCode*/, QProcess::ExitStatus /*exitStatus*/) { | ||||
|     QProcess *p = (QProcess *)sender(); | ||||
|     // read all remaining data sent to the process, just in case | ||||
|     QString d = p->readAllStandardOutput(); | ||||
|     if (!d.isEmpty()) { | ||||
|         m_commandResult += d; | ||||
|     } | ||||
|     disconnect(p, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(readyReadStandardOutput())); | ||||
|     disconnect(p, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(readyReadStandardError())); | ||||
| } | ||||
|  | ||||
| bool Command::execute(QString workingDirectory) { | ||||
|     QScopedPointer<QProcess> p(new QProcess(this)); | ||||
|     p->setProcessChannelMode(QProcess::MergedChannels); | ||||
|  | ||||
|     connect(&(*p), SIGNAL(readyReadStandardOutput()), this, SLOT(readyReadStandardOutput())); | ||||
|     connect(&(*p), SIGNAL(readyReadStandardError()), this, SLOT(readyReadStandardError())); | ||||
|  | ||||
|     p->setWorkingDirectory(workingDirectory); | ||||
|     p->start(m_command); | ||||
|  | ||||
|     if (p->waitForStarted(m_waitForStartTimeout)) { | ||||
|         if (p->state() == QProcess::ProcessState::Running) { | ||||
|             if (p->waitForFinished(m_waitForFinishTimeout)) { | ||||
|                 if (p->exitStatus() == QProcess::NormalExit) { | ||||
|                     qInfo() << "EXECUTED" << m_command | ||||
|                             << "with code" << p->exitCode(); | ||||
|                     // qInfo() << "RESULT" << m_commandResult; | ||||
|                     return true; | ||||
|                 } else { | ||||
|                     qCritical() << "PROCESS" << m_command << "CRASHED with code" | ||||
|                                 << p->exitCode(); | ||||
|                 } | ||||
|             } else { | ||||
|                 qCritical() << "PROCESS" << m_command << "DID NOT FINISH"; | ||||
|             } | ||||
|         } else { | ||||
|             qCritical() << "WRONG PROCESS STATE" << p->state(); | ||||
|         } | ||||
|     } else { | ||||
|         qCritical() << "PROCESS" << m_command << "TIMEOUT AT START"; | ||||
|     } | ||||
|     return false; | ||||
| } | ||||
							
								
								
									
										33
									
								
								process/command.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								process/command.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | ||||
| #ifndef COMMAND_H_INCLUDED | ||||
| #define COMMAND_H_INCLUDED | ||||
| #endif // COMMAND_H_INCLUDED | ||||
|  | ||||
| #include <QObject> | ||||
| #include <QCoreApplication> | ||||
| #include <QString> | ||||
| #include <QStringList> | ||||
| #include <QProcess> | ||||
|  | ||||
|  | ||||
| class Command : public QObject { | ||||
|     Q_OBJECT | ||||
|  | ||||
|     QString m_command; | ||||
|     QString m_commandResult; | ||||
|     int m_waitForStartTimeout; | ||||
|     int m_waitForFinishTimeout; | ||||
|  | ||||
| public: | ||||
|     explicit Command(QString const &command, | ||||
|                      int start_timeout = 100000, | ||||
|                      int finish_timeout = 100000); | ||||
|  | ||||
|     QString getCommandResult() const; | ||||
|  | ||||
|     bool execute(QString workingDirectory = QCoreApplication::applicationDirPath()); | ||||
|  | ||||
| private slots: | ||||
|     void readyReadStandardOutput(); | ||||
|     void readyReadStandardError(); | ||||
|     void finished(int exitCode, QProcess::ExitStatus exitStatus); | ||||
| }; | ||||
		Reference in New Issue
	
	Block a user