]> git.ipfire.org Git - thirdparty/git.git/commitdiff
am: stop exporting GIT_COMMITTER_DATE
authorPhillip Wood <phillip.wood@dunelm.org.uk>
Mon, 17 Aug 2020 17:40:01 +0000 (18:40 +0100)
committerJunio C Hamano <gitster@pobox.com>
Mon, 17 Aug 2020 18:58:37 +0000 (11:58 -0700)
The implementation of --committer-date-is-author-date exports
GIT_COMMITTER_DATE to override the default committer date but does not
reset GIT_COMMITTER_DATE in the environment after creating the commit
so it is set in the environment of any hooks that get run. We're about
to add the same functionality to the sequencer and do not want to have
GIT_COMMITTER_DATE set when running hooks or exec commands so lets
update commit_tree_extended() to take an explicit committer so we
override the default date without setting GIT_COMMITTER_DATE in the
environment.

Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/am.c
builtin/commit.c
commit.c
commit.h
ident.c
sequencer.c

index e3dfd93c258f6930ac36fa42c6fd9b8c80045576..896cd0f827485193492f6bc036f8c3a7f05b52c4 100644 (file)
@@ -98,6 +98,8 @@ struct am_state {
        char *author_name;
        char *author_email;
        char *author_date;
+       char *committer_name;
+       char *committer_email;
        char *msg;
        size_t msg_len;
 
@@ -130,6 +132,8 @@ struct am_state {
  */
 static void am_state_init(struct am_state *state)
 {
+       const char *committer;
+       struct ident_split id;
        int gpgsign;
 
        memset(state, 0, sizeof(*state));
@@ -150,6 +154,14 @@ static void am_state_init(struct am_state *state)
 
        if (!git_config_get_bool("commit.gpgsign", &gpgsign))
                state->sign_commit = gpgsign ? "" : NULL;
+
+       committer = git_committer_info(IDENT_STRICT);
+       if (split_ident_line(&id, committer, strlen(committer)) < 0)
+               die(_("invalid committer: %s"), committer);
+       state->committer_name =
+               xmemdupz(id.name_begin, id.name_end - id.name_begin);
+       state->committer_email =
+               xmemdupz(id.mail_begin, id.mail_end - id.mail_end);
 }
 
 /**
@@ -161,6 +173,8 @@ static void am_state_release(struct am_state *state)
        free(state->author_name);
        free(state->author_email);
        free(state->author_date);
+       free(state->committer_name);
+       free(state->committer_email);
        free(state->msg);
        argv_array_clear(&state->git_apply_opts);
 }
@@ -1556,7 +1570,7 @@ static void do_commit(const struct am_state *state)
        struct object_id tree, parent, commit;
        const struct object_id *old_oid;
        struct commit_list *parents = NULL;
-       const char *reflog_msg, *author;
+       const char *reflog_msg, *author, *committer = NULL;
        struct strbuf sb = STRBUF_INIT;
 
        if (run_hook_le(NULL, "pre-applypatch", NULL))
@@ -1580,11 +1594,15 @@ static void do_commit(const struct am_state *state)
                        IDENT_STRICT);
 
        if (state->committer_date_is_author_date)
-               setenv("GIT_COMMITTER_DATE",
-                       state->ignore_date ? "" : state->author_date, 1);
-
-       if (commit_tree(state->msg, state->msg_len, &tree, parents, &commit,
-                       author, state->sign_commit))
+               committer = fmt_ident(state->committer_name,
+                                     state->author_email, WANT_COMMITTER_IDENT,
+                                     state->ignore_date ? NULL
+                                                        : state->author_date,
+                                     IDENT_STRICT);
+
+       if (commit_tree_extended(state->msg, state->msg_len, &tree, parents,
+                                &commit, author, committer, state->sign_commit,
+                                NULL))
                die(_("failed to write commit object"));
 
        reflog_msg = getenv("GIT_REFLOG_ACTION");
index d3e7781e658a67d79df781df44a7d716a5094b30..2785344fed621ce3ce62db3bf9c9d26b552d2601 100644 (file)
@@ -1675,8 +1675,8 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
        }
 
        if (commit_tree_extended(sb.buf, sb.len, &active_cache_tree->oid,
-                                parents, &oid, author_ident.buf, sign_commit,
-                                extra)) {
+                                parents, &oid, author_ident.buf, NULL,
+                                sign_commit, extra)) {
                rollback_index_files();
                die(_("failed to write commit object"));
        }
index c7099daeac3b86a91dea48314da446b9494129e7..fb63c22cc199109903c63947074bdd52db916d7d 100644 (file)
--- a/commit.c
+++ b/commit.c
@@ -1324,8 +1324,8 @@ int commit_tree(const char *msg, size_t msg_len, const struct object_id *tree,
        int result;
 
        append_merge_tag_headers(parents, &tail);
-       result = commit_tree_extended(msg, msg_len, tree, parents, ret,
-                                     author, sign_commit, extra);
+       result = commit_tree_extended(msg, msg_len, tree, parents, ret, author,
+                                     NULL, sign_commit, extra);
        free_commit_extra_headers(extra);
        return result;
 }
@@ -1448,7 +1448,8 @@ N_("Warning: commit message did not conform to UTF-8.\n"
 int commit_tree_extended(const char *msg, size_t msg_len,
                         const struct object_id *tree,
                         struct commit_list *parents, struct object_id *ret,
-                        const char *author, const char *sign_commit,
+                        const char *author, const char *committer,
+                        const char *sign_commit,
                         struct commit_extra_header *extra)
 {
        int result;
@@ -1481,7 +1482,9 @@ int commit_tree_extended(const char *msg, size_t msg_len,
        if (!author)
                author = git_author_info(IDENT_STRICT);
        strbuf_addf(&buffer, "author %s\n", author);
-       strbuf_addf(&buffer, "committer %s\n", git_committer_info(IDENT_STRICT));
+       if (!committer)
+               committer = git_committer_info(IDENT_STRICT);
+       strbuf_addf(&buffer, "committer %s\n", committer);
        if (!encoding_is_utf8)
                strbuf_addf(&buffer, "encoding %s\n", git_commit_encoding);
 
index 008a0fa4a01d06c0e191e5988823ff630931d30d..8f4227ae5c232486eb3217c71131089b38a92ec8 100644 (file)
--- a/commit.h
+++ b/commit.h
@@ -316,10 +316,9 @@ int commit_tree(const char *msg, size_t msg_len,
 
 int commit_tree_extended(const char *msg, size_t msg_len,
                         const struct object_id *tree,
-                        struct commit_list *parents,
-                        struct object_id *ret, const char *author,
-                        const char *sign_commit,
-                        struct commit_extra_header *);
+                        struct commit_list *parents, struct object_id *ret,
+                        const char *author, const char *committer,
+                        const char *sign_commit, struct commit_extra_header *);
 
 struct commit_extra_header *read_commit_extra_headers(struct commit *, const char **);
 
diff --git a/ident.c b/ident.c
index e666ee4e598eb7de70b524bd56c7d04a27549971..7cbf223350f9f023aeb5861a114ea608fa7b4af4 100644 (file)
--- a/ident.c
+++ b/ident.c
@@ -361,11 +361,15 @@ N_("\n"
 const char *fmt_ident(const char *name, const char *email,
                      enum want_ident whose_ident, const char *date_str, int flag)
 {
-       static struct strbuf ident = STRBUF_INIT;
+       static int index;
+       static struct strbuf ident_pool[2] = { STRBUF_INIT, STRBUF_INIT };
        int strict = (flag & IDENT_STRICT);
        int want_date = !(flag & IDENT_NO_DATE);
        int want_name = !(flag & IDENT_NO_NAME);
 
+       struct strbuf *ident = &ident_pool[index];
+       index = (index + 1) % ARRAY_SIZE(ident_pool);
+
        if (!email) {
                if (whose_ident == WANT_AUTHOR_IDENT && git_author_email.len)
                        email = git_author_email.buf;
@@ -421,25 +425,25 @@ const char *fmt_ident(const char *name, const char *email,
                        die(_("name consists only of disallowed characters: %s"), name);
        }
 
-       strbuf_reset(&ident);
+       strbuf_reset(ident);
        if (want_name) {
-               strbuf_addstr_without_crud(&ident, name);
-               strbuf_addstr(&ident, " <");
+               strbuf_addstr_without_crud(ident, name);
+               strbuf_addstr(ident, " <");
        }
-       strbuf_addstr_without_crud(&ident, email);
+       strbuf_addstr_without_crud(ident, email);
        if (want_name)
-                       strbuf_addch(&ident, '>');
+               strbuf_addch(ident, '>');
        if (want_date) {
-               strbuf_addch(&ident, ' ');
+               strbuf_addch(ident, ' ');
                if (date_str && date_str[0]) {
-                       if (parse_date(date_str, &ident) < 0)
+                       if (parse_date(date_str, ident) < 0)
                                die(_("invalid date format: %s"), date_str);
                }
                else
-                       strbuf_addstr(&ident, ident_default_date());
+                       strbuf_addstr(ident, ident_default_date());
        }
 
-       return ident.buf;
+       return ident->buf;
 }
 
 const char *fmt_name(enum want_ident whose_ident)
index 6fd2674632bb2a524e22536e22658dbb3d06d6c3..968a2d4ef36d39b217a6e5847957bd145fdb8422 100644 (file)
@@ -1408,8 +1408,8 @@ static int try_to_commit(struct repository *r,
 
        reset_ident_date();
 
-       if (commit_tree_extended(msg->buf, msg->len, &tree, parents,
-                                oid, author, opts->gpg_sign, extra)) {
+       if (commit_tree_extended(msg->buf, msg->len, &tree, parents, oid,
+                                author, NULL, opts->gpg_sign, extra)) {
                res = error(_("failed to write commit object"));
                goto out;
        }