// SPDX-FileCopyrightText: 2024 - 2025 UnionTech Software Technology Co., Ltd.//// SPDX-License-Identifier: GPL-3.0-or-later#include "gitcommand.h"#include "common/util/qtcassert.h"#include <QProcess>#include <memory>class GitCommandPrivate : public QObject{public:struct Job{QString program;QStringList arguments;QString workspace;};explicit GitCommandPrivate(GitCommand *qq, const QString &workspace);void setupProcess(QProcess *process, const Job &job);void startAll();void startNextJob();void processDone();void readStandardOutput();void readStandardError();public:GitCommand *q;const QString workspace;QList<Job> jobList;std::unique_ptr<QProcess> process;int currentJob = 0;QStringList stdOut;QString stdErr;};GitCommandPrivate::GitCommandPrivate(GitCommand *qq, const QString &workspace): q(qq),workspace(workspace){}void GitCommandPrivate::setupProcess(QProcess *process, const Job &job){process->setArguments(job.arguments);if (!job.workspace.isEmpty())process->setWorkingDirectory(job.workspace);process->setProgram(job.program);}void GitCommandPrivate::startAll(){QTC_ASSERT(!jobList.isEmpty(), return );QTC_ASSERT(!process, return );currentJob = 0;startNextJob();}void GitCommandPrivate::startNextJob(){QTC_ASSERT(currentJob < jobList.count(), return );process.reset(new QProcess);connect(process.get(), &QProcess::readyReadStandardOutput, this, &GitCommandPrivate::readStandardOutput);connect(process.get(), &QProcess::readyReadStandardError, this, &GitCommandPrivate::readStandardError);#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))connect(process.get(), qOverload<int>(&QProcess::finished), this, &GitCommandPrivate::processDone);#elseconnect(process.get(), &QProcess::finished, this, &GitCommandPrivate::processDone);#endifsetupProcess(process.get(), jobList.at(currentJob));process->start();}void GitCommandPrivate::processDone(){++currentJob;const bool success = process->exitCode() == 0;if (currentJob < jobList.count() && success) {process.release()->deleteLater();startNextJob();return;}emit q->finished(process->exitCode());}void GitCommandPrivate::readStandardOutput(){stdOut << process->readAllStandardOutput();}void GitCommandPrivate::readStandardError(){stdErr += process->readAllStandardError();}GitCommand::GitCommand(const QString &workspace, QObject *parent): QObject(parent),d(new GitCommandPrivate(this, workspace)){}GitCommand::~GitCommand(){delete d;}void GitCommand::addJob(const QString &program, const QStringList &arguments){d->jobList.append({ program, arguments, d->workspace });}void GitCommand::start(){if (d->jobList.isEmpty())return;d->startAll();}void GitCommand::cancel(){if (!d->process)return;d->process->kill();d->process->waitForFinished();d->process.reset();}QStringList GitCommand::cleanedStdOut() const{return d->stdOut;}QString GitCommand::cleanedStdErr() const{return d->stdErr;}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。