1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-04-27 10:35:08 +02:00

am: stop exporting GIT_COMMITTER_DATE

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>
This commit is contained in:
Phillip Wood 2020-08-17 18:40:01 +01:00 committed by Junio C Hamano
parent ef484add9f
commit e8cbe2118a
6 changed files with 51 additions and 27 deletions

View 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);
committer = fmt_ident(state->committer_name,
state->author_email, WANT_COMMITTER_IDENT,
state->ignore_date ? NULL
: state->author_date,
IDENT_STRICT);
if (commit_tree(state->msg, state->msg_len, &tree, parents, &commit,
author, state->sign_commit))
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");

View 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"));
}

View File

@ -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);

View File

@ -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 **);

24
ident.c
View File

@ -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)

View 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;
}