diff options
| author | Mehmet Samet Duman <yongdohyun@projecttick.org> | 2026-04-01 21:59:57 +0300 |
|---|---|---|
| committer | Mehmet Samet Duman <yongdohyun@projecttick.org> | 2026-04-01 21:59:57 +0300 |
| commit | 24c39fc544b75dc9c09f69c9cd4c6fba61bf6aac (patch) | |
| tree | 895daa60d9328e7fc964b0db151af7f415defffa /launcher/ui/dialogs/UpdateDialog.cpp | |
| parent | bf8a721e1d388d3320e32ae9ad4881f3245a2878 (diff) | |
| download | Project-Tick-24c39fc544b75dc9c09f69c9cd4c6fba61bf6aac.tar.gz Project-Tick-24c39fc544b75dc9c09f69c9cd4c6fba61bf6aac.zip | |
NOISSUE Refactor UpdateChecker and add standalone updater
- Removed unused member variables and methods from UpdateChecker.
- Improved update checking logic by parsing both RSS feed and GitHub releases.
- Introduced Installer class for handling update downloads and installations.
- Added support for various archive formats (.zip, .tar.gz) in Installer.
- Created meshmc-updater executable for standalone update operations.
- Updated CMake configuration to include new updater components.
Signed-off-by: Mehmet Samet Duman <yongdohyun@projecttick.org>
Diffstat (limited to 'launcher/ui/dialogs/UpdateDialog.cpp')
| -rw-r--r-- | launcher/ui/dialogs/UpdateDialog.cpp | 174 |
1 files changed, 22 insertions, 152 deletions
diff --git a/launcher/ui/dialogs/UpdateDialog.cpp b/launcher/ui/dialogs/UpdateDialog.cpp index d8a2df670c..75f3c395c8 100644 --- a/launcher/ui/dialogs/UpdateDialog.cpp +++ b/launcher/ui/dialogs/UpdateDialog.cpp @@ -21,170 +21,40 @@ #include "UpdateDialog.h" #include "ui_UpdateDialog.h" -#include <QDebug> -#include <QRegularExpression> #include "Application.h" -#include <settings/SettingsObject.h> -#include <Json.h> - #include "BuildConfig.h" -#include "HoeDown.h" -UpdateDialog::UpdateDialog(bool hasUpdate, QWidget *parent) : QDialog(parent), ui(new Ui::UpdateDialog) +UpdateDialog::UpdateDialog(bool hasUpdate, const UpdateAvailableStatus &status, QWidget *parent) + : QDialog(parent), ui(new Ui::UpdateDialog) { ui->setupUi(this); - auto channel = APPLICATION->settings()->get("UpdateChannel").toString(); - if(hasUpdate) - { - ui->label->setText(tr("A new %1 update is available!").arg(channel)); - } - else - { - ui->label->setText(tr("No %1 updates found. You are running the latest version.").arg(channel)); - ui->btnUpdateNow->setHidden(true); - ui->btnUpdateLater->setText(tr("Close")); - } - ui->changelogBrowser->setHtml(tr("<center><h1>Loading changelog...</h1></center>")); - loadChangelog(); - restoreGeometry(QByteArray::fromBase64(APPLICATION->settings()->get("UpdateDialogGeometry").toByteArray())); -} - -UpdateDialog::~UpdateDialog() -{ -} - -void UpdateDialog::loadChangelog() -{ - auto channel = APPLICATION->settings()->get("UpdateChannel").toString(); - dljob = new NetJob("Changelog", APPLICATION->network()); - QString url; - if(channel == "stable") - { - url = QString("https://raw.githubusercontent.com/Project-Tick/MeshMC/%1/changelog.md").arg(channel); - m_changelogType = CHANGELOG_MARKDOWN; - } - else - { - url = QString("https://api.github.com/repos/Project-Tick/MeshMC/compare/%1...%2").arg(BuildConfig.GIT_COMMIT, channel); - m_changelogType = CHANGELOG_COMMITS; - } - dljob->addNetAction(Net::Download::makeByteArray(QUrl(url), &changelogData)); - connect(dljob.get(), &NetJob::succeeded, this, &UpdateDialog::changelogLoaded); - connect(dljob.get(), &NetJob::failed, this, &UpdateDialog::changelogFailed); - dljob->start(); -} -QString reprocessMarkdown(QByteArray markdown) -{ - HoeDown hoedown; - QString output = hoedown.process(markdown); - - // HACK: easier than customizing hoedown - output.replace(QRegularExpression("GH-([0-9]+)"), "<a href=\"https://github.com/Project-Tick/MeshMC/issues/\\1\">GH-\\1</a>"); - qDebug() << output; - return output; -} - -QString reprocessCommits(QByteArray json) -{ - auto channel = APPLICATION->settings()->get("UpdateChannel").toString(); - try - { - QString result; - auto document = Json::requireDocument(json); - auto rootobject = Json::requireObject(document); - auto status = Json::requireString(rootobject, "status"); - auto diff_url = Json::requireString(rootobject, "html_url"); - - auto print_commits = [&]() - { - result += "<table cellspacing=0 cellpadding=2 style='border-width: 1px; border-style: solid'>"; - auto commitarray = Json::requireArray(rootobject, "commits"); - for(int i = commitarray.size() - 1; i >= 0; i--) - { - const auto & commitval = commitarray[i]; - auto commitobj = Json::requireObject(commitval); - auto parents_info = Json::ensureArray(commitobj, "parents"); - // NOTE: this ignores merge commits, because they have more than one parent - if(parents_info.size() > 1) - { - continue; - } - auto commit_url = Json::requireString(commitobj, "html_url"); - auto commit_info = Json::requireObject(commitobj, "commit"); - auto commit_message = Json::requireString(commit_info, "message"); - auto lines = commit_message.split('\n'); - QRegularExpression regexp("(?<prefix>(GH-(?<issuenr>[0-9]+))|(NOISSUE)|(SCRATCH))? *(?<rest>.*) *"); - auto match = regexp.match(lines.takeFirst(), 0, QRegularExpression::NormalMatch); - auto issuenr = match.captured("issuenr"); - auto prefix = match.captured("prefix"); - auto rest = match.captured("rest"); - result += "<tr><td>"; - if(issuenr.length()) - { - result += QString("<a href=\"https://github.com/Project-Tick/MeshMC/issues/%1\">GH-%2</a>").arg(issuenr, issuenr); - } - else if(prefix.length()) - { - result += QString("<a href=\"%1\">%2</a>").arg(commit_url, prefix); - } - else - { - result += QString("<a href=\"%1\">NOISSUE</a>").arg(commit_url); - } - result += "</td>"; - lines.prepend(rest); - result += "<td><p>" + lines.join("<br />") + "</p></td></tr>"; - } - result += "</table>"; - }; + if (hasUpdate) { + ui->label->setText(tr("<b>%1 %2</b> is available!").arg( + BuildConfig.MESHMC_DISPLAYNAME, status.version)); - if(status == "identical") - { - return QObject::tr("<p>There are no code changes between your current version and latest %1.</p>").arg(channel); - } - else if(status == "ahead") - { - result += QObject::tr("<p>Following commits were added since last update:</p>"); - print_commits(); - } - else if(status == "diverged") - { - auto commit_ahead = Json::requireInteger(rootobject, "ahead_by"); - auto commit_behind = Json::requireInteger(rootobject, "behind_by"); - result += QObject::tr("<p>The update removes %1 commits and adds the following %2:</p>").arg(commit_behind).arg(commit_ahead); - print_commits(); + if (!status.releaseNotes.isEmpty()) { + ui->changelogBrowser->setHtml(status.releaseNotes); + } else { + ui->changelogBrowser->setHtml( + tr("<center><p>No release notes available.</p></center>")); } - result += QObject::tr("<p>You can <a href=\"%1\">look at the changes on github</a>.</p>").arg(diff_url); - return result; - } - catch (const JSONValidationError &e) - { - qWarning() << "Got an unparseable commit log from github:" << e.what(); - qDebug() << json; + } else { + ui->label->setText(tr("You are running the latest version of %1.").arg( + BuildConfig.MESHMC_DISPLAYNAME)); + ui->changelogBrowser->setHtml( + tr("<center><p>No updates found.</p></center>")); + ui->btnUpdateNow->setHidden(true); + ui->btnUpdateLater->setText(tr("Close")); } - return QString(); -} -void UpdateDialog::changelogLoaded() -{ - QString result; - switch(m_changelogType) - { - case CHANGELOG_COMMITS: - result = reprocessCommits(changelogData); - break; - case CHANGELOG_MARKDOWN: - result = reprocessMarkdown(changelogData); - break; - } - changelogData.clear(); - ui->changelogBrowser->setHtml(result); + restoreGeometry(QByteArray::fromBase64( + APPLICATION->settings()->get("UpdateDialogGeometry").toByteArray())); } -void UpdateDialog::changelogFailed(QString reason) +UpdateDialog::~UpdateDialog() { - ui->changelogBrowser->setHtml(tr("<p align=\"center\" <span style=\"font-size:22pt;\">Failed to fetch changelog... Error: %1</span></p>").arg(reason)); + delete ui; } void UpdateDialog::on_btnUpdateLater_clicked() @@ -197,7 +67,7 @@ void UpdateDialog::on_btnUpdateNow_clicked() done(UPDATE_NOW); } -void UpdateDialog::closeEvent(QCloseEvent* evt) +void UpdateDialog::closeEvent(QCloseEvent *evt) { APPLICATION->settings()->set("UpdateDialogGeometry", saveGeometry().toBase64()); QDialog::closeEvent(evt); |
