File indexing completed on 2024-05-19 04:03:04

0001 /*
0002     SPDX-FileCopyrightText: 2010 Aleix Pol Gonzalez <aleixpol@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include <QJsonArray>
0008 #include <QStandardPaths>
0009 #include <QUrl>
0010 
0011 #include <KPluginFactory>
0012 
0013 #include "reviewboardjobs.h"
0014 
0015 #include "purpose/job.h"
0016 #include "purpose/pluginbase.h"
0017 
0018 class TheReviewboardJob : public Purpose::Job
0019 {
0020     Q_OBJECT
0021 public:
0022     TheReviewboardJob(QObject *object = nullptr)
0023         : Purpose::Job(object)
0024     {
0025     }
0026 
0027     void start() override
0028     {
0029         const QString baseDir(data().value(QLatin1String("baseDir")).toString());
0030         const QString repository(data().value(QLatin1String("repository")).toString());
0031         const QUrl sourceFile(data().value(QLatin1String("urls")).toArray().first().toString());
0032         const QString updateRR = data().value(QLatin1String("updateRR")).toString();
0033         const QJsonObject extraData = data().value(QLatin1String("extraData")).toObject();
0034         const QString username = data().value(QLatin1String("username")).toString();
0035         const QString password = data().value(QLatin1String("password")).toString();
0036         QUrl server(data().value(QLatin1String("server")).toString());
0037         server.setUserInfo(username + QLatin1Char(':') + password);
0038 
0039         KJob *job;
0040         if (!updateRR.isEmpty()) {
0041             job = new ReviewBoard::SubmitPatchRequest(server, sourceFile, baseDir, updateRR);
0042             connect(job, &KJob::finished, this, &TheReviewboardJob::reviewDone);
0043         } else {
0044             job = new ReviewBoard::NewRequest(server, repository);
0045             job->setProperty("extraData", extraData);
0046             connect(job, &KJob::finished, this, &TheReviewboardJob::reviewCreated);
0047         }
0048         job->setProperty("baseDir", baseDir);
0049         job->start();
0050     }
0051 
0052     void reviewCreated(KJob *j)
0053     {
0054         if (j->error() != 0) {
0055             setError(j->error());
0056             setErrorText(j->errorString());
0057             emitResult();
0058             return;
0059         }
0060 
0061         ReviewBoard::NewRequest const *job = qobject_cast<ReviewBoard::NewRequest *>(j);
0062 
0063         // This will provide things like groups and users for review from .reviewboardrc
0064         QVariantMap extraData = job->property("extraData").toMap();
0065         if (!extraData.isEmpty()) {
0066             KJob *updateJob = new ReviewBoard::UpdateRequest(job->server(), job->requestId(), extraData);
0067             updateJob->start();
0068         }
0069 
0070         // for git projects, m_source will be a VCSDiffPatchSource instance
0071         const QUrl sourceFile(data().value(QStringLiteral("urls")).toArray().first().toString());
0072         ReviewBoard::SubmitPatchRequest *submitPatchJob =
0073             new ReviewBoard::SubmitPatchRequest(job->server(), sourceFile, j->property("baseDir").toString(), job->requestId());
0074         connect(submitPatchJob, &ReviewBoard::SubmitPatchRequest::finished, this, &TheReviewboardJob::reviewDone);
0075         submitPatchJob->start();
0076     }
0077 
0078     void reviewDone(KJob *j)
0079     {
0080         if (j->error() != 0) {
0081             setError(j->error());
0082             setErrorText(j->errorString());
0083             emitResult();
0084             return;
0085         }
0086 
0087         ReviewBoard::SubmitPatchRequest const *job = qobject_cast<ReviewBoard::SubmitPatchRequest *>(j);
0088         QUrl url = job->server();
0089         url.setUserInfo(QString());
0090         QString requrl = QStringLiteral("%1/r/%2/").arg(url.toDisplayString(QUrl::PreferLocalFile), job->requestId());
0091         setOutput({{QStringLiteral("url"), requrl}});
0092         emitResult();
0093     }
0094 };
0095 
0096 class ReviewBoardPlugin : public Purpose::PluginBase
0097 {
0098     Q_OBJECT
0099 public:
0100     using PluginBase::PluginBase;
0101     Purpose::Job *createJob() const override
0102     {
0103         return new TheReviewboardJob;
0104     }
0105 };
0106 
0107 K_PLUGIN_CLASS_WITH_JSON(ReviewBoardPlugin, "reviewboardplugin.json")
0108 
0109 #include "reviewboardplugin.moc"