diff --git a/logic/updater/DownloadUpdateTask.cpp b/logic/updater/DownloadUpdateTask.cpp index b017afeb3..6157608f7 100644 --- a/logic/updater/DownloadUpdateTask.cpp +++ b/logic/updater/DownloadUpdateTask.cpp @@ -377,6 +377,9 @@ DownloadUpdateTask::processFileLists(NetJob *job, // yep. this file actually needs an upgrade. PROCEED. QLOG_DEBUG() << "Found file" << entry.path << " that needs updating."; + // if it's the updater we want to treat it separately + bool isUpdater = entry.path.endsWith("updater") || entry.path.endsWith("updater.exe"); + // Go through the sources list and find one to use. // TODO: Make a NetAction that takes a source list and tries each of them until one // works. For now, we'll just use the first http one. @@ -398,10 +401,19 @@ DownloadUpdateTask::processFileLists(NetJob *job, auto download = MD5EtagDownload::make(source.url, dlPath); download->m_expected_md5 = entry.md5; job->addNetAction(download); + + if (isUpdater) + { + download->setProperty("finalPath", entry.path); + connect(download.get(), &MD5EtagDownload::succeeded, this, &DownloadUpdateTask::directDeployFile); + } } - // Now add a copy operation to our operations list to install the file. - ops.append(UpdateOperation::CopyOp(dlPath, entry.path, entry.mode)); + if (!isUpdater) + { + // Now add a copy operation to our operations list to install the file. + ops.append(UpdateOperation::CopyOp(dlPath, entry.path, entry.mode)); + } } } } @@ -512,6 +524,21 @@ void DownloadUpdateTask::fileDownloadProgressChanged(qint64 current, qint64 tota setProgress((int)(((float)current / (float)total) * 100)); } +void DownloadUpdateTask::directDeployFile(const int index) +{ + Md5EtagDownloadPtr download = std::dynamic_pointer_cast(m_filesNetJob->operator[](index)); + const QString finalPath = download->property("finalPath").toString(); + QLOG_INFO() << "Replacing" << finalPath << "with" << download->m_output_file.fileName(); + if (QFile::remove(finalPath)) + { + if (download->m_output_file.copy(finalPath)) + { + return; + } + } + emitFailed("Couldn't copy updater files"); +} + QString DownloadUpdateTask::updateFilesDir() { return m_updateFilesDir.path(); diff --git a/logic/updater/DownloadUpdateTask.h b/logic/updater/DownloadUpdateTask.h index 1fc140496..79d73af33 100644 --- a/logic/updater/DownloadUpdateTask.h +++ b/logic/updater/DownloadUpdateTask.h @@ -207,5 +207,7 @@ protected slots: void fileDownloadFinished(); void fileDownloadFailed(); void fileDownloadProgressChanged(qint64 current, qint64 total); + + void directDeployFile(const int index); };