Skip to content

Commit 1f7d353

Browse files
committed
hyprpm: check for abi strings in headersValid
1 parent 68eecf6 commit 1f7d353

File tree

6 files changed

+43
-35
lines changed

6 files changed

+43
-35
lines changed

hyprpm/src/core/DataState.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ void DataState::updateGlobalState(const SGlobalState& state) {
181181
// clang-format off
182182
auto DATA = toml::table{
183183
{"state", toml::table{
184-
{"hash", state.headersHashCompiled},
184+
{"hash", state.headersAbiCompiled},
185185
{"dont_warn_install", state.dontWarnInstall}
186186
}}
187187
};

hyprpm/src/core/DataState.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
#include "Plugin.hpp"
66

77
struct SGlobalState {
8-
std::string headersHashCompiled = "";
8+
std::string headersAbiCompiled = "";
99
bool dontWarnInstall = false;
1010
};
1111

hyprpm/src/core/PluginManager.cpp

Lines changed: 27 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -78,40 +78,30 @@ SHyprlandVersion CPluginManager::getHyprlandVersion(bool running) {
7878
else
7979
onceInstalled = true;
8080

81-
const auto HLVERCALL = running ? NHyprlandSocket::send("/version") : execAndGet("Hyprland --version");
82-
if (m_bVerbose)
83-
std::println("{}", verboseString("{} version returned: {}", running ? "running" : "installed", HLVERCALL));
81+
const auto HLVERCALL = running ? NHyprlandSocket::send("j/version") : execAndGet("Hyprland --version-json");
82+
83+
auto jsonQuery = glz::read_json<glz::json_t>(HLVERCALL);
8484

85-
if (!HLVERCALL.contains("Tag:")) {
86-
std::println(stderr, "\n{}", failureString("You don't seem to be running Hyprland."));
85+
if (!jsonQuery) {
86+
std::println("{}", failureString("failed to get the current hyprland version. Are you running hyprland?"));
8787
return SHyprlandVersion{};
8888
}
8989

90-
std::string hlcommit = HLVERCALL.substr(HLVERCALL.find("at commit") + 10);
91-
hlcommit = hlcommit.substr(0, hlcommit.find_first_of(' '));
92-
93-
std::string hlbranch = HLVERCALL.substr(HLVERCALL.find("from branch") + 12);
94-
hlbranch = hlbranch.substr(0, hlbranch.find(" at commit "));
95-
96-
std::string hldate = HLVERCALL.substr(HLVERCALL.find("Date: ") + 6);
97-
hldate = hldate.substr(0, hldate.find('\n'));
98-
99-
std::string hlcommits;
90+
auto hlbranch = (*jsonQuery)["branch"].get_string();
91+
auto hlcommit = (*jsonQuery)["commit"].get_string();
92+
auto abiHash = (*jsonQuery)["abiHash"].get_string();
93+
auto hldate = (*jsonQuery)["commit_date"].get_string();
94+
auto hlcommits = (*jsonQuery)["commits"].get_string();
10095

101-
if (HLVERCALL.contains("commits:")) {
102-
hlcommits = HLVERCALL.substr(HLVERCALL.find("commits:") + 9);
103-
hlcommits = hlcommits.substr(0, hlcommits.find(' '));
104-
}
105-
106-
int commits = 0;
96+
size_t commits = 0;
10797
try {
108-
commits = std::stoi(hlcommits);
98+
commits = std::stoull(hlcommits);
10999
} catch (...) { ; }
110100

111101
if (m_bVerbose)
112102
std::println("{}", verboseString("parsed commit {} at branch {} on {}, commits {}", hlcommit, hlbranch, hldate, commits));
113103

114-
auto ver = SHyprlandVersion{hlbranch, hlcommit, hldate, commits};
104+
auto ver = SHyprlandVersion{hlbranch, hlcommit, hldate, abiHash, commits};
115105

116106
if (running)
117107
verRunning = ver;
@@ -161,7 +151,7 @@ bool CPluginManager::addNewPluginRepo(const std::string& url, const std::string&
161151
DataState::updateGlobalState(GLOBALSTATE);
162152
}
163153

164-
if (GLOBALSTATE.headersHashCompiled.empty()) {
154+
if (GLOBALSTATE.headersAbiCompiled.empty()) {
165155
std::println("\n{}", failureString("Cannot find headers in the global state. Try running hyprpm update first."));
166156
return false;
167157
}
@@ -444,6 +434,12 @@ eHeadersErrors CPluginManager::headersValid() {
444434
if (hash != HLVER.hash)
445435
return HEADERS_MISMATCHED;
446436

437+
// check ABI hash too
438+
const auto GLOBALSTATE = DataState::getGlobalState();
439+
440+
if (GLOBALSTATE.headersAbiCompiled != HLVER.abiHash)
441+
return HEADERS_ABI_MISMATCH;
442+
447443
return HEADERS_OK;
448444
}
449445

@@ -595,8 +591,8 @@ bool CPluginManager::updateHeaders(bool force) {
595591
progress.m_szCurrentMessage = "Done!";
596592
progress.print();
597593

598-
auto GLOBALSTATE = DataState::getGlobalState();
599-
GLOBALSTATE.headersHashCompiled = HLVER.hash;
594+
auto GLOBALSTATE = DataState::getGlobalState();
595+
GLOBALSTATE.headersAbiCompiled = HLVER.abiHash;
600596
DataState::updateGlobalState(GLOBALSTATE);
601597

602598
std::print("\n");
@@ -787,8 +783,8 @@ bool CPluginManager::updatePlugins(bool forceUpdateAll) {
787783
progress.m_szCurrentMessage = "Updating global state...";
788784
progress.print();
789785

790-
auto GLOBALSTATE = DataState::getGlobalState();
791-
GLOBALSTATE.headersHashCompiled = HLVER.hash;
786+
auto GLOBALSTATE = DataState::getGlobalState();
787+
GLOBALSTATE.headersAbiCompiled = HLVER.abiHash;
792788
DataState::updateGlobalState(GLOBALSTATE);
793789

794790
progress.m_iSteps++;
@@ -913,9 +909,9 @@ bool CPluginManager::loadUnloadPlugin(const std::string& path, bool load) {
913909
auto state = DataState::getGlobalState();
914910
auto HLVER = getHyprlandVersion(true);
915911

916-
if (state.headersHashCompiled != HLVER.hash) {
912+
if (state.headersAbiCompiled != HLVER.hash) {
917913
if (load)
918-
std::println("{}", infoString("Running Hyprland version ({}) differs from plugin state ({}), please restart Hyprland.", HLVER.hash, state.headersHashCompiled));
914+
std::println("{}", infoString("Running Hyprland version ({}) differs from plugin state ({}), please restart Hyprland.", HLVER.hash, state.headersAbiCompiled));
919915
return false;
920916
}
921917

@@ -956,6 +952,7 @@ std::string CPluginManager::headerError(const eHeadersErrors err) {
956952
case HEADERS_MISMATCHED: return failureString("Headers version mismatch. Please run hyprpm update to fix those.\n");
957953
case HEADERS_NOT_HYPRLAND: return failureString("It doesn't seem you are running on hyprland.\n");
958954
case HEADERS_MISSING: return failureString("Headers missing. Please run hyprpm update to fix those.\n");
955+
case HEADERS_ABI_MISMATCH: return failureString("ABI is mismatched. Please run hyprpm update to fix that.\n");
959956
case HEADERS_DUPLICATED: {
960957
return failureString("Headers duplicated!!! This is a very bad sign.\n"
961958
"This could be due to e.g. installing hyprland manually while a system package of hyprland is also installed.\n"

hyprpm/src/core/PluginManager.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ enum eHeadersErrors {
1111
HEADERS_MISSING,
1212
HEADERS_CORRUPTED,
1313
HEADERS_MISMATCHED,
14+
HEADERS_ABI_MISMATCH,
1415
HEADERS_DUPLICATED
1516
};
1617

@@ -36,6 +37,7 @@ struct SHyprlandVersion {
3637
std::string branch;
3738
std::string hash;
3839
std::string date;
40+
std::string abiHash;
3941
int commits = 0;
4042
};
4143

src/debug/HyprCtl.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1063,6 +1063,9 @@ std::string versionRequest(eHyprCtlOutputFormat format, std::string request) {
10631063
result += "\n";
10641064
result += getBuiltSystemLibraryNames();
10651065
result += "\n";
1066+
result += "Version ABI string: ";
1067+
result += __hyprland_api_get_hash();
1068+
result += "\n";
10661069

10671070
#if (!ISDEBUG && !defined(NO_XWAYLAND))
10681071
result += "no flags were set\n";
@@ -1097,10 +1100,12 @@ std::string versionRequest(eHyprCtlOutputFormat format, std::string request) {
10971100
"systemHyprutils": "{}",
10981101
"systemHyprcursor": "{}",
10991102
"systemHyprgraphics": "{}",
1103+
"abiHash": "{}",
11001104
"flags": [)#",
11011105
GIT_BRANCH, GIT_COMMIT_HASH, HYPRLAND_VERSION, (strcmp(GIT_DIRTY, "dirty") == 0 ? "true" : "false"), escapeJSONStrings(commitMsg), GIT_COMMIT_DATE, GIT_TAG,
11021106
GIT_COMMITS, AQUAMARINE_VERSION, HYPRLANG_VERSION, HYPRUTILS_VERSION, HYPRCURSOR_VERSION, HYPRGRAPHICS_VERSION, getSystemLibraryVersion("aquamarine"),
1103-
getSystemLibraryVersion("hyprlang"), getSystemLibraryVersion("hyprutils"), getSystemLibraryVersion("hyprcursor"), getSystemLibraryVersion("hyprgraphics"));
1107+
getSystemLibraryVersion("hyprlang"), getSystemLibraryVersion("hyprutils"), getSystemLibraryVersion("hyprcursor"), getSystemLibraryVersion("hyprgraphics"),
1108+
__hyprland_api_get_hash());
11041109

11051110
#if ISDEBUG
11061111
result += "\"debug\",";

src/main.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,16 @@ using namespace Hyprutils::Memory;
2525

2626
static void help() {
2727
std::println("usage: Hyprland [arg [...]].\n");
28-
std::println(R"(Arguments:
28+
std::println(R"#(Arguments:
2929
--help -h - Show this message again
3030
--config FILE -c FILE - Specify config file to use
3131
--socket NAME - Sets the Wayland socket name (for Wayland socket handover)
3232
--wayland-fd FD - Sets the Wayland socket fd (for Wayland socket handover)
3333
--systeminfo - Prints system infos
3434
--i-am-really-stupid - Omits root user privileges check (why would you do that?)
3535
--verify-config - Do not run Hyprland, only print if the config has any errors
36-
--version -v - Print this binary's version)");
36+
--version -v - Print this binary's version
37+
--version-json - Print this binary's version as json)#");
3738
}
3839

3940
static void reapZombieChildrenAutomatically() {
@@ -142,6 +143,9 @@ int main(int argc, char** argv) {
142143
} else if (value == "-v" || value == "--version") {
143144
std::println("{}", versionRequest(eHyprCtlOutputFormat::FORMAT_NORMAL, ""));
144145
return 0;
146+
} else if (value == "--version-json") {
147+
std::println("{}", versionRequest(eHyprCtlOutputFormat::FORMAT_JSON, ""));
148+
return 0;
145149
} else if (value == "--systeminfo") {
146150
std::println("{}", systemInfoRequest(eHyprCtlOutputFormat::FORMAT_NORMAL, ""));
147151
return 0;

0 commit comments

Comments
 (0)