refs: allow skipping the reference-transaction hook

The reference-transaction hook is executing whenever we prepare, commit or abort a reference transaction. While this is mostly intentional, in case of the files backend we're leaking the implementation detail that the store is in fact a composite store with one loose and one packed backend to the caller. So while we want to execute the hook for all logical updates, executing it for such implementation details is unexpected. Prepare for a fix by adding a new flag which allows to skip execution of the hook. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Patrick Steinhardt committed Jan 17, 2022 at 09:12 UTC 958fbc74e3d0fcc88b2065190e23db556a963644
2 files changed +8
refs.c
+3
@@ -2084,6 +2084,9 @@ static int run_transaction_hook(struct ref_transaction *transaction,
2084 const char *hook;
2085 int ret = 0, i;
2086
2087 + if (transaction->flags & REF_TRANSACTION_SKIP_HOOK)
2088 + return 0;
2089 +
2090 hook = find_hook("reference-transaction");
2091 if (!hook)
2092 return ret;
refs.h
+5
@@ -568,6 +568,11 @@ enum action_on_err {
568 UPDATE_REFS_QUIET_ON_ERR
569 };
570
571 +/*
572 + * Skip executing the reference-transaction hook.
573 + */
574 +#define REF_TRANSACTION_SKIP_HOOK (1 << 0)
575 +
576 /*
577 * Begin a reference transaction. The reference transaction must
578 * be freed by calling ref_transaction_free().