void CleanFilesTask::run() { foreach(const QString &name, m_files) removeFileRecursion(QFileInfo(name), &m_errorMessage); if (!m_errorMessage.isEmpty()) { // Format and emit error. const QString msg = CleanDialog::tr("There were errors when cleaning the repository %1:"). arg(QDir::toNativeSeparators(m_repository)); m_errorMessage.insert(0, QLatin1Char('\n')); m_errorMessage.insert(0, msg); emit error(m_errorMessage); } // Run in background, need to delete ourselves this->deleteLater(); }
QScriptValue File::js_remove(QScriptContext *context, QScriptEngine *engine) { Q_UNUSED(engine); if (Q_UNLIKELY(context->argumentCount() < 1)) { return context->throwError(QScriptContext::SyntaxError, Tr::tr("remove expects 1 argument")); } const auto se = static_cast<ScriptEngine *>(engine); const DubiousContextList dubiousContexts({ DubiousContext(EvalContext::PropertyEvaluation) }); se->checkContext(QLatin1String("File.remove()"), dubiousContexts); QString fileName = context->argument(0).toString(); QString errorMessage; if (Q_UNLIKELY(!removeFileRecursion(QFileInfo(fileName), &errorMessage))) return context->throwError(errorMessage); return true; }
// Helper for recursively removing files. static void removeFileRecursion(const QFileInfo &f, QString *errorMessage) { // The version control system might list files/directory in arbitrary // order, causing files to be removed from parent directories. if (!f.exists()) return; if (f.isDir()) { const QDir dir(f.absoluteFilePath()); foreach(const QFileInfo &fi, dir.entryInfoList(QDir::AllEntries|QDir::NoDotAndDotDot|QDir::Hidden)) removeFileRecursion(fi, errorMessage); QDir parent = f.absoluteDir(); if (!parent.rmdir(f.fileName())) errorMessage->append(VCSBase::CleanDialog::tr("The directory %1 could not be deleted."). arg(QDir::toNativeSeparators(f.absoluteFilePath()))); return; } if (!QFile::remove(f.absoluteFilePath())) { if (!errorMessage->isEmpty()) errorMessage->append(QLatin1Char('\n')); errorMessage->append(VCSBase::CleanDialog::tr("The file %1 could not be deleted."). arg(QDir::toNativeSeparators(f.absoluteFilePath()))); } }