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"