mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-09 07:56:24 -06:00
add version check
This commit is contained in:
parent
2266aa4d98
commit
9379ea1546
6 changed files with 111 additions and 6 deletions
|
@ -38,7 +38,7 @@ using namespace nlohmann;
|
||||||
|
|
||||||
namespace Slic3r {
|
namespace Slic3r {
|
||||||
|
|
||||||
static const std::string VERSION_CHECK_URL = "";
|
static const std::string VERSION_CHECK_URL = "https://api.github.com/repos/softfever/bambustudio-softfever/releases";
|
||||||
static const std::string MODELS_STR = "models";
|
static const std::string MODELS_STR = "models";
|
||||||
|
|
||||||
const std::string AppConfig::SECTION_FILAMENTS = "filaments";
|
const std::string AppConfig::SECTION_FILAMENTS = "filaments";
|
||||||
|
|
|
@ -141,6 +141,15 @@ public:
|
||||||
if (ver.metadata != nullptr) { res += '+'; res += ver.metadata; }
|
if (ver.metadata != nullptr) { res += '+'; res += ver.metadata; }
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
std::string to_string_sf() const {
|
||||||
|
//BBS: version format
|
||||||
|
std::string res;
|
||||||
|
res = (boost::format("%1%.%2%.%3%") % ver.major % ver.minor % ver.patch).str();
|
||||||
|
|
||||||
|
if (ver.prerelease != nullptr) { res += '-'; res += ver.prerelease; }
|
||||||
|
if (ver.metadata != nullptr) { res += '+'; res += ver.metadata; }
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
// Arithmetics
|
// Arithmetics
|
||||||
Semver& operator+=(const Major &b) { ver.major += b.i; return *this; }
|
Semver& operator+=(const Major &b) { ver.major += b.i; return *this; }
|
||||||
|
|
|
@ -1118,7 +1118,7 @@ void GUI_App::post_init()
|
||||||
this->preset_updater->sync(http_url, language, network_ver, preset_bundle);
|
this->preset_updater->sync(http_url, language, network_ver, preset_bundle);
|
||||||
|
|
||||||
//BBS: check new version
|
//BBS: check new version
|
||||||
//this->check_new_version();
|
this->check_new_version_sf();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3805,6 +3805,101 @@ void GUI_App::check_new_version(bool show_tips, int by_user)
|
||||||
}).perform();
|
}).perform();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//parse the string, if it doesn't contain a valid version string, return invalid version.
|
||||||
|
Semver get_version(const std::string& str, const std::regex& regexp) {
|
||||||
|
std::smatch match;
|
||||||
|
if (std::regex_match(str, match, regexp)) {
|
||||||
|
std::string version_cleaned = match[0];
|
||||||
|
const boost::optional<Semver> version = Semver::parse(version_cleaned);
|
||||||
|
if (version.has_value()) {
|
||||||
|
return *version;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Semver::invalid();
|
||||||
|
}
|
||||||
|
|
||||||
|
void GUI_App::check_new_version_sf(bool show_tips, int by_user)
|
||||||
|
{
|
||||||
|
AppConfig* app_config = wxGetApp().app_config;
|
||||||
|
auto version_check_url = app_config->version_check_url();
|
||||||
|
Http::get(version_check_url).on_error([&](std::string body, std::string error, unsigned http_status) {
|
||||||
|
(void)body;
|
||||||
|
BOOST_LOG_TRIVIAL(error) << format("Error getting: `%1%`: HTTP %2%, %3%",
|
||||||
|
version_check_url,
|
||||||
|
http_status,
|
||||||
|
error);
|
||||||
|
})
|
||||||
|
.timeout_connect(1)
|
||||||
|
.on_complete([&](std::string body, unsigned /* http_status */) {
|
||||||
|
boost::trim(body);
|
||||||
|
// SoftFever: parse github release, ported from SS
|
||||||
|
|
||||||
|
boost::property_tree::ptree root;
|
||||||
|
std::stringstream json_stream(body);
|
||||||
|
boost::property_tree::read_json(json_stream, root);
|
||||||
|
bool i_am_pre = false;
|
||||||
|
//at least two number, use '.' as separator. can be followed by -Az23 for prereleased and +Az42 for metadata
|
||||||
|
std::regex matcher("[0-9]+\\.[0-9]+(\\.[0-9]+)*(-[A-Za-z0-9]+)?(\\+[A-Za-z0-9]+)?");
|
||||||
|
|
||||||
|
Semver current_version = get_version(SoftFever_VERSION, matcher);
|
||||||
|
Semver best_pre(1, 0, 0);
|
||||||
|
Semver best_release(1, 0, 0);
|
||||||
|
std::string best_pre_url;
|
||||||
|
std::string best_release_url;
|
||||||
|
std::string best_release_content;
|
||||||
|
std::string best_pre_content;
|
||||||
|
const std::regex reg_num("([0-9]+)");
|
||||||
|
for (auto json_version : root) {
|
||||||
|
std::string tag = json_version.second.get<std::string>("tag_name");
|
||||||
|
if (tag[0] == 'v')
|
||||||
|
tag.erase(0, 1);
|
||||||
|
for (std::regex_iterator it = std::sregex_iterator(tag.begin(), tag.end(), reg_num); it != std::sregex_iterator(); ++it) {
|
||||||
|
|
||||||
|
}
|
||||||
|
Semver tag_version = get_version(tag, matcher);
|
||||||
|
if (current_version == tag_version)
|
||||||
|
i_am_pre = json_version.second.get<bool>("prerelease");
|
||||||
|
if (json_version.second.get<bool>("prerelease")) {
|
||||||
|
if (best_pre < tag_version) {
|
||||||
|
best_pre = tag_version;
|
||||||
|
best_pre_url = json_version.second.get<std::string>("html_url");
|
||||||
|
best_pre_content = json_version.second.get<std::string>("body");
|
||||||
|
best_pre.set_prerelease("Preview");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (best_release < tag_version) {
|
||||||
|
best_release = tag_version;
|
||||||
|
best_release_url = json_version.second.get<std::string>("html_url");
|
||||||
|
best_release_content = json_version.second.get<std::string>("body");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//if release is more recent than beta, use release anyway
|
||||||
|
if (best_pre < best_release) {
|
||||||
|
best_pre = best_release;
|
||||||
|
best_pre_url = best_release_url;
|
||||||
|
best_pre_content = best_release_content;
|
||||||
|
}
|
||||||
|
//if we're the most recent, don't do anything
|
||||||
|
if ((i_am_pre ? best_pre : best_release) <= current_version)
|
||||||
|
return;
|
||||||
|
|
||||||
|
//BOOST_LOG_TRIVIAL(info) << format("Got %1% online version: `%2%`. Sending to GUI thread...", SLIC3R_APP_NAME, i_am_pre ? best_pre.to_string(): best_release.to_string());
|
||||||
|
|
||||||
|
version_info.url = i_am_pre ? best_pre_url : best_release_url;
|
||||||
|
version_info.version_str = i_am_pre ? best_pre.to_string() : best_release.to_string_sf();
|
||||||
|
version_info.description = i_am_pre ? best_pre_content : best_release_content;
|
||||||
|
version_info.force_upgrade = false;
|
||||||
|
|
||||||
|
wxCommandEvent* evt = new wxCommandEvent(EVT_SLIC3R_VERSION_ONLINE);
|
||||||
|
evt->SetString((i_am_pre ? best_pre : best_release).to_string());
|
||||||
|
GUI::wxGetApp().QueueEvent(evt);
|
||||||
|
})
|
||||||
|
.perform_sync();;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
//BBS pop up a dialog and download files
|
//BBS pop up a dialog and download files
|
||||||
void GUI_App::request_new_version(int by_user)
|
void GUI_App::request_new_version(int by_user)
|
||||||
|
|
|
@ -410,6 +410,7 @@ public:
|
||||||
|
|
||||||
void check_update(bool show_tips, int by_user);
|
void check_update(bool show_tips, int by_user);
|
||||||
void check_new_version(bool show_tips = false, int by_user = 0);
|
void check_new_version(bool show_tips = false, int by_user = 0);
|
||||||
|
void check_new_version_sf(bool show_tips = false, int by_user = 0);
|
||||||
void request_new_version(int by_user);
|
void request_new_version(int by_user);
|
||||||
void enter_force_upgrade();
|
void enter_force_upgrade();
|
||||||
void set_skip_version(bool skip = true);
|
void set_skip_version(bool skip = true);
|
||||||
|
|
|
@ -1915,7 +1915,7 @@ static wxMenu* generate_help_menu()
|
||||||
// Check New Version
|
// Check New Version
|
||||||
append_menu_item(helpMenu, wxID_ANY, _L("Check for Update"), _L("Check for Update"),
|
append_menu_item(helpMenu, wxID_ANY, _L("Check for Update"), _L("Check for Update"),
|
||||||
[](wxCommandEvent&) {
|
[](wxCommandEvent&) {
|
||||||
wxGetApp().check_new_version(true, 1);
|
wxGetApp().check_new_version_sf(true, 1);
|
||||||
}, "", nullptr, []() {
|
}, "", nullptr, []() {
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
|
@ -316,7 +316,7 @@ void UpdateVersionDialog::update_version_info(wxString release_note, wxString ve
|
||||||
//bbs check whether the web display is used
|
//bbs check whether the web display is used
|
||||||
bool use_web_link = false;
|
bool use_web_link = false;
|
||||||
std::string url_line = "";
|
std::string url_line = "";
|
||||||
auto split_array = splitWithStl(release_note.ToStdString(), "###");
|
/*auto split_array = splitWithStl(release_note.ToStdString(), "\r\n");
|
||||||
|
|
||||||
for (auto i = 0; i < split_array.size(); i++) {
|
for (auto i = 0; i < split_array.size(); i++) {
|
||||||
std::string url = split_array[i];
|
std::string url = split_array[i];
|
||||||
|
@ -331,7 +331,7 @@ void UpdateVersionDialog::update_version_info(wxString release_note, wxString ve
|
||||||
m_simplebook_release_note->SetSelection(1);
|
m_simplebook_release_note->SetSelection(1);
|
||||||
m_vebview_release_note->LoadURL(from_u8(url_line));
|
m_vebview_release_note->LoadURL(from_u8(url_line));
|
||||||
}
|
}
|
||||||
else {
|
else {*/
|
||||||
m_simplebook_release_note->SetSelection(0);
|
m_simplebook_release_note->SetSelection(0);
|
||||||
m_text_up_info->SetLabel(wxString::Format(_L("Click to download new version in default browser: %s"), version));
|
m_text_up_info->SetLabel(wxString::Format(_L("Click to download new version in default browser: %s"), version));
|
||||||
wxBoxSizer* sizer_text_release_note = new wxBoxSizer(wxVERTICAL);
|
wxBoxSizer* sizer_text_release_note = new wxBoxSizer(wxVERTICAL);
|
||||||
|
@ -341,7 +341,7 @@ void UpdateVersionDialog::update_version_info(wxString release_note, wxString ve
|
||||||
m_scrollwindows_release_note->SetSizer(sizer_text_release_note);
|
m_scrollwindows_release_note->SetSizer(sizer_text_release_note);
|
||||||
m_scrollwindows_release_note->Layout();
|
m_scrollwindows_release_note->Layout();
|
||||||
m_scrollwindows_release_note->Fit();
|
m_scrollwindows_release_note->Fit();
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
SecondaryCheckDialog::SecondaryCheckDialog(wxWindow* parent, wxWindowID id, const wxString& title, enum ButtonStyle btn_style, const wxPoint& pos, const wxSize& size, long style, bool not_show_again_check)
|
SecondaryCheckDialog::SecondaryCheckDialog(wxWindow* parent, wxWindowID id, const wxString& title, enum ButtonStyle btn_style, const wxPoint& pos, const wxSize& size, long style, bool not_show_again_check)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue