File indexing completed on 2024-05-05 16:46:01

0001 /*
0002     SPDX-FileCopyrightText: 2018 Daniel Mensinger <daniel@mensinger-ka.de>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "mesonjobprune.h"
0008 
0009 #include "mesonbuilder.h"
0010 #include "mesonconfig.h"
0011 
0012 #include <outputview/outputmodel.h>
0013 
0014 #include <KIO/DeleteJob>
0015 #include <KLocalizedString>
0016 
0017 #include <QDir>
0018 
0019 using namespace KDevelop;
0020 
0021 MesonJobPrune::MesonJobPrune(const Meson::BuildDir& buildDir, QObject* parent)
0022     : OutputJob(parent, Verbose)
0023     , m_buildDir(buildDir.buildDir)
0024     , m_backend(buildDir.mesonBackend)
0025 {
0026     setCapabilities(Killable);
0027     setToolTitle(i18n("Meson"));
0028     setStandardToolView(KDevelop::IOutputView::BuildView);
0029     setBehaviours(KDevelop::IOutputView::AllowUserClose | KDevelop::IOutputView::AutoScroll);
0030 }
0031 
0032 void MesonJobPrune::start()
0033 {
0034     auto* output = new OutputModel(this);
0035     setModel(output);
0036     startOutput();
0037 
0038     auto status = MesonBuilder::evaluateBuildDirectory(m_buildDir, m_backend);
0039 
0040     switch (status) {
0041     case MesonBuilder::DOES_NOT_EXIST:
0042     case MesonBuilder::CLEAN:
0043         output->appendLine(i18n("The directory '%1' is already pruned", m_buildDir.toLocalFile()));
0044         emitResult();
0045         return;
0046     case MesonBuilder::DIR_NOT_EMPTY:
0047     case MesonBuilder::INVALID_BUILD_DIR:
0048         output->appendLine(
0049             i18n("The directory '%1' does not appear to be a meson build directory", m_buildDir.toLocalFile()));
0050         output->appendLine(i18n("Aborting prune operation"));
0051         emitResult();
0052         return;
0053     case MesonBuilder::EMPTY_STRING:
0054         output->appendLine(
0055             i18n("The current build configuration is broken, because the build directory is not specified"));
0056         emitResult();
0057         return;
0058     default:
0059         break;
0060     }
0061 
0062     QDir d(m_buildDir.toLocalFile());
0063     QList<QUrl> urls;
0064     const auto entries = d.entryList(QDir::NoDotAndDotDot | QDir::Hidden | QDir::AllEntries);
0065     urls.reserve(entries.size());
0066     for (const auto& entry : entries) {
0067         urls << Path(m_buildDir, entry).toUrl();
0068     }
0069 
0070     output->appendLine(i18n("Deleting contents of '%1'", m_buildDir.toLocalFile()));
0071     m_job = KIO::del(urls);
0072     m_job->start();
0073 
0074     connect(m_job, &KJob::finished, this, [this, output](KJob* job) {
0075         if (job->error() == 0) {
0076             output->appendLine(i18n("** Prune successful **"));
0077         } else {
0078             output->appendLine(i18n("** Prune failed: %1 **", job->errorString()));
0079         }
0080         emitResult();
0081         m_job = nullptr;
0082     });
0083 }
0084 
0085 bool MesonJobPrune::doKill()
0086 {
0087     return m_job->kill();
0088 }
0089 
0090 #include "moc_mesonjobprune.cpp"