In many places in the code we do not have access to the individual fields
in the committer data. Instead we might only have access to prebaked data
such as what is returned by git_committer_info() containing a string
that consists of email, timestamp, zone etc.

This makes it inconvenient to use transaction_update_reflog since it means
you would have to first parse git_committer_info before you can call
update_reflog.

Add a new flag REFLOG_COMMITTER_INFO_IS_VALID to _update_reflog to tell it
that we pass in a fully prebaked committer info string that can be used as is.

At the same time, also go over and change all references from email
to id where the code actually refers to a committer id and not just an email
address. I.e. where the string is : NAME <EMAIL>

Signed-off-by: Ronnie Sahlberg <sahlb...@google.com>
---
 builtin/reflog.c | 19 +++++++++++++------
 refs.c           | 21 ++++++++++++---------
 refs.h           | 25 +++++++++++++++++++++++--
 3 files changed, 48 insertions(+), 17 deletions(-)

diff --git a/builtin/reflog.c b/builtin/reflog.c
index f11fee3..c6f3a2f 100644
--- a/builtin/reflog.c
+++ b/builtin/reflog.c
@@ -292,7 +292,7 @@ static int unreachable(struct expire_reflog_cb *cb, struct 
commit *commit, unsig
 }
 
 static int expire_reflog_ent(unsigned char *osha1, unsigned char *nsha1,
-               const char *email, unsigned long timestamp, int tz,
+               const char *id, unsigned long timestamp, int tz,
                const char *message, void *cb_data)
 {
        struct expire_reflog_cb *cb = cb_data;
@@ -320,9 +320,14 @@ static int expire_reflog_ent(unsigned char *osha1, 
unsigned char *nsha1,
                goto prune;
 
        if (cb->t) {
+               struct reflog_committer_info ci;
+
+               memset(&ci, 0, sizeof(ci));
+               ci.id = id;
+               ci.timestamp = timestamp;
+               ci.tz = tz;
                if (transaction_update_reflog(cb->t, cb->refname, nsha1, osha1,
-                                             email, timestamp, tz, message, 0,
-                                             &err))
+                                             &ci, message, 0, &err))
                        return -1;
                hashcpy(cb->last_kept_sha1, nsha1);
        }
@@ -356,6 +361,7 @@ static int expire_reflog(const char *ref, const unsigned 
char *sha1, int unused,
        struct expire_reflog_cb cb;
        struct commit *tip_commit;
        struct commit_list *tips;
+       struct reflog_committer_info ci;
        int status = 0;
 
        memset(&cb, 0, sizeof(cb));
@@ -368,9 +374,10 @@ static int expire_reflog(const char *ref, const unsigned 
char *sha1, int unused,
                status |= error("%s", err.buf);
                goto cleanup;
        }
+
+       memset(&ci, 0, sizeof(ci));
        if (transaction_update_reflog(cb.t, cb.refname, null_sha1, null_sha1,
-                                     NULL, 0, 0, NULL, REFLOG_TRUNCATE,
-                                     &err)) {
+                                     &ci, NULL, REFLOG_TRUNCATE, &err)) {
                status |= error("%s", err.buf);
                goto cleanup;
        }
@@ -671,7 +678,7 @@ static int cmd_reflog_expire(int argc, const char **argv, 
const char *prefix)
 }
 
 static int count_reflog_ent(unsigned char *osha1, unsigned char *nsha1,
-               const char *email, unsigned long timestamp, int tz,
+               const char *id, unsigned long timestamp, int tz,
                const char *message, void *cb_data)
 {
        struct cmd_reflog_expire_cb *cb = cb_data;
diff --git a/refs.c b/refs.c
index 2662ef6..41cb51d 100644
--- a/refs.c
+++ b/refs.c
@@ -3096,7 +3096,7 @@ struct read_ref_at_cb {
 };
 
 static int read_ref_at_ent(unsigned char *osha1, unsigned char *nsha1,
-               const char *email, unsigned long timestamp, int tz,
+               const char *id, unsigned long timestamp, int tz,
                const char *message, void *cb_data)
 {
        struct read_ref_at_cb *cb = cb_data;
@@ -3143,7 +3143,7 @@ static int read_ref_at_ent(unsigned char *osha1, unsigned 
char *nsha1,
 }
 
 static int read_ref_at_ent_oldest(unsigned char *osha1, unsigned char *nsha1,
-                                 const char *email, unsigned long timestamp,
+                                 const char *id, unsigned long timestamp,
                                  int tz, const char *message, void *cb_data)
 {
        struct read_ref_at_cb *cb = cb_data;
@@ -3491,8 +3491,7 @@ int transaction_update_reflog(struct ref_transaction 
*transaction,
                              const char *refname,
                              const unsigned char *new_sha1,
                              const unsigned char *old_sha1,
-                             const char *email,
-                             unsigned long timestamp, int tz,
+                             struct reflog_committer_info *ci,
                              const char *msg, int flags,
                              struct strbuf *err)
 {
@@ -3521,13 +3520,17 @@ int transaction_update_reflog(struct ref_transaction 
*transaction,
        hashcpy(update->new_sha1, new_sha1);
        hashcpy(update->old_sha1, old_sha1);
        update->reflog_fd = -1;
-       if (email) {
+       if (flags & REFLOG_COMMITTER_INFO_IS_VALID) {
+               if (!ci->committer_info)
+                       die("BUG: committer_info is NULL in reflog update");
+               update->committer = xstrdup(ci->committer_info);
+       } else if (ci->id) {
                struct strbuf buf = STRBUF_INIT;
-               char sign = (tz < 0) ? '-' : '+';
-               int zone = (tz < 0) ? (-tz) : tz;
+               char sign = (ci->tz < 0) ? '-' : '+';
+               int zone = (ci->tz < 0) ? (-ci->tz) : ci->tz;
 
-               strbuf_addf(&buf, "%s %lu %c%04d", email, timestamp, sign,
-                           zone);
+               strbuf_addf(&buf, "%s %lu %c%04d", ci->id,
+                           ci->timestamp, sign, zone);
                update->committer = xstrdup(buf.buf);
                strbuf_release(&buf);
        }
diff --git a/refs.h b/refs.h
index 0172f48..23067a2 100644
--- a/refs.h
+++ b/refs.h
@@ -309,6 +309,28 @@ int transaction_delete_sha1(struct ref_transaction 
*transaction,
  * Flags >= 0x100 are reserved for internal use.
  */
 #define REFLOG_TRUNCATE 0x01
+#define REFLOG_COMMITTER_INFO_IS_VALID 0x02
+
+/*
+ * Committer data provided to reflog updates.
+ * If flags contain REFLOG_COMMITTER_DATA_IS_VALID then
+ * then the structure contains a prebaked committer string
+ * just like git_committer_info() would return.
+ *
+ * If flags does not contain REFLOG_COMMITTER_DATA_IS_VALID
+ * then the committer info string will be generated using the passed
+ * email, timestamp and tz fields.
+ * This is useful for example from reflog iterators where you are passed
+ * these fields individually and not as a prebaked git_committer_info()
+ * string.
+ */
+struct reflog_committer_info {
+       const char *committer_info;
+
+       const char *id;
+       unsigned long timestamp;
+       int tz;
+};
 /*
  * Append a reflog entry for refname. If the REFLOG_TRUNCATE flag is set
  * this update will first truncate the reflog before writing the entry.
@@ -318,8 +340,7 @@ int transaction_update_reflog(struct ref_transaction 
*transaction,
                              const char *refname,
                              const unsigned char *new_sha1,
                              const unsigned char *old_sha1,
-                             const char *email,
-                             unsigned long timestamp, int tz,
+                             struct reflog_committer_info *ci,
                              const char *msg, int flags,
                              struct strbuf *err);
 
-- 
2.0.1.523.g0041e8a

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to