summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--builtin/am.c30
-rw-r--r--builtin/commit.c4
-rw-r--r--commit.c11
-rw-r--r--commit.h7
-rw-r--r--ident.c24
-rw-r--r--sequencer.c4
6 files changed, 52 insertions, 28 deletions
diff --git a/builtin/am.c b/builtin/am.c
index e3dfd93c25..896cd0f827 100644
--- a/builtin/am.c
+++ b/builtin/am.c
@@ -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");
diff --git a/builtin/commit.c b/builtin/commit.c
index d3e7781e65..2785344fed 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -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"));
}
diff --git a/commit.c b/commit.c
index c7099daeac..fb63c22cc1 100644
--- 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);
diff --git a/commit.h b/commit.h
index 008a0fa4a0..8f4227ae5c 100644
--- 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 e666ee4e59..7cbf223350 100644
--- 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)
diff --git a/sequencer.c b/sequencer.c
index 6fd2674632..968a2d4ef3 100644
--- a/sequencer.c
+++ b/sequencer.c
@@ -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;
}