]> git.ipfire.org Git - thirdparty/git.git/commitdiff
hook: introduce hook_config_cache_entry for per-hook data
authorAdrian Ratiu <adrian.ratiu@collabora.com>
Wed, 25 Mar 2026 19:55:00 +0000 (21:55 +0200)
committerJunio C Hamano <gitster@pobox.com>
Wed, 25 Mar 2026 21:00:47 +0000 (14:00 -0700)
Replace the bare `char *command` util pointer stored in each string_list
item with a heap-allocated `struct hook_config_cache_entry` that carries
that command string.

This is just a refactoring with no behavior changes, to give the cache
entry room to grow, so it can carry the additional hook metadata we'll
be adding in the following commits.

Signed-off-by: Adrian Ratiu <adrian.ratiu@collabora.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
hook.c

diff --git a/hook.c b/hook.c
index dc0c3de667b871c844dab491df2a5ac28558ea7f..54f99f4989f46bc90b48b942c3c9d01a0b401f2d 100644 (file)
--- a/hook.c
+++ b/hook.c
@@ -108,6 +108,15 @@ static void list_hooks_add_default(struct repository *r, const char *hookname,
        string_list_append(hook_list, hook_path)->util = h;
 }
 
+/*
+ * Cache entry stored as the .util pointer of string_list items inside the
+ * hook config cache. For now carries only the command for the hook. Next
+ * commits will add more data.
+ */
+struct hook_config_cache_entry {
+       char *command;
+};
+
 /*
  * Callback struct to collect all hook.* keys in a single config pass.
  * commands: friendly-name to command map.
@@ -202,7 +211,12 @@ void hook_cache_clear(struct strmap *cache)
 
        strmap_for_each_entry(cache, &iter, e) {
                struct string_list *hooks = e->value;
-               string_list_clear(hooks, 1); /* free util (command) pointers */
+               for (size_t i = 0; i < hooks->nr; i++) {
+                       struct hook_config_cache_entry *entry = hooks->items[i].util;
+                       free(entry->command);
+                       free(entry);
+               }
+               string_list_clear(hooks, 0);
                free(hooks);
        }
        strmap_clear(cache, 0);
@@ -232,6 +246,7 @@ static void build_hook_config_map(struct repository *r, struct strmap *cache)
 
                for (size_t i = 0; i < hook_names->nr; i++) {
                        const char *hname = hook_names->items[i].string;
+                       struct hook_config_cache_entry *entry;
                        char *command;
 
                        /* filter out disabled hooks */
@@ -245,9 +260,10 @@ static void build_hook_config_map(struct repository *r, struct strmap *cache)
                                      "'hook.%s.event' must be removed;"
                                      " aborting."), hname, hname);
 
-                       /* util stores the command; owned by the cache. */
-                       string_list_append(hooks, hname)->util =
-                               xstrdup(command);
+                       /* util stores a cache entry; owned by the cache. */
+                       CALLOC_ARRAY(entry, 1);
+                       entry->command = xstrdup(command);
+                       string_list_append(hooks, hname)->util = entry;
                }
 
                strmap_put(cache, e->key, hooks);
@@ -309,7 +325,7 @@ static void list_hooks_add_configured(struct repository *r,
        /* Iterate through configured hooks and initialize internal states */
        for (size_t i = 0; configured_hooks && i < configured_hooks->nr; i++) {
                const char *friendly_name = configured_hooks->items[i].string;
-               const char *command = configured_hooks->items[i].util;
+               struct hook_config_cache_entry *entry = configured_hooks->items[i].util;
                struct hook *hook;
 
                CALLOC_ARRAY(hook, 1);
@@ -327,7 +343,7 @@ static void list_hooks_add_configured(struct repository *r,
 
                hook->kind = HOOK_CONFIGURED;
                hook->u.configured.friendly_name = xstrdup(friendly_name);
-               hook->u.configured.command = xstrdup(command);
+               hook->u.configured.command = xstrdup(entry->command);
 
                string_list_append(list, friendly_name)->util = hook;
        }