File indexing completed on 2024-05-05 04:39:01
0001 /* 0002 SPDX-FileCopyrightText: 2013-2014 Maciej Poleski 0003 0004 SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0005 */ 0006 0007 #include "diffjob.h" 0008 0009 #include <QDir> 0010 0011 #include <vcs/dvcs/dvcsjob.h> 0012 #include <vcs/vcsdiff.h> 0013 0014 #include "bazaarplugin.h" 0015 0016 using namespace KDevelop; 0017 0018 DiffJob::DiffJob(const QDir& workingDir, const QString& revisionSpecRange, 0019 const QUrl& fileOrDirectory, BazaarPlugin* parent, 0020 KDevelop::OutputJob::OutputJobVerbosity verbosity) 0021 : VcsJob(parent, verbosity), m_plugin(parent), 0022 m_status(KDevelop::VcsJob::JobNotStarted) 0023 { 0024 setType(KDevelop::VcsJob::Diff); 0025 setCapabilities(Killable); 0026 m_job = new KDevelop::DVcsJob(workingDir, parent, verbosity); 0027 m_job->setType(VcsJob::Diff); 0028 *m_job << "bzr" << "diff" << "-p1" << revisionSpecRange << fileOrDirectory; 0029 } 0030 0031 KDevelop::IPlugin* DiffJob::vcsPlugin() const 0032 { 0033 return m_plugin; 0034 } 0035 0036 KDevelop::VcsJob::JobStatus DiffJob::status() const 0037 { 0038 return m_status; 0039 } 0040 0041 QVariant DiffJob::fetchResults() 0042 { 0043 return m_result; 0044 } 0045 0046 void DiffJob::start() 0047 { 0048 if (m_status != KDevelop::VcsJob::JobNotStarted) 0049 return; 0050 if (m_job) { 0051 connect(m_job.data(), &DVcsJob::finished, this, &DiffJob::prepareResult); 0052 m_status = KDevelop::VcsJob::JobRunning; 0053 m_job->start(); 0054 } 0055 } 0056 0057 bool DiffJob::doKill() 0058 { 0059 m_status = KDevelop::VcsJob::JobCanceled; 0060 if (m_job) 0061 return m_job->kill(KJob::Quietly); 0062 else 0063 return true; 0064 } 0065 0066 void DiffJob::prepareResult(KJob*) 0067 { 0068 if (m_job->process()->exitStatus() == QProcess::NormalExit) { 0069 KDevelop::VcsDiff diff; 0070 diff.setDiff(m_job->output()); 0071 diff.setBaseDiff(QUrl::fromLocalFile(m_job->directory().absolutePath())); 0072 m_result.setValue(diff); 0073 m_status = KDevelop::VcsJob::JobSucceeded; 0074 } else { 0075 setError(m_job->process()->exitStatus()); 0076 m_status = KDevelop::VcsJob::JobFailed; 0077 } 0078 emitResult(); 0079 emit resultsReady(this); 0080 } 0081 0082 #include "moc_diffjob.cpp"