From f6d63082c0037e0198be5bed17cd24648917b36f Mon Sep 17 00:00:00 2001 From: Ed Hennis Date: Wed, 5 Feb 2025 11:36:43 -0500 Subject: [PATCH] Improve git commit hash lookup (#5225) - Also get the branch name. - Use rev-parse instead of describe to get a clean hash. - Return the git hash and branch name in server_info for admin connections. - Include git hash and branch name on separate lines in --version. --- CMakeLists.txt | 10 +++++++++- include/xrpl/protocol/jss.h | 2 ++ src/test/rpc/ServerInfo_test.cpp | 31 ++++++++++++++++++++++++++----- src/xrpld/app/main/Main.cpp | 6 ++++++ src/xrpld/app/misc/NetworkOPs.cpp | 12 ++++++++++++ 5 files changed, 55 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 49ecd192b7..03dba51d0c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,13 +19,21 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) # make GIT_COMMIT_HASH define available to all sources find_package(Git) if(Git_FOUND) - execute_process(COMMAND ${GIT_EXECUTABLE} --git-dir=${CMAKE_CURRENT_SOURCE_DIR}/.git describe --always --abbrev=40 + execute_process(COMMAND ${GIT_EXECUTABLE} --git-dir=${CMAKE_CURRENT_SOURCE_DIR}/.git rev-parse HEAD OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE gch) if(gch) set(GIT_COMMIT_HASH "${gch}") message(STATUS gch: ${GIT_COMMIT_HASH}) add_definitions(-DGIT_COMMIT_HASH="${GIT_COMMIT_HASH}") endif() + + execute_process(COMMAND ${GIT_EXECUTABLE} --git-dir=${CMAKE_CURRENT_SOURCE_DIR}/.git rev-parse --abbrev-ref HEAD + OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE gb) + if(gb) + set(GIT_BRANCH "${gb}") + message(STATUS gb: ${GIT_BRANCH}) + add_definitions(-DGIT_BRANCH="${GIT_BRANCH}") + endif() endif() #git if(thread_safety_analysis) diff --git a/include/xrpl/protocol/jss.h b/include/xrpl/protocol/jss.h index 4db8e0e32d..483b69a962 100644 --- a/include/xrpl/protocol/jss.h +++ b/include/xrpl/protocol/jss.h @@ -167,6 +167,7 @@ JSS(blobs_v2); // out: ValidatorList JSS(books); // in: Subscribe, Unsubscribe JSS(both); // in: Subscribe, Unsubscribe JSS(both_sides); // in: Subscribe, Unsubscribe +JSS(branch); // out: server_info JSS(broadcast); // out: SubmitTransaction JSS(bridge_account); // in: LedgerEntry JSS(build_path); // in: TransactionSign @@ -290,6 +291,7 @@ JSS(frozen_balances); // out: GatewayBalances JSS(full); // in: LedgerClearer, handlers/Ledger JSS(full_reply); // out: PathFind JSS(fullbelow_size); // out: GetCounts +JSS(git); // out: server_info JSS(good); // out: RPCVersion JSS(hash); // out: NetworkOPs, InboundLedger, // LedgerToJson, STTx; field diff --git a/src/test/rpc/ServerInfo_test.cpp b/src/test/rpc/ServerInfo_test.cpp index 2f0cdee77e..5e202f275a 100644 --- a/src/test/rpc/ServerInfo_test.cpp +++ b/src/test/rpc/ServerInfo_test.cpp @@ -86,21 +86,42 @@ admin = 127.0.0.1 { Env env(*this); - auto const result = env.rpc("server_info"); - BEAST_EXPECT(!result[jss::result].isMember(jss::error)); - BEAST_EXPECT(result[jss::result][jss::status] == "success"); - BEAST_EXPECT(result[jss::result].isMember(jss::info)); + auto const serverinfo = env.rpc("server_info"); + BEAST_EXPECT(serverinfo.isMember(jss::result)); + auto const& result = serverinfo[jss::result]; + BEAST_EXPECT(!result.isMember(jss::error)); + BEAST_EXPECT(result[jss::status] == "success"); + BEAST_EXPECT(result.isMember(jss::info)); + auto const& info = result[jss::info]; + BEAST_EXPECT(info.isMember(jss::build_version)); + // Git info is not guaranteed to be present + if (info.isMember(jss::git)) + { + auto const& git = info[jss::git]; + BEAST_EXPECT( + git.isMember(jss::hash) || git.isMember(jss::branch)); + BEAST_EXPECT( + !git.isMember(jss::hash) || + (git[jss::hash].isString() && + git[jss::hash].asString().size() == 40)); + BEAST_EXPECT( + !git.isMember(jss::branch) || + (git[jss::branch].isString() && + git[jss::branch].asString().size() != 0)); + } } { Env env(*this); // Call NetworkOPs directly and set the admin flag to false. - // Expect that the admin ports are not included in the result. auto const result = env.app().getOPs().getServerInfo(true, false, 0); + // Expect that the admin ports are not included in the result. auto const& ports = result[jss::ports]; BEAST_EXPECT(ports.isArray() && ports.size() == 0); + // Expect that git info is absent + BEAST_EXPECT(!result.isMember(jss::git)); } { diff --git a/src/xrpld/app/main/Main.cpp b/src/xrpld/app/main/Main.cpp index c945cfa85e..533cda75b5 100644 --- a/src/xrpld/app/main/Main.cpp +++ b/src/xrpld/app/main/Main.cpp @@ -521,6 +521,12 @@ run(int argc, char** argv) { std::cout << "rippled version " << BuildInfo::getVersionString() << std::endl; +#ifdef GIT_COMMIT_HASH + std::cout << "Git commit hash: " << GIT_COMMIT_HASH << std::endl; +#endif +#ifdef GIT_BRANCH + std::cout << "Git build branch: " << GIT_BRANCH << std::endl; +#endif return 0; } diff --git a/src/xrpld/app/misc/NetworkOPs.cpp b/src/xrpld/app/misc/NetworkOPs.cpp index cd653120c7..996a1fdf74 100644 --- a/src/xrpld/app/misc/NetworkOPs.cpp +++ b/src/xrpld/app/misc/NetworkOPs.cpp @@ -2493,6 +2493,18 @@ NetworkOPsImp::getServerInfo(bool human, bool admin, bool counters) x[jss::expiration] = "unknown"; } } + +#if defined(GIT_COMMIT_HASH) || defined(GIT_BRANCH) + { + auto& x = (info[jss::git] = Json::objectValue); +#ifdef GIT_COMMIT_HASH + x[jss::hash] = GIT_COMMIT_HASH; +#endif +#ifdef GIT_BRANCH + x[jss::branch] = GIT_BRANCH; +#endif + } +#endif } info[jss::io_latency_ms] = static_cast(app_.getIOLatency().count());