]> git.ipfire.org Git - thirdparty/git.git/commitdiff
refs: allow to skip creation of reflog entries
authorPatrick Steinhardt <ps@pks.im>
Thu, 6 Jun 2024 05:29:11 +0000 (07:29 +0200)
committerJunio C Hamano <gitster@pobox.com>
Thu, 6 Jun 2024 16:04:31 +0000 (09:04 -0700)
The ref backends do not have any way to disable the creation of reflog
entries. This will be required for upcoming ref format migration logic
so that we do not create any entries that didn't exist in the original
ref database.

Provide a new `REF_SKIP_CREATE_REFLOG` flag that allows the caller to
disable reflog entry creation.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
refs.c
refs.h
refs/files-backend.c
refs/reftable-backend.c
t/helper/test-ref-store.c

diff --git a/refs.c b/refs.c
index 423684b8b86c0ea99826e101c1ef4de48b5d72d8..fa3b0a82d45a8ebaa8ac8b41f5fd16a434f8de34 100644 (file)
--- a/refs.c
+++ b/refs.c
@@ -1194,6 +1194,12 @@ int ref_transaction_update(struct ref_transaction *transaction,
 {
        assert(err);
 
+       if ((flags & REF_FORCE_CREATE_REFLOG) &&
+           (flags & REF_SKIP_CREATE_REFLOG)) {
+               strbuf_addstr(err, _("refusing to force and skip creation of reflog"));
+               return -1;
+       }
+
        if (!(flags & REF_SKIP_REFNAME_VERIFICATION) &&
            ((new_oid && !is_null_oid(new_oid)) ?
                     check_refname_format(refname, REFNAME_ALLOW_ONELEVEL) :
diff --git a/refs.h b/refs.h
index a7afa9bede3ab0428e9f39b8fb51e14dddfdd4b4..50a2b3ab098fc571ef2ea1a42fe3cd095fd1a9db 100644 (file)
--- a/refs.h
+++ b/refs.h
@@ -659,13 +659,19 @@ struct ref_transaction *ref_store_transaction_begin(struct ref_store *refs,
  */
 #define REF_SKIP_REFNAME_VERIFICATION (1 << 11)
 
+/*
+ * Skip creation of a reflog entry, even if it would have otherwise been
+ * created.
+ */
+#define REF_SKIP_CREATE_REFLOG (1 << 12)
+
 /*
  * Bitmask of all of the flags that are allowed to be passed in to
  * ref_transaction_update() and friends:
  */
 #define REF_TRANSACTION_UPDATE_ALLOWED_FLAGS                                  \
        (REF_NO_DEREF | REF_FORCE_CREATE_REFLOG | REF_SKIP_OID_VERIFICATION | \
-        REF_SKIP_REFNAME_VERIFICATION)
+        REF_SKIP_REFNAME_VERIFICATION | REF_SKIP_CREATE_REFLOG)
 
 /*
  * Add a reference update to transaction. `new_oid` is the value that
index 73380d7e991c93eb9be4402881adc88332bac4e1..bd0d63bcba9a48c230cbb8d531708b61dda80386 100644 (file)
@@ -1750,6 +1750,9 @@ static int files_log_ref_write(struct files_ref_store *refs,
 {
        int logfd, result;
 
+       if (flags & REF_SKIP_CREATE_REFLOG)
+               return 0;
+
        if (log_all_ref_updates == LOG_REFS_UNSET)
                log_all_ref_updates = is_bare_repository() ? LOG_REFS_NONE : LOG_REFS_NORMAL;
 
@@ -2251,6 +2254,7 @@ static int split_head_update(struct ref_update *update,
        struct ref_update *new_update;
 
        if ((update->flags & REF_LOG_ONLY) ||
+           (update->flags & REF_SKIP_CREATE_REFLOG) ||
            (update->flags & REF_IS_PRUNING) ||
            (update->flags & REF_UPDATE_VIA_HEAD))
                return 0;
index f6edfdf5b3686a3f5408b87292e5b34204228a3e..bffed9257f3bfb40f60459ba2a2abc81d0df1bee 100644 (file)
@@ -1103,7 +1103,8 @@ static int write_transaction_table(struct reftable_writer *writer, void *cb_data
 
                        if (ret)
                                goto done;
-               } else if (u->flags & REF_HAVE_NEW &&
+               } else if (!(u->flags & REF_SKIP_CREATE_REFLOG) &&
+                          (u->flags & REF_HAVE_NEW) &&
                           (u->flags & REF_FORCE_CREATE_REFLOG ||
                            should_write_log(&arg->refs->base, u->refname))) {
                        struct reftable_log_record *log;
index c9efd74c2b59ef5ef148639eb1e083d3623be977..ad24300170e71552f8f001f5e3a737562e606f6f 100644 (file)
@@ -126,6 +126,7 @@ static struct flag_definition transaction_flags[] = {
        FLAG_DEF(REF_FORCE_CREATE_REFLOG),
        FLAG_DEF(REF_SKIP_OID_VERIFICATION),
        FLAG_DEF(REF_SKIP_REFNAME_VERIFICATION),
+       FLAG_DEF(REF_SKIP_CREATE_REFLOG),
        { NULL, 0 }
 };