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"