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 }