Write a generated client extension module into `path` as a managed block. * * The module is generated from the tool registry rather than shipped (see * src/cli/client_adapter.h), and it goes in as a MARKED BLOCK rather than a * whole-file write: the directory is auto-loaded by the client, so a user may * legitimately keep their own module there, and clobbering it would be the * install routi
| 8000 | * than a skip, because a silently absent extension is exactly the failure mode |
| 8001 | * that left #616 a no-op for six weeks. */ |
| 8002 | static void install_generated_client_extension(const char *label, const char *path, |
| 8003 | const char *binary_path, |
| 8004 | char *(*generate)(const char *), bool dry_run) { |
| 8005 | if (g_install_plan) { |
| 8006 | plan_record(label, "extension", path); |
| 8007 | return; |
| 8008 | } |
| 8009 | char *content = generate(binary_path); |
| 8010 | if (!content) { |
| 8011 | record_agent_config_error(false, label, "extension_generate", path); |
| 8012 | return; |
| 8013 | } |
| 8014 | bool installed = true; |
| 8015 | if (!dry_run && (!prepare_config_parent(path) || |
| 8016 | cbm_text_upsert_managed_block(path, CBM_ADAPTER_MARKER_START, |
| 8017 | CBM_ADAPTER_MARKER_END, content) != 0)) { |
| 8018 | installed = false; |
| 8019 | record_agent_config_error(false, label, "extension_install", path); |
| 8020 | } |
| 8021 | free(content); |
| 8022 | if (installed) { |
| 8023 | printf(" extension: %s\n", path); |
| 8024 | } |
| 8025 | } |
| 8026 | |
| 8027 | /* Remove only OUR marked block, never the file: a user's own module may share |
| 8028 | * it, and owned removal is the convention every other uninstall path here |
no test coverage detected