Re: [PATCH] reset cached ident date before creating objects
From: Junio C Hamano <hidden>
Date: 2016-08-01 17:58:55
Junio C Hamano [off-list ref] writes:
Jeff King [off-list ref] writes:quoted
quoted
So maybe we would have to put reset_ident_date() at the end of the function instead, at least after git_committer_info() is called.Yes, although "reset and end" still feels a bit weird to me. I'd almost prefer to just have long-running programs insert resets at strategic points.Certainly "reset at the end" feels weird but it can be explained as "for a one-shot thing we use the first time of the default date and it gives a consistent timestamp; conceptually, things that make multiple commits are like doing that one-shot thing multiple times in a row." When viewed that way, it is not _too_ bad, I would guess.
An interdiff to what we queued previously would look like this: builtin/tag.c | 11 ++++++++++- commit.c | 15 ++++++++++++--- 2 files changed, 22 insertions(+), 4 deletions(-)
diff --git a/builtin/tag.c b/builtin/tag.c
index 5dccae3..e852ded 100644
--- a/builtin/tag.c
+++ b/builtin/tag.c@@ -225,7 +225,6 @@ static void create_tag(const unsigned char *object, const char *tag, if (type <= OBJ_NONE) die(_("bad object type.")); - reset_ident_date(); header_len = snprintf(header_buf, sizeof(header_buf), "object %s\n" "type %s\n"
@@ -287,6 +286,16 @@ static void create_tag(const unsigned char *object, const char *tag, unlink_or_warn(path); free(path); } + + /* + * Reset the default timestamp for the next call to create tag/commit + * object, so that they get their own fresh timestamp. + * + * NOTE NOTE NOTE! if you are libifying this function later by + * turning exit/die in the above code to return an error, be + * sure to jump here to make this call happen. + */ + reset_ident_date(); } struct msg_arg {
diff --git a/commit.c b/commit.c
index b02f3c4..db24013 100644
--- a/commit.c
+++ b/commit.c@@ -1543,7 +1543,6 @@ int commit_tree_extended(const char *msg, size_t msg_len, } /* Person/date information */ - reset_ident_date(); if (!author) author = git_author_info(IDENT_STRICT); strbuf_addf(&buffer, "author %s\n", author);
@@ -1564,11 +1563,21 @@ int commit_tree_extended(const char *msg, size_t msg_len, if (encoding_is_utf8 && !verify_utf8(&buffer)) fprintf(stderr, commit_utf8_warn); - if (sign_commit && do_sign_commit(&buffer, sign_commit)) - return -1; + if (sign_commit && do_sign_commit(&buffer, sign_commit)) { + result = -1; + goto out; + } result = write_sha1_file(buffer.buf, buffer.len, commit_type, ret); + +out: strbuf_release(&buffer); + + /* + * Reset the default timestamp for the next call to create tag/commit + * object, so that they get their own fresh timestamp. + */ + reset_ident_date(); return result; }