feat(dirty-content-fingerprint): controller/scheduler show fingerprint in --version

controller/main.c and scheduler/src/main.c now compose argp_program_version
via a genuinely separate buffer/call to xce_compose_version_ex() (reading
STR(VERSION_DIRTY_FINGERPRINT), matching the existing commit_id/build_time
macro pattern). The startup-log composition call site -- same function,
same arguments, same buffer -- is left completely unchanged in both files.
controller/testsuite/test.c (xce_test, confirmed to have no startup log)
gets a direct in-place swap. All three files carry explicit comments
marking the --version/startup-log divergence as deliberate.

Verified independently by review with real builds and live daemon starts:
--version shows <commit>-<fingerprint> for all three binaries, matching
compile_commands.json; live startup logs for both daemons show the
unchanged old <commit>-dirty format with the fingerprint never present.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Rongsong Shen 2026-08-21 05:42:11 +00:00
parent 7ebcba6d49
commit fd62e26bce
No known key found for this signature in database
GPG key ID: 5BCDAAE0123E9FE2
4 changed files with 49 additions and 8 deletions

View file

@ -322,6 +322,13 @@ int main(int argc, char* argv[])
* it outlives this point in main() (contract documented on
* xce_compose_version() in utils.c). */
static char version_buf[128];
/* dirty-content-fingerprint task 3.2: SEPARATE buffer/composition, used
* ONLY for argp_program_version (--version/-V). version_buf above is
* left completely untouched -- its own xce_compose_version() call and
* the startup INFO log line reading it (below) are unaffected by this
* feature, per Requirement 3.2. This divergence (the two call sites now
* showing different strings) is deliberate, not an oversight. */
static char version_display_buf[128];
/* Capture the NULL-terminated argv for self-restart BEFORE argp_parse so a
* later demotion/rejoin convergence can execv() the same image (Req 1.3). */
@ -331,7 +338,16 @@ int main(int argc, char* argv[])
* pointer when --version/-V is processed. */
xce_compose_version(version_buf, sizeof(version_buf), "xce v0.0.1-",
STR(VERSION_COMMIT_ID), STR(VERSION_BUILD_TIME));
argp_program_version = version_buf;
/* dirty-content-fingerprint task 3.2: --version-only composition --
* appends the dirty_fingerprint suffix (if any) on top of the same
* commit/build_time inputs. Do NOT fold this into version_buf above; the
* startup INFO log must keep showing the original, fingerprint-less
* format (Req 3.2). */
xce_compose_version_ex(version_display_buf, sizeof(version_display_buf),
"xce v0.0.1-", STR(VERSION_COMMIT_ID),
STR(VERSION_BUILD_TIME),
STR(VERSION_DIRTY_FINGERPRINT));
argp_program_version = version_display_buf;
memset(&arguments, 0x0, sizeof(arguments));
arguments.conf_keep_n = 2;

View file

@ -4394,10 +4394,18 @@ int main(int argc, char* argv[])
memset(&arguments, 0x0, sizeof(arguments));
/* Must run before argp_parse(): argp reads argp_program_version by
/* dirty-content-fingerprint task 3.2: xce_test is not a daemon -- it has
* no startup log line at all (see anatomy/build-time-versioning notes),
* so there is no second call site to keep divergent here (unlike
* controller/main.c and scheduler/src/main.c, which each keep a
* separate, untouched xce_compose_version() buffer for their startup
* INFO log per Req 3.2). version_buf can safely be composed directly
* via xce_compose_version_ex() to pick up the dirty_fingerprint suffix.
* Must run before argp_parse(): argp reads argp_program_version by
* pointer when --version/-V is processed. */
xce_compose_version(version_buf, sizeof(version_buf), "xce v0.0.1-",
STR(VERSION_COMMIT_ID), STR(VERSION_BUILD_TIME));
xce_compose_version_ex(version_buf, sizeof(version_buf), "xce v0.0.1-",
STR(VERSION_COMMIT_ID), STR(VERSION_BUILD_TIME),
STR(VERSION_DIRTY_FINGERPRINT));
argp_program_version = version_buf;
argp_parse(&argp, argc, argv, 0, 0, &arguments);