Hi Emily
On 09/09/2020 01:49, Emily Shaffer wrote:
As part of the adoption of config-based hooks, teach run_commit_hook()
to call hook.h instead of run-command.h. This covers 'pre-commit',
'commit-msg', and 'prepare-commit-msg'. Additionally, ask the hook
library - not run-command - whether any hooks will be run, as it's
possible hooks may exist in the config but not the hookdir.
Signed-off-by: Emily Shaffer <emilyshaffer@xxxxxxxxxx>
---
builtin/commit.c | 3 ++-
builtin/merge.c | 3 ++-
commit.c | 13 ++++++++++++-
t/t7503-pre-commit-and-pre-merge-commit-hooks.sh | 13 +++++++++++++
4 files changed, 29 insertions(+), 3 deletions(-)
diff --git a/builtin/commit.c b/builtin/commit.c
index 69ac78d5e5..a19c6478eb 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -36,6 +36,7 @@
#include "help.h"
#include "commit-reach.h"
#include "commit-graph.h"
+#include "hook.h"
static const char * const builtin_commit_usage[] = {
N_("git commit [<options>] [--] <pathspec>..."),
@@ -985,7 +986,7 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
return 0;
}
- if (!no_verify && find_hook("pre-commit")) {
+ if (!no_verify && hook_exists("pre-commit")) {
/*
* Re-read the index as pre-commit hook could have updated it,
* and write it out as a tree. We must do this before we invoke
diff --git a/builtin/merge.c b/builtin/merge.c
index 74829a838e..c1a9d0083d 100644
--- a/builtin/merge.c
+++ b/builtin/merge.c
@@ -41,6 +41,7 @@
#include "commit-reach.h"
#include "wt-status.h"
#include "commit-graph.h"
+#include "hook.h"
#define DEFAULT_TWOHEAD (1<<0)
#define DEFAULT_OCTOPUS (1<<1)
@@ -829,7 +830,7 @@ static void prepare_to_commit(struct commit_list *remoteheads)
* and write it out as a tree. We must do this before we invoke
* the editor and after we invoke run_status above.
*/
- if (find_hook("pre-merge-commit"))
+ if (hook_exists("pre-merge-commit"))
discard_cache();
read_cache_from(index_file);
strbuf_addbuf(&msg, &merge_msg);
diff --git a/commit.c b/commit.c
index 4ce8cb38d5..c7a243e848 100644
--- a/commit.c
+++ b/commit.c
@@ -21,6 +21,7 @@
#include "commit-reach.h"
#include "run-command.h"
#include "shallow.h"
+#include "hook.h"
static struct commit_extra_header *read_commit_extra_header_lines(const char *buf, size_t len, const char **);
@@ -1632,8 +1633,13 @@ int run_commit_hook(int editor_is_used, const char *index_file,
{
struct strvec hook_env = STRVEC_INIT;
va_list args;
+ const char *arg;
+ struct strvec hook_args = STRVEC_INIT;
+ struct strbuf hook_name = STRBUF_INIT;
int ret;
+ strbuf_addstr(&hook_name, name);
Seeing this makes me wonder if it would be better for run_hooks() to
take a string for the name rather than an strbuf, I suspect that
virtually all callers have a fixed hook name.
Best Wishes
Phillip
strvec_pushf(&hook_env, "GIT_INDEX_FILE=%s", index_file);
/*
@@ -1643,9 +1649,14 @@ int run_commit_hook(int editor_is_used, const char *index_file,
strvec_push(&hook_env, "GIT_EDITOR=:");
va_start(args, name);
- ret = run_hook_ve(hook_env.v, name, args);
+ while ((arg = va_arg(args, const char *)))
+ strvec_push(&hook_args, arg);
va_end(args);
+
+ ret = run_hooks(hook_env.v, &hook_name, &hook_args);
strvec_clear(&hook_env);
+ strvec_clear(&hook_args);
+ strbuf_release(&hook_name);
return ret;
}
diff --git a/t/t7503-pre-commit-and-pre-merge-commit-hooks.sh b/t/t7503-pre-commit-and-pre-merge-commit-hooks.sh
index b3485450a2..cef8085dcc 100755
--- a/t/t7503-pre-commit-and-pre-merge-commit-hooks.sh
+++ b/t/t7503-pre-commit-and-pre-merge-commit-hooks.sh
@@ -103,6 +103,19 @@ test_expect_success 'with succeeding hook' '
test_cmp expected_hooks actual_hooks
'
+# NEEDSWORK: when 'git hook add' and 'git hook remove' have been added, use that
+# instead
+test_expect_success 'with succeeding hook (config-based)' '
+ test_when_finished "git config --unset hook.pre-commit.command success.sample" &&
+ test_when_finished "rm -f expected_hooks actual_hooks" &&
+ git config hook.pre-commit.command "$HOOKDIR/success.sample" &&
+ echo "$HOOKDIR/success.sample" >expected_hooks &&
+ echo "more" >>file &&
+ git add file &&
+ git commit -m "more" &&
+ test_cmp expected_hooks actual_hooks
+'
+
test_expect_success 'with succeeding hook (merge)' '
test_when_finished "rm -f \"$PREMERGE\" expected_hooks actual_hooks" &&
cp "$HOOKDIR/success.sample" "$PREMERGE" &&