From 5113f503d140c1edd8670d03d44bcb79fb1a9518 Mon Sep 17 00:00:00 2001 From: crueter Date: Sun, 1 Feb 2026 20:38:02 +0100 Subject: [PATCH] [frontend] Fix nightly update checker (#3444) Splitting Signed-off-by: crueter Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3444 --- CMakeModules/GenerateSCMRev.cmake | 30 +++++++++------- src/android/app/src/main/jni/native.cpp | 14 ++------ src/common/scm_rev.cpp.in | 3 ++ src/common/scm_rev.h | 5 ++- src/frontend_common/update_checker.cpp | 46 +++++++++++++++++++++++-- src/frontend_common/update_checker.h | 1 + src/yuzu/main_window.cpp | 22 ++++-------- src/yuzu/main_window.h | 4 +-- 8 files changed, 82 insertions(+), 43 deletions(-) diff --git a/CMakeModules/GenerateSCMRev.cmake b/CMakeModules/GenerateSCMRev.cmake index 2cf8417d8a..f91a207dfd 100644 --- a/CMakeModules/GenerateSCMRev.cmake +++ b/CMakeModules/GenerateSCMRev.cmake @@ -8,20 +8,26 @@ include(GetSCMRev) function(get_timestamp _var) - string(TIMESTAMP timestamp UTC) - set(${_var} "${timestamp}" PARENT_SCOPE) + string(TIMESTAMP timestamp UTC) + set(${_var} "${timestamp}" PARENT_SCOPE) endfunction() get_timestamp(BUILD_DATE) if (DEFINED GIT_RELEASE) - set(BUILD_VERSION "${GIT_TAG}") - set(GIT_REFSPEC "${GIT_RELEASE}") - set(IS_DEV_BUILD false) + set(BUILD_VERSION "${GIT_TAG}") + set(GIT_REFSPEC "${GIT_RELEASE}") + set(IS_DEV_BUILD false) else() - string(SUBSTRING ${GIT_COMMIT} 0 10 BUILD_VERSION) - set(BUILD_VERSION "${BUILD_VERSION}-${GIT_REFSPEC}") - set(IS_DEV_BUILD true) + string(SUBSTRING ${GIT_COMMIT} 0 10 BUILD_VERSION) + set(BUILD_VERSION "${BUILD_VERSION}-${GIT_REFSPEC}") + set(IS_DEV_BUILD true) +endif() + +if (NIGHTLY_BUILD) + set(IS_NIGHTLY_BUILD true) +else() + set(IS_NIGHTLY_BUILD false) endif() set(GIT_DESC ${BUILD_VERSION}) @@ -34,11 +40,11 @@ set(BUILD_AUTO_UPDATE_WEBSITE "https://github.com") set(BUILD_AUTO_UPDATE_API "http://api.github.com") if (NIGHTLY_BUILD) - set(BUILD_AUTO_UPDATE_REPO "Eden-CI/Nightly") - set(REPO_NAME "Eden Nightly") + set(BUILD_AUTO_UPDATE_REPO "Eden-CI/Nightly") + set(REPO_NAME "Eden Nightly") else() - set(BUILD_AUTO_UPDATE_REPO "eden-emulator/Releases") - set(REPO_NAME "Eden") + set(BUILD_AUTO_UPDATE_REPO "eden-emulator/Releases") + set(REPO_NAME "Eden") endif() set(BUILD_ID ${GIT_REFSPEC}) diff --git a/src/android/app/src/main/jni/native.cpp b/src/android/app/src/main/jni/native.cpp index 550befa85c..37f195fe15 100644 --- a/src/android/app/src/main/jni/native.cpp +++ b/src/android/app/src/main/jni/native.cpp @@ -1615,22 +1615,14 @@ JNIEXPORT jboolean JNICALL Java_org_yuzu_yuzu_1emu_NativeLibrary_isNightlyBuild( #endif } - #ifdef ENABLE_UPDATE_CHECKER + JNIEXPORT jobjectArray JNICALL Java_org_yuzu_yuzu_1emu_NativeLibrary_checkForUpdate( JNIEnv* env, jobject obj) { - const bool is_prerelease = ((strstr(Common::g_build_version, "pre-alpha") != nullptr) || - (strstr(Common::g_build_version, "alpha") != nullptr) || - (strstr(Common::g_build_version, "beta") != nullptr) || - (strstr(Common::g_build_version, "rc") != nullptr)); - const std::optional release = - UpdateChecker::GetLatestRelease(is_prerelease); - - if (!release || release->tag == Common::g_build_version) { - return nullptr; - } + std::optional release = UpdateChecker::GetUpdate(); + if (!release) return nullptr; const std::string tag = release->tag; const std::string name = release->name; diff --git a/src/common/scm_rev.cpp.in b/src/common/scm_rev.cpp.in index 60c9c119f9..b3d9455853 100644 --- a/src/common/scm_rev.cpp.in +++ b/src/common/scm_rev.cpp.in @@ -21,6 +21,7 @@ #define BUILD_AUTO_UPDATE_WEBSITE "@BUILD_AUTO_UPDATE_WEBSITE@" #define BUILD_AUTO_UPDATE_API "@BUILD_AUTO_UPDATE_API@" #define BUILD_AUTO_UPDATE_REPO "@BUILD_AUTO_UPDATE_REPO@" +#define IS_NIGHTLY_BUILD @IS_NIGHTLY_BUILD@ namespace Common { @@ -35,7 +36,9 @@ constexpr const char g_build_id[] = BUILD_ID; constexpr const char g_title_bar_format_idle[] = TITLE_BAR_FORMAT_IDLE; constexpr const char g_title_bar_format_running[] = TITLE_BAR_FORMAT_RUNNING; constexpr const char g_compiler_id[] = COMPILER_ID; + constexpr const bool g_is_dev_build = IS_DEV_BUILD; +constexpr const bool g_is_nightly_build = IS_NIGHTLY_BUILD; constexpr const char g_build_auto_update_website[] = BUILD_AUTO_UPDATE_WEBSITE; constexpr const char g_build_auto_update_api[] = BUILD_AUTO_UPDATE_API; diff --git a/src/common/scm_rev.h b/src/common/scm_rev.h index b89de95a3d..8c4338aaa8 100644 --- a/src/common/scm_rev.h +++ b/src/common/scm_rev.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2014 Citra Emulator Project @@ -20,7 +20,10 @@ extern const char g_title_bar_format_idle[]; extern const char g_title_bar_format_running[]; extern const char g_shader_cache_version[]; extern const char g_compiler_id[]; + extern const bool g_is_dev_build; +extern const bool g_is_nightly_build; + extern const char g_build_auto_update_website[]; extern const char g_build_auto_update_api[]; extern const char g_build_auto_update_repo[]; diff --git a/src/frontend_common/update_checker.cpp b/src/frontend_common/update_checker.cpp index 53f3ca942d..1d7c8a4492 100644 --- a/src/frontend_common/update_checker.cpp +++ b/src/frontend_common/update_checker.cpp @@ -5,10 +5,13 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. -#include "update_checker.h" +#include +#include + +#include #include "common/logging/log.h" #include "common/scm_rev.h" -#include +#include "update_checker.h" #include @@ -137,3 +140,42 @@ std::optional UpdateChecker::GetLatestRelease(bool includ return {}; } } + +std::optional UpdateChecker::GetUpdate() { + const bool is_prerelease = ((strstr(Common::g_build_version, "pre-alpha") != NULL) || + (strstr(Common::g_build_version, "alpha") != NULL) || + (strstr(Common::g_build_version, "beta") != NULL) || + (strstr(Common::g_build_version, "rc") != NULL)); + const std::optional latest_release_tag = + UpdateChecker::GetLatestRelease(is_prerelease); + + if (!latest_release_tag) + goto empty; + + { + std::string tag, build; + if (Common::g_is_nightly_build) { + std::vector result; + + boost::split(result, latest_release_tag->tag, boost::is_any_of(".")); + if (result.size() != 2) + goto empty; + tag = result[1]; + + boost::split(result, std::string{Common::g_build_version}, boost::is_any_of("-")); + if (result.empty()) + goto empty; + build = result[0]; + } else { + tag = latest_release_tag->tag; + build = Common::g_build_version; + } + + if (tag != build) + return latest_release_tag.value(); + } + +empty: + return UpdateChecker::Update{}; + +} diff --git a/src/frontend_common/update_checker.h b/src/frontend_common/update_checker.h index 9dbb321eef..fb6c25c3f3 100644 --- a/src/frontend_common/update_checker.h +++ b/src/frontend_common/update_checker.h @@ -19,4 +19,5 @@ typedef struct { std::optional GetResponse(std::string url, std::string path); std::optional GetLatestRelease(bool include_prereleases); +std::optional GetUpdate(); } // namespace UpdateChecker diff --git a/src/yuzu/main_window.cpp b/src/yuzu/main_window.cpp index e3cd3f583c..d50dcad994 100644 --- a/src/yuzu/main_window.cpp +++ b/src/yuzu/main_window.cpp @@ -2,6 +2,7 @@ // SPDX-License-Identifier: GPL-3.0-or-later // Qt on macOS doesn't define VMA shit +#include #include "qt_common/qt_string_lookup.h" #if defined(QT_STATICPLUGIN) && !defined(__APPLE__) #undef VMA_IMPLEMENTATION @@ -516,17 +517,8 @@ MainWindow::MainWindow(bool has_broken_vulkan) #ifdef ENABLE_UPDATE_CHECKER if (UISettings::values.check_for_updates) { - update_future = QtConcurrent::run([]() -> UpdateChecker::Update { - const bool is_prerelease = ((strstr(Common::g_build_version, "pre-alpha") != NULL) || - (strstr(Common::g_build_version, "alpha") != NULL) || - (strstr(Common::g_build_version, "beta") != NULL) || - (strstr(Common::g_build_version, "rc") != NULL)); - const std::optional latest_release_tag = - UpdateChecker::GetLatestRelease(is_prerelease); - if (latest_release_tag && latest_release_tag->tag != Common::g_build_version) { - return latest_release_tag.value(); - } - return UpdateChecker::Update{}; + update_future = QtConcurrent::run([]() -> std::optional { + return UpdateChecker::GetUpdate(); }); update_watcher.connect(&update_watcher, &QFutureWatcher::finished, this, &MainWindow::OnEmulatorUpdateAvailable); @@ -4020,8 +4012,8 @@ void MainWindow::OnCaptureScreenshot() { #ifdef ENABLE_UPDATE_CHECKER void MainWindow::OnEmulatorUpdateAvailable() { - UpdateChecker::Update version = update_future.result(); - if (version.tag.empty()) + std::optional version = update_future.result(); + if (!version) return; QMessageBox update_prompt(this); @@ -4030,14 +4022,14 @@ void MainWindow::OnEmulatorUpdateAvailable() { update_prompt.addButton(QMessageBox::Yes); update_prompt.addButton(QMessageBox::Ignore); update_prompt.setText( - tr("Download %1?").arg(QString::fromStdString(version.name))); + tr("Download %1?").arg(QString::fromStdString(version->name))); update_prompt.exec(); if (update_prompt.button(QMessageBox::Yes) == update_prompt.clickedButton()) { auto const full_url = fmt::format("{}/{}/releases/tag/", std::string{Common::g_build_auto_update_website}, std::string{Common::g_build_auto_update_repo} ); - QDesktopServices::openUrl(QUrl(QString::fromStdString(full_url + version.tag))); + QDesktopServices::openUrl(QUrl(QString::fromStdString(full_url + version->tag))); } } #endif diff --git a/src/yuzu/main_window.h b/src/yuzu/main_window.h index 351a581729..41c2f4fea0 100644 --- a/src/yuzu/main_window.h +++ b/src/yuzu/main_window.h @@ -472,8 +472,8 @@ private: std::shared_ptr input_subsystem; #ifdef ENABLE_UPDATE_CHECKER - QFuture update_future; - QFutureWatcher update_watcher; + QFuture> update_future; + QFutureWatcher> update_watcher; #endif MultiplayerState* multiplayer_state = nullptr;