hook: move is_known_hook() to hook.c for wider use

Move is_known_hook() from builtin/hook.c (static) into hook.c and
export it via hook.h so it can be reused.

Make it return bool and the iterator `h` for clarity (iterate hooks).

Both meson.build and the Makefile are updated to reflect that the
header is now used by libgit, not the builtin sources.

The next commit will use this to reject hook friendly-names that
collide with known event names.

Co-authored-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Adrian Ratiu <adrian.ratiu@collabora.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Adrian Ratiu
2026-04-10 12:06:05 +03:00
committed by Junio C Hamano
parent 5e57b209ff
commit 2eb541e8f2
5 changed files with 29 additions and 23 deletions

View File

@@ -2675,7 +2675,7 @@ git$X: git.o GIT-LDFLAGS $(BUILTIN_OBJS) $(GITLIBS)
help.sp help.s help.o: command-list.h
builtin/bugreport.sp builtin/bugreport.s builtin/bugreport.o: hook-list.h
builtin/hook.sp builtin/hook.s builtin/hook.o: hook-list.h
hook.sp hook.s hook.o: hook-list.h
builtin/help.sp builtin/help.s builtin/help.o: config-list.h GIT-PREFIX
builtin/help.sp builtin/help.s builtin/help.o: EXTRA_CPPFLAGS = \

View File

@@ -4,7 +4,6 @@
#include "environment.h"
#include "gettext.h"
#include "hook.h"
#include "hook-list.h"
#include "parse-options.h"
#define BUILTIN_HOOK_RUN_USAGE \
@@ -13,15 +12,6 @@
#define BUILTIN_HOOK_LIST_USAGE \
N_("git hook list [--allow-unknown-hook-name] [-z] [--show-scope] <hook-name>")
static int is_known_hook(const char *name)
{
const char **p;
for (p = hook_name_list; *p; p++)
if (!strcmp(*p, name))
return 1;
return 0;
}
static const char * const builtin_hook_usage[] = {
BUILTIN_HOOK_RUN_USAGE,
BUILTIN_HOOK_LIST_USAGE,

10
hook.c
View File

@@ -5,6 +5,7 @@
#include "environment.h"
#include "gettext.h"
#include "hook.h"
#include "hook-list.h"
#include "parse.h"
#include "path.h"
#include "run-command.h"
@@ -12,6 +13,15 @@
#include "strbuf.h"
#include "strmap.h"
bool is_known_hook(const char *name)
{
const char **h;
for (h = hook_name_list; *h; h++)
if (!strcmp(*h, name))
return true;
return false;
}
const char *find_hook(struct repository *r, const char *name)
{
static struct strbuf path = STRBUF_INIT;

6
hook.h
View File

@@ -234,6 +234,12 @@ void hook_free(void *p, const char *str);
*/
void hook_cache_clear(struct strmap *cache);
/**
* Returns true if `name` is a recognized hook event name
* (e.g. "pre-commit", "post-receive").
*/
bool is_known_hook(const char *name);
/**
* Returns the path to the hook file, or NULL if the hook is missing
* or disabled. Note that this points to static storage that will be

View File

@@ -563,6 +563,18 @@ libgit_sources += custom_target(
env: script_environment,
)
libgit_sources += custom_target(
input: 'Documentation/githooks.adoc',
output: 'hook-list.h',
command: [
shell,
meson.current_source_dir() + '/tools/generate-hooklist.sh',
meson.current_source_dir(),
'@OUTPUT@',
],
env: script_environment,
)
builtin_sources = [
'builtin/add.c',
'builtin/am.c',
@@ -739,18 +751,6 @@ builtin_sources += custom_target(
env: script_environment,
)
builtin_sources += custom_target(
input: 'Documentation/githooks.adoc',
output: 'hook-list.h',
command: [
shell,
meson.current_source_dir() + '/tools/generate-hooklist.sh',
meson.current_source_dir(),
'@OUTPUT@',
],
env: script_environment,
)
# This contains the variables for GIT-BUILD-OPTIONS, which we use to propagate
# build options to our tests.
build_options_config = configuration_data()