File indexing completed on 2024-05-19 04:47:11

0001 #include "actionrunner.h"
0002 #include <libkommit/commands/abstractcommand.h>
0003 
0004 #include <KI18n/KLocalizedString>
0005 
0006 #include <QDebug>
0007 
0008 ActionRunner::ActionRunner(const QString &workingDir, QObject *parent) : QObject(parent)
0009   , mGitProcess(new QProcess{this})
0010 {
0011     mGitProcess->setProgram(QStringLiteral("git"));
0012     mGitProcess->setWorkingDirectory(workingDir);
0013 
0014     connect(mGitProcess, &QProcess::readyReadStandardOutput, this, &ActionRunner::readyReadStandardOutput);
0015     connect(mGitProcess, &QProcess::readyReadStandardError, this, &ActionRunner::readyReadStandardError);
0016 
0017     connect(mGitProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, &ActionRunner::finished);
0018 
0019 }
0020 
0021 ActionRunner::~ActionRunner()
0022 {
0023     if(mCmd)
0024         mCmd->deleteLater();
0025 }
0026 
0027 void ActionRunner::run(Git::AbstractCommand *command)
0028 {
0029     if(!command)
0030         return;
0031 
0032     mMode = RunByCommand;
0033 
0034     mCmd = command;
0035     const auto args = command->generateArgs();
0036     mGitProcess->setArguments(args);
0037 
0038     qDebug() << "Running action as << " << mGitProcess->program() << mGitProcess->arguments();
0039     mGitProcess->start();
0040 }
0041 
0042 void ActionRunner::run(const QStringList &args)
0043 {
0044     mMode = RunByArgs;
0045     mGitProcess->setArguments(args);
0046     mGitProcess->start();
0047 }
0048 
0049 void ActionRunner::readyReadStandardOutput()
0050 {
0051     const auto buffer = mGitProcess->readAllStandardOutput();
0052     mErrorOutput.append(buffer);
0053 
0054     if (mCmd && mCmd->supportProgress())
0055         mCmd->parseOutputSection(buffer, QByteArray());
0056 
0057 }
0058 
0059 void ActionRunner::readyReadStandardError()
0060 {
0061     const auto buffer = mGitProcess->readAllStandardError();
0062     mStandardOutput.append(buffer);
0063 
0064     if (mCmd && mCmd->supportProgress())
0065         mCmd->parseOutputSection(QByteArray(), buffer);
0066 
0067 }
0068 
0069 void ActionRunner::finished(int exitCode, QProcess::ExitStatus exitStatus)
0070 {
0071     Q_UNUSED(exitCode)
0072 
0073     if (mCmd)
0074         mCmd->parseOutputSection(mStandardOutput, mErrorOutput);
0075 
0076     bool isSuccessful = false;
0077 
0078     if (mCmd)
0079         isSuccessful = mCmd->status() != Git::AbstractCommand::Status::Error;
0080     else
0081         isSuccessful = exitStatus == QProcess::NormalExit;
0082 
0083     QString exitMessage;
0084 
0085     if (isSuccessful)
0086     {
0087         //        exitMessage = i18n("Process finished");
0088         exitMessage = mStandardOutput;
0089     } else
0090     {
0091         if (mCmd)
0092             exitMessage = mCmd->errorMessage();
0093         else
0094 //            exitMessage = i18n("The git process crashed");
0095         exitMessage = mStandardOutput;
0096     }
0097 
0098     Q_EMIT actionFished(isSuccessful, exitMessage);
0099 
0100 }