]> git.ipfire.org Git - thirdparty/git.git/commitdiff
refs: include committer info in `ref_update` struct
authorKarthik Nayak <karthik.188@gmail.com>
Mon, 16 Dec 2024 16:44:26 +0000 (17:44 +0100)
committerJunio C Hamano <gitster@pobox.com>
Mon, 16 Dec 2024 17:45:32 +0000 (09:45 -0800)
The reference backends obtain the committer information from
`git_committer_info(0)` when adding a reflog. The upcoming patches
introduce support for migrating reflogs between the reference backends.
This requires an interface to creating reflogs, including custom
committer information.

Add a new field `committer_info` to the `ref_update` struct, which is
then used by the reference backends. If there is no `committer_info`
provided, the reference backends default to using
`git_committer_info(0)`. The field itself cannot be set to
`git_committer_info(0)` since the values are dynamic and must be
obtained right when the reflog is being committed.

Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
refs.c
refs/files-backend.c
refs/refs-internal.h
refs/reftable-backend.c

diff --git a/refs.c b/refs.c
index 762f3e324d59c60cd4f05c2f257e54de8deb00e5..f003e51c6bf5229bfbce8ce61ffad7cdba0572e0 100644 (file)
--- a/refs.c
+++ b/refs.c
@@ -1151,6 +1151,7 @@ void ref_transaction_free(struct ref_transaction *transaction)
 
        for (i = 0; i < transaction->nr; i++) {
                free(transaction->updates[i]->msg);
+               free(transaction->updates[i]->committer_info);
                free((char *)transaction->updates[i]->new_target);
                free((char *)transaction->updates[i]->old_target);
                free(transaction->updates[i]);
index 64f51f0da905a9a8a1ac4109c6b0a9a85a355db7..6078668c99ee254e794e3ba49689aa34e6022efd 100644 (file)
@@ -1858,6 +1858,9 @@ static int log_ref_write_fd(int fd, const struct object_id *old_oid,
        struct strbuf sb = STRBUF_INIT;
        int ret = 0;
 
+       if (!committer)
+               committer = git_committer_info(0);
+
        strbuf_addf(&sb, "%s %s %s", oid_to_hex(old_oid), oid_to_hex(new_oid), committer);
        if (msg && *msg) {
                strbuf_addch(&sb, '\t');
@@ -1871,8 +1874,10 @@ static int log_ref_write_fd(int fd, const struct object_id *old_oid,
 }
 
 static int files_log_ref_write(struct files_ref_store *refs,
-                              const char *refname, const struct object_id *old_oid,
-                              const struct object_id *new_oid, const char *msg,
+                              const char *refname,
+                              const struct object_id *old_oid,
+                              const struct object_id *new_oid,
+                              const char *committer_info, const char *msg,
                               int flags, struct strbuf *err)
 {
        int logfd, result;
@@ -1889,8 +1894,7 @@ static int files_log_ref_write(struct files_ref_store *refs,
 
        if (logfd < 0)
                return 0;
-       result = log_ref_write_fd(logfd, old_oid, new_oid,
-                                 git_committer_info(0), msg);
+       result = log_ref_write_fd(logfd, old_oid, new_oid, committer_info, msg);
        if (result) {
                struct strbuf sb = STRBUF_INIT;
                int save_errno = errno;
@@ -1974,8 +1978,7 @@ static int commit_ref_update(struct files_ref_store *refs,
        files_assert_main_repository(refs, "commit_ref_update");
 
        clear_loose_ref_cache(refs);
-       if (files_log_ref_write(refs, lock->ref_name,
-                               &lock->old_oid, oid,
+       if (files_log_ref_write(refs, lock->ref_name, &lock->old_oid, oid, NULL,
                                logmsg, flags, err)) {
                char *old_msg = strbuf_detach(err, NULL);
                strbuf_addf(err, "cannot update the ref '%s': %s",
@@ -2007,9 +2010,9 @@ static int commit_ref_update(struct files_ref_store *refs,
                if (head_ref && (head_flag & REF_ISSYMREF) &&
                    !strcmp(head_ref, lock->ref_name)) {
                        struct strbuf log_err = STRBUF_INIT;
-                       if (files_log_ref_write(refs, "HEAD",
-                                               &lock->old_oid, oid,
-                                               logmsg, flags, &log_err)) {
+                       if (files_log_ref_write(refs, "HEAD", &lock->old_oid,
+                                               oid, NULL, logmsg, flags,
+                                               &log_err)) {
                                error("%s", log_err.buf);
                                strbuf_release(&log_err);
                        }
@@ -2969,7 +2972,8 @@ static int parse_and_write_reflog(struct files_ref_store *refs,
        }
 
        if (files_log_ref_write(refs, lock->ref_name, &lock->old_oid,
-                               &update->new_oid, update->msg, update->flags, err)) {
+                               &update->new_oid, update->committer_info,
+                               update->msg, update->flags, err)) {
                char *old_msg = strbuf_detach(err, NULL);
 
                strbuf_addf(err, "cannot update the ref '%s': %s",
index 58aa56d1b27c85d606ed7c8c0d908e4b87d1066b..0fd95cdacd99e4a728c22f5286f6b3f0f360c110 100644 (file)
@@ -113,6 +113,7 @@ struct ref_update {
        void *backend_data;
        unsigned int type;
        char *msg;
+       char *committer_info;
 
        /*
         * If this ref_update was split off of a symref update via
index 647ef9b05b1dc9a376ed054330b487f7595c5caa..e882602487c66261d586a94101bb1b4e9a2ed60e 100644 (file)
@@ -1379,11 +1379,21 @@ static int write_transaction_table(struct reftable_writer *writer, void *cb_data
                        }
 
                        if (create_reflog) {
+                               struct ident_split c;
+
                                ALLOC_GROW(logs, logs_nr + 1, logs_alloc);
                                log = &logs[logs_nr++];
                                memset(log, 0, sizeof(*log));
 
-                               fill_reftable_log_record(log, &committer_ident);
+                               if (u->committer_info) {
+                                       if (split_ident_line(&c, u->committer_info,
+                                                            strlen(u->committer_info)))
+                                               BUG("failed splitting committer info");
+                               } else {
+                                       c = committer_ident;
+                               }
+
+                               fill_reftable_log_record(log, &c);
                                log->update_index = ts;
                                log->refname = xstrdup(u->refname);
                                memcpy(log->value.update.new_hash,