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"